Android平台OpenCV入门

news2024/11/25 3:58:34

一、导入OpenCV

别忘记把libopencv_java3.so添加进来。

二、初始化

OpenCVLoader.initDebug();

三、常用方法

1. CvType 数据类型

以CV_64FC2为例,64指64位,F指浮点数,C指通道,2为2通道。

数值具体类型取值范围
CV_8U8 位无符号整数(0……255)
CV_8S8 位符号整数(-128……127)
CV_16U16 位无符号整数(0……65535)
CV_16S16 位符号整数(-32768……32767)
CV_32S32 位符号整数(-2147483648……2147483647)
CV_32F32 位浮点数(-FLT_MAX ………FLT_MAX,INF,NAN)
CV_64F64 位浮点数(-DBL_MAX ……….DBL_MAX,INF,NAN)
public static final int CV_8UC1 = CV_8UC(1);
public static final int CV_8UC2 = CV_8UC(2);
public static final int CV_8UC3 = CV_8UC(3);
public static final int CV_8UC4 = CV_8UC(4);
public static final int CV_8SC1 = CV_8SC(1);
public static final int CV_8SC2 = CV_8SC(2);
public static final int CV_8SC3 = CV_8SC(3);
public static final int CV_8SC4 = CV_8SC(4);
public static final int CV_16UC1 = CV_16UC(1);
public static final int CV_16UC2 = CV_16UC(2);
public static final int CV_16UC3 = CV_16UC(3);
public static final int CV_16UC4 = CV_16UC(4);
public static final int CV_16SC1 = CV_16SC(1);
public static final int CV_16SC2 = CV_16SC(2);
public static final int CV_16SC3 = CV_16SC(3);
public static final int CV_16SC4 = CV_16SC(4);
public static final int CV_32SC1 = CV_32SC(1);
public static final int CV_32SC2 = CV_32SC(2);
public static final int CV_32SC3 = CV_32SC(3);
public static final int CV_32SC4 = CV_32SC(4);
public static final int CV_32FC1 = CV_32FC(1);
public static final int CV_32FC2 = CV_32FC(2);
public static final int CV_32FC3 = CV_32FC(3);
public static final int CV_32FC4 = CV_32FC(4);
public static final int CV_64FC1 = CV_64FC(1);
public static final int CV_64FC2 = CV_64FC(2);
public static final int CV_64FC3 = CV_64FC(3);
public static final int CV_64FC4 = CV_64FC(4);

2. Mat的加载方式

2.1 文件形式加载——Imgcodecs.imread

Mat mat = Imgcodecs.imread(filename); // 默认转成bgr格式,即Imgcodecs.IMREAD_COLOR
Mat mat = Imgcodecs.imread(filename, flags);

参数:filename
输入可为相对路径也可为绝对路径,自动通过后缀名识别文件的格式。

支持读取的图像格式有:

Windows bitmaps - *.bmp, *.dib (always supported)
JPEG files - *.jpeg, *.jpg, *.jpe (see the Note section)
JPEG 2000 files - *.jp2 (see the Note section)
Portable Network Graphics - *.png (see the Note section)
WebP - *.webp (see the Note section)
Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
PFM files - *.pfm (see the Note section)
Sun rasters - *.sr, *.ras (always supported)
TIFF files - *.tiff, *.tif (see the Note section)
OpenEXR Image files - *.exr (see the Note section)
Radiance HDR - *.hdr, *.pic (always supported)
Raster and Vector geospatial data supported by GDAL (see the Note section)

**参数:**flags,当不写时,默认为Imgcodecs.IMREAD_COLOR

枚举名定义解释
-1IMREAD_UNCHANGEDIf set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.如果设置,则按原样返回加载的图像(使用Alpha通道,否则会被裁剪)
0IMREAD_GRAYSCALEIf set, always convert image to the single channel grayscale image (codec internal conversion).如果设置,则始终将图像转换为单通道灰度图像(编解码器内部转换)
1IMREAD_COLORIf set, always convert image to the 3 channel BGR color image.如果设置,请始终将图像转换为3通道BGR彩色图像
2IMREAD_ANYDEPTHIf set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.如果设置,则在输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位
4IMREAD_ANYCOLORIf set, the image is read in any possible color format.如果设置,则以任何可能的颜色格式读取图像
8IMREAD_LOAD_GDALIf set, use the gdal driver for loading the image.如果设置,使用gdal驱动程序加载图像
16IMREAD_REDUCED_GRAYSCALE_2If set, always convert image to the single channel grayscale image and the image size reduced 1/2.如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/2
17IMREAD_REDUCED_COLOR_2If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/2
32IMREAD_REDUCED_GRAYSCALE_4If set, always convert image to the single channel grayscale image and the image size reduced 1/4.如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/4
33IMREAD_REDUCED_COLOR_4If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/4
64IMREAD_REDUCED_GRAYSCALE_8If set, always convert image to the single channel grayscale image and the image size reduced 1/8.如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/8
65IMREAD_REDUCED_COLOR_8If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/8
128IMREAD_IGNORE_ORIENTATIONIf set, do not rotate the image according to EXIF’s orientation flag.如果设置,请不要根据EXIF的方向标志旋转图像

