Android平台OpenCV入门

一、导入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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件工程导论(四)软件编码测试与维护

一、软件编程 1.1良好的编程习惯 变量命名有意义并且使用统一的命名规则 编写自文档代码(序言性注释 or 行内注释) 提前进行可维护性考量(可以用常量的方式存在的数值最好以变量的方式存在) 良好的视觉安排可以提高代码的可读性(…

SOLIDWORKS技巧培训-绘制零件滚花的两种方法

最近常有朋友咨询SolidWorks零件如何做滚花的效果,下面给大家整理了绘制零件滚花的一个培训教程: 作为机械设计师,滚花应该都不陌生,真要说起来,滚花绘制其实也不算难,跟着我们一步一步来,应该…

ThreeJS 炫酷特效旋转多面体Web页 Demo 01《ThreeJS 炫酷特效制作》

本案例为一个 threejs 的特效网页,大小球体进行包裹,外球体为透明材质,但是进行了线框渲染,使其能够通过外球踢查看其内球体。 注:案例参考源于互联网,在此做代码解释,侵删 本案例除 ThreeJS 外…

chatgpt赋能python:Python如何分割列表

Python如何分割列表 介绍 在Python编程中,列表是一种非常常见的数据类型。有时候我们需要将一个大的列表分割成几个小的列表,以便更好地处理数据。Python提供了多种方法来实现这个目的。在本文中,我们将介绍Python中如何分割列表的几种方法…

活动预告 | 中国数据库联盟(ACDU)中国行定档深圳,一起揭秘数据库前沿技术

在当今数字化时代,数据库是各行各业中最核心的信息管理系统之一。随着技术的飞速发展,数据库领域也不断涌现出新的前沿技术和创新应用。数据库运维和开发人员需要紧跟前沿技术,才能保持竞争力,并实现更高效、更智能、更人性化的应…

pytorch实战 -- 神经网络

softmax的基本概念 交叉熵损失函数 模型训练和预测 在训练好softmax回归模型后,给定任一样本特征,就可以预测每个输出类别的概率。通常,我们把预测概率最大的类别作为输出类别。如果它与真实类别(标签)一致&#xff0…

Java 数组

文章目录 一、Java 数组总结 一、Java 数组 Java 语言中提供的数组是用来存储固定大小的同类型元素。 你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number0,number1,…,number99。 Java 数组的声明、…

Linux内存初始化-启动阶段的内存初始化

本文代码基于ARM64平台, Linux kernel 5.15 在加载kernel 之前, kernel对于系统是有一定要求的,明确规定了boot阶段必须要把MMU关闭: arch/arm64/kernel/head.S/** Kernel startup entry point.* ---------------------------** The require…

黑马Redis视频教程实战篇(六)

目录 一、附近商户 1.1、GEO数据结构的基本用法 1.2、导入店铺数据到GEO 1.3、实现附近商户功能 二、用户签到 2.1、BitMap功能演示 2.2、实现签到功能 2.3、签到统计 2.4、关于使用bitmap来解决缓存穿透的方案 三、UV统计 3.1、HyperLogLog 3.2、测试百万数据的统…

【HarmonyOS】初识低代码平台开发元服务

【关键字】 HarmonyOS、低代码平台、元服务开发、拖拽式开发 【写在前面】 今天要分享的是HarmonyOS中的低代码开发相关的内容,低代码开发是DevEco Studio提供的一种UI界面可视化的构建方式,通过图形化的自由拖拽数据的参数化配置,可以快速…

2419286-92-1,Sulfo-Cy5.5 NHS ester,磺酸基Cyanine5.5-活性酯,用于标记抗体

Sulfo-Cyanine5.5 NHS ester,sulfo Cy5.5(Et) NHS,sulfo Cy5.5 SE,磺酸基Cy5.5-活性酯 (文章资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ 产品结构式: 产品规格: 1…

SAP-MM-发票-采购附加成本处理简介

一.采购附加成本处理: 原材料的采购成本包括采购成本(采购单价*采购数量)和相关采购附加成本(运输费、保险费、报关费、仓储费、滞期费、租船费、码头费及代理费等费用),对于采购附加成本主要有…

基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建

基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建 文章目录 基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建1. 传统推荐系统模型2. 协同过滤算法3. 基于双视角图表示学习算法的模型构建3.1 数据输入3.2 双视角交互图的构建3.3 混合偏好传播策略3.4 对于双向意…

git使用X篇_2_Git全套教程IDEA版(git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容)

本文是根据以下视频及网上总结进行更新后的介绍git使用的博文。包含了git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容。 笔记来源:【尚硅谷】5h打通Git全套教程IDEA版(涵盖GitHub\Gitee码云\GitLab) 文章目录 初识 Git0、内容…

ReadDataByIdentifier(0x22)服务

ReadDataByIdentifier(0x22)服务 ReadDataByIdentifier服务允许客户端从一个或多个dataIdentifiers标识的服务器请求数据记录值。 客户端请求消息包含一个或多个两字节的dataIdentifier值,用于标识服务器维护的数据记录 允许的dataIdentifie…

Vue3小兔鲜:组合式写法入门

Vue3&#xff1a;组合式写法入门 Date: May 11, 2023 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> imp…

Linux 高级篇-定制自己的Linux 系统

Linux 高级篇-定制自己的Linux 系统 基本介绍 通过裁剪现有Linux 系统(CentOS7.6)&#xff0c;创建属于自己的min Linux 小系统&#xff0c;可以加深我们对linux 的理解。利用centos7.6&#xff0c;搭建一个小小linux 系统, 很有趣。 基本原理 启动流程介绍&#xff1a; 制…

(转载)基于混合粒子群算法的TSP问题求解(matlab实现)

1 理论基础 标准粒子群算法通过追随个体极值和群体极值完成极值寻优&#xff0c;虽然操作简单&#xff0c;且能够快速收敛&#xff0c;但是随着迭代次数的不断增加&#xff0c;在种群收敛集中的同时&#xff0c;各粒子也越来越相似&#xff0c;可能在局部最优解周边无法跳出。…

2023/5/29总结

abstract修饰符 抽象类就是当类和类之间有相同特征时&#xff0c;将这些共同的特征提取出来&#xff0c;形成的就是抽象类。 抽象类的特点&#xff1a; 抽象类和抽象方法必须使用abstract 关键字修饰&#xff1a;publicabstract class 类名 / public abstract void eat();抽象…

测评补单操作在美客多店铺及产品优化中的决定性角色:深度解读

许多经营美客多平台的商家有一种观念&#xff0c;他们认为美客多平台的规则与亚马逊有所区别。在美客多上&#xff0c;店铺比产品更重要&#xff0c;而且平台的竞争相对较小。因此&#xff0c;他们认为在美客多平台进行补单操作是不必要的。 然而&#xff0c;是否真的如此呢&a…