2.2 数组形式导入——mat.put

Mat mat = new Mat(height, width, CvType.CV_8UC1);
mat.put(0,0,bytes);

根据数组的存储格式和宽高导入,格式见前文 CvType 数据类型

2.3 YUV数组转mat(图像格式转换)——Imgproc.cvtColor

public static Mat nv21Mat(byte[] nv21, int width, int height) {
    Mat nv21Mat = new Mat(height*3/2,width,CvType.CV_8UC1);//按单通道位图构建mat
    int re =  nv21Mat.put(0,0,nv21);
    Mat mat = new Mat();
    Imgproc.cvtColor(nv21Mat , mat, Imgproc.COLOR_YUV2BGR_NV21);
    return mat;
}

yuv格式的数组要先按单通道位图构建mat,再通过Imgproc.cvtColor()进行格式转换。

3. 存位图——Imgcodecs.imwrite

//存取16位单通道图
public static void saveShortToPng(short[] shortBytes, int width, int height, String path) {
    String mPath = path;
    Mat mat = new Mat(height, width, CvType.CV_16UC1);
    mat.put(0,0,shortBytes);
    Imgcodecs.imwrite(mPath,mat);
}

可根据文件名的后缀自行保存。

4. 图像缩放——Imgproc.resize

public static byte[] resizeByte(byte[] sBytes, int width, int height) {
    byte[] bytes = new byte[sBytes.length];
    System.arraycopy(sBytes,0,bytes,0,sBytes.length);
    Mat src = new Mat(height, width, CvType.CV_8UC1);
    src.put(0,0,bytes);
    Imgproc.resize(src, src, new Size(src.width()*0.5, src.height()*0.5));
    byte[] dBytes = new byte[width/2 * height/2];
    src.get(0,0,dBytes);
    return dBytes;
}

5. 抠图——mat.submat

public static void saveFace(byte[] nv21, int[] position, int width, int height, String path){
    //YUV 转 Mat
    Mat matNv21 = new Mat(height*3/2,width,CvType.CV_8UC1);//按单通道位图构建mat
    int re =  matNv21.put(0,0,nv21);
    Mat matBgr = new Mat();
    Imgproc.cvtColor(matNv21 , matBgr, Imgproc.COLOR_YUV2BGR_NV21);//nv21 to bgr
    //Android自带也有个Rect方法,要区分开
    org.opencv.core.Rect rect = new org.opencv.core.Rect(position[0], position[1], position[2], position[3]);
    //抠图
    Mat sub = matBgr.submat(rect); 
    Mat mat = new Mat();
    Size size = new Size(position[2],position[3]);
    Imgproc.resize(sub, mat, size);//将人脸进行截图并保存
    String mPath = path;
    Imgcodecs.imwrite(mPath,mat);
}

6. 图像旋转

/**
* 图像旋转
*/
public static byte[] rotateByte(byte[] sBytes, int width, int height) {
    byte[] dBytes = new byte[sBytes.length];
    Mat mat = new Mat(height, width, CvType.CV_8UC1);//单通道位图
    mat.put(0,0,sBytes);
    Core.transpose(mat,mat);// 转置(行列互换),即顺时针旋转90度且左右镜像
    Core.flip(mat, mat, 1);// 1:左右镜像;0:上下镜像;-1:旋转180度
    mat.get(0,0,dBytes);
    return dBytes;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.30-cloud support -learning

文章目录 namespaceaccessNSG(network security group )UDR (User-Defined Routing)Azure Firewall namespace Namespaces are defined at the Kubernetes cluster level, so each namespace is unique throughout the cluster. I…

C语言笔记 | 数据结构入门指南

文章目录 0x00 前言 0x01 百鸡百钱 0x02 借书方案知多少 0x03 持续更新 0x04 参考文献 0x05 总结 0x00 前言 写这篇《C语言笔记 | 数据结构入门指南》主要是为了帮助更多的编程爱好者打开数据结构的大门,同时也是为了自我编程水平能力的提升。在深奥的数据结构…

正交实验进行方差分析

一、案例介绍 想要从某种草药中提取植物酚,利用专业知识发现可能有三个条件会影响植物酚的提取,每个条件有三个水平,想要通过实验,寻找植物酚的最佳提取条件,其中提取植物酚的参考标准为植物酚的含量(案例…

在线原型设计是什么?8款在线原型工具助你高效设计!

原型设计是产品经理、设计师和开发工程师沟通最初的产品设想的重要工具。 在线原型通过云端的方式具象化地呈现产品内容、结构及粗略的布局,说明用户将如何与产品进行交互,搭建了产品经理、设计师和开发工程师沟通的桥梁,帮助产研团队减少信…

什么是深度数据包检测 (DPI)

随着混合工作成为生活的正常部分,新技术每天都在使用,同时总是通过网络传输数据的山体滑坡。通过高正常运行时间、快速解决问题和富有洞察力的情报提供无缝的用户体验至关重要。为此,对网络进行端到端监控非常重要。 深度数据包检测是一种用…

技术招聘漫谈 | 正在招Golang工程师的你,赶快收藏这份识人秘籍!

各位技术面试官,欢迎来到新一期的技术招聘漫谈专栏。 在前两期的专栏中,我们解析了前端工程师(点击此处回顾)以及 Java 工程师(点击此处回顾)这两个常见技术岗位的招聘技巧。 今天,我们想把目…

了解和使用 Docker 镜像仓库

前言 在上文 《了解和使用 Docker》 之后,反响不错,也上了热榜。本来是想直接整理一下容器编排工具 Docker Swarm 和 K8s 博文的,但是半路杀出了这个活动😂,为表敬意,先参与一波吧。 本文主要介绍一下容…

【MyBatis】MyBatis中#{}与${}的区别是什么?

文章目录 前言一、彻底理解SQL注入二、关于 # { }三、关于$ { }四、Mybatis中#{}与${}的区别五、代码案例使用#{}案例使用$ {}案例 前言 在开发中使用Mybatis经常使用到#{}与${},二者区别是?来总结一下。 在mybatis中动态 sql 是其主要特性之一&#x…

什么是现代化智慧型档案馆

近日,智慧档案馆建设的新闻热度不断攀升,你知道智慧档案馆是什么吗? ​智慧档案馆是指运用现代信息技术手段,对传统档案馆进行数字化转型,实现档案数字化存储、智能化检索和共享服务。通过数字化转型,不仅可…

< 免费体验ChatGPT:免费且好用,不用使用 “ 魔法 ”,一款功能强大且轻便的插件!webTab! >

免费且好用,不用使用 “ 魔法 ”,一款功能强大且轻便的插件!webTab! 👉 前言👉 功能演示图👉 使用经验分享👉 如何安装webTab插件呢?往期内容 💨 tips&#x…

(转载)基于量子遗传算法的函数寻优算法(matlab实现)

8.1 理论基础 8.1.1 量子遗传算法概述 量子遗传算法(quantum genetic algorithm,QGA)是量子计算与遗传算法相结合的产物,是一种新发展起来的概率进化算法。遗传算法是处理复杂优化问题的一种方法,其基本思想是模拟生物进化的优胜劣汰规则与染色体的交…

太优雅了,公司项目终于用上了Spring状态机

1、什么是状态机 1.1 什么是状态 先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限…

【HTML 往日冒险 01】标签 元素 属性 注释 文本格式化 颜色 CSS

HTML 往日冒险日志01 说在前面重新开始基础标签 basic元素 elements属性 attributes标题,水平线以及注释 headings段落与折行 paragraphs样式 html_styles文本格式化 formatting注释 comments颜色 colorsCSS 说在前面 HTML 对于现在的我来说,熟悉又陌生…

实验室信息系统源码,LIS源码

实验室信息系统源码,LIS源码 技术细节: SaaS架构的Client/Server应用 体系结构:Client/Server架构 客户端:WPFWindows Forms 服务端:C# .Net 数据库:Oracle 接口技术:RESTful API HttpW…

深度学习环境搭建笔记(一):detectron2安装过程

文章目录 第一步 安装python第二步 安装pycocotools第三步 安装Torch和Torchvision第四步 安装fvcore第五步 安装detectron2第六步 开始安装 第一步 安装python cuda 10.2 环境下 conda create -n detectron python3.7 第二步 安装pycocotools 下载对应的pycocotools-window…

ESXI7.0安装Windows Server 2008 R2

1:使用VC正常建立虚拟机,前四项根据自己的时间情况选择,兼容性用默认的ESXI7.0U2及更高版本。 2:客户机操作系统选择Windows,客户机操作系统版本选择我们想安装的Windows Server 2008 R2(64位) 3:自定义硬件…

LINUX使用问题记录

LINUX使用问题记录 linux 安装pylab报错 sudo apt-get install python3-matplotliblinux换源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bakvim 编辑 sources.list : $ sudo vim /etc/apt/sources.list 将 sources.list 中的内容替换如下 注意&#…

Vulkan Tutorial 7 纹理贴图

目录 23 图像 图片库 暂存缓冲区 纹理图像 布局转换 将缓冲区复制到图像上 准备纹理图像 传输屏障掩码 清除 24 图像视图和采样器 纹理图像视图 采样器 Anisotropy 设备特征 25 组合图像采样器 更新描述符 纹理坐标系 着色器 23 图像 添加纹理将涉及以下步骤&am…

如何快速手撕单例类?一文教会你

👨‍🎓作者:bug菌 ✏️博客:CSDN、掘金、infoQ、51CTO等 🎉简介:CSDN|阿里云|华为云|51CTO等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12…

数据结构与算法基础-学习-24-遍历之DFS(深度优先搜索)和BFS(广度优先搜索)

目录 一、遍历定义 二、遍历实质 三、DFS 四、BFS 五、宏定义 六、自定义类型 七、函数实现 1、DFS(邻接矩阵实现) 2、DFS(邻接表实现) 3、BFS(邻接矩阵实现) 4、BFS(邻接表实现&…