专栏简介 | ||
💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 我们唯一拥有的就是今天,唯一能把握的也是今天 建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫 | 🧭文章导航🧭 ⬆️ 1.环境搭建 ⬇️ 3.数据类型(CvType)与Scalar |
hello OpenCV
- 一、jar包说明
- 二、图像的表示
- 三、搭建项目
- 1. 创建maven工程
- 2. 创建普通的java工程
- 3. 调用类库的两种方式
- 4. 示例代码
- 5.Mat对象构造函数说明
- 6.CvType简单了解
今天就是简单的搭建下项目,了解第一个类,Mat类,它是一个图像类,也是一个矩阵类。本节了解下它的几个构造函数
一、jar包说明
包名 | 说明 |
org.opencv.calib3d | 用于相机校准和三维重建 |
org.opencv.core | 核心包,提供了OpenCV库中的基础功能和操作,是其他更高级的图像处理和分析功能的基础 |
org.opencv.dnn | 深度学习网络模块 |
org.opencv.features2d | 提供了用于检测和描述图像特征的类和函数 |
org.opencv.highgui | 用于创建窗口、在窗口中显示图像简单操作,复杂操作可使用其他的Java库,比如Swing或JavaFX |
org.opencv.imgcodecs | 读取和保存图像 |
org.opencv.imgproc | 图像处理。这个包包含了一系列用于对图像进行操作和转换的功能 |
org.opencv.ml | 机器学习相关的功能 |
org.opencv.objdetect | 目标检测模块 |
org.opencv.osgi | 在 OSGi(Open Service Gateway initiative)环境中使用 OpenCV 库 |
org.opencv.photo | 主要用于图像修复、色彩校正和图像对齐等任务 |
org.opencv.utils | 提供了一些实用工具和辅助函数 |
org.opencv.video | 用于视频处理和计算机视觉任务 |
org.opencv.videoio | 用于处理视频文件的读取和写入 |
二、图像的表示
在之前我们先简单的了解下图像,如下图所示,对我们来说,他是一个兔子的彩色图像,但是对于计算机来说,它只是一堆亮度各异的点。这副尺寸为 800× 500 的图像可以用一个 800 × 500 的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮
我们将它放大之后,可以看到亮度各异的点
一般来说,灰度图用 2 维矩阵表示,彩色图像用 3 维矩阵(M × N × 3)表示。目前我们见到的大部分图像都是用无符号 8 位整数(类型为 CV_8U)表示像素亮度。
图像数据在计算机内存中的存储顺序为以图像最左上点(也可能是最左下点)开始,存储如下图所示
l0 0 | l0 1 | ... | l0 N-1 |
l1 0 | l1 1 | ... | l1 N-1 |
... | ... | ... | ... |
lM-1 0 | lM-1 1 | ... | lM-1 N-1 |
l m n l_{mn} lmn 表示第 m m m行 n n n 列的像素值。如果是多通道图像,比如 RGB 图像,则每个像素用三个字节表示。在 OpenCV 中,RGB 图像的通道顺序为 BGR ,存储如下
B 00 B_{00} B00 | G 00 G_{00} G00 | R 00 R_{00} R00 | B 01 B_{01} B01 | G 01 G_{01} G01 | R 01 R_{01} R01 | … |
---|---|---|---|---|---|---|
B 10 B_{10} B10 | G 10 G_{10} G10 | R 10 R_{10} R10 | B 11 B_{11} B11 | G 11 G_{11} G11 | R 11 R_{11} R11 | … |
… | … | … | … | … | … | … |
三、搭建项目
1. 创建maven工程
maven工程搭建可参考windows安装OpenCV及helloCV
2. 创建普通的java工程
我们搭建一个普通的java工程, 如下所示👇️:
1.File➡️New➡️Project➡️New Project
2.设置工程信息,然后创建即可
3.创建完成后,将opencv-480.jar添加到项目中,如下所示
3. 调用类库的两种方式
使用openCV需要调用类库,这里提供两种调用方式。
方式一:直接读取类库
System.load("D:\\OpenCV\\opencv\\build\\java\\x64\\opencv_java460.dll");
方式二:loadLibrary
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
这种方式需要将opencv_java480.dll
放在jdk的bin目录下。
4. 示例代码
Mat提供了一系列的构造方法,可以根据自己需要创建mat对象,如下所示
public class MatExamples {public static void main(String[] args) {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);//创建空矩阵Mat mat = new Mat();System.out.println("mat = " + mat);System.out.println("mat.dump() =\n " + mat.dump());//创建3x2的单通道8位无符号整数类型矩阵Mat mat1 = new Mat(3, 2, CvType.CV_8UC1);System.out.println("mat1.dump() = \n" + mat1.dump());//创建3x3的单通道8位无符号整数类型矩阵Mat mat2 = new Mat(new Size(4, 4), CvType.CV_8UC1);System.out.println("mat2.dump() = \n" + mat2.dump());//创建3X3的单通道的8位无符号整数类型矩阵int [] size={2,3};Mat mat3 = new Mat(size, CvType.CV_8UC1);System.out.println("mat3.dump() = \n" + mat3.dump());//创建带颜色的矩阵 BGRMat mat4 = new Mat(3, 3, CvType.CV_8UC3, new Scalar(100, 200, 255));System.out.println("mat4.dump() = \n" + mat4.dump());//显示矩阵Mat mat5 = new Mat(new Size(200, 200), CvType.CV_8UC3, new Scalar(255, 0, 0));HighGui.imshow("mat",mat5);HighGui.waitKey();}
}
输出信息说明
mat = Mat [ -1*-1*CV_8UC1, isCont=false, isSubmat=false, nativeObj=0x17a91e47ca0, dataAddr=0x0 ]
这段信息表示创建了一个Mat对象,该对象是单通道的8位无符号整型像素值。isCont为false表示Mat对象不是连续的,isSubmat为false表示Mat对象不是子矩阵。nativeObj和dataAddr分别表示对象在内存中的地址和数据地址。
5.Mat对象构造函数说明
以下Mat的部分构造方法进行简要说明👇
类 | 用法 | 说明 |
Mat | 一个通用的矩阵类,同时也是一个图像类,可以用来创建和操作多维矩阵 | |
Mat(int rows, int cols, int type) | 创建行数为 rows,列数为 cols,类型为 type 的图像 | |
Mat(int rows, int cols, int type, ByteBuffer data) | 创建行数为 rows,列数为 cols,类型为 type ,数据为data 的图像(不创建图像数据所需内存,而是直接使用 data 所指内存) | |
Mat(int rows, int cols, int type, ByteBuffer data, long step) | 创建行数为 rows,列数为 cols,类型为 type ,数据为data ,行步长为step的图像(不创建图像数据所需内存,而是直接使用 data 所指内存) | |
Mat(Size size, int type) | 创建大小为 size,类型为 type 的图像(size指定width和height) | |
Mat(int[] sizes, int type) | 创建宽x长y,类型为 type 的图像 (例:int[] sizes = {10,5},表示创建一个x为5y为10的图像) | |
Mat(int rows, int cols, int type, Scalar s) | 创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始 化为值 s | |
Mat(Size size, int type, Scalar s) | 创建大小为 size,类型为 type 的图像,并将所有元素初始 化为值 s | |
Mat(int[] sizes, int type, Scalar s) | 创建宽x长y,类型为 type 的图像 ,并将所有元素初始 化为值 s(例:int[] sizes = {10,5},表示创建一个x为5y为10的图像) | |
Mat(Mat m, Range rowRange, Range colRange) | 创建的新图像为 m 的一部分,具体的范围由 rowRange 和 colRange 指 定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据 | |
Mat(Mat m, Range rowRange) | 创建的新图像为 m 的一部分,具体的范围由 rowRange 定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据 | |
Mat(Mat m, Rect roi) | 创建的新图像为 m 的一部分,具体的范围 roi 指定,此构造函数也不进 行图像数据的复制操作,新图像与 m 共用图像数据 |
6.CvType简单了解
我们先简单了解下数据类型。打开CvType类可以发现type类型有CV_8UC1,CV_16SC3 ,CV_32FC4等类型,其中8,16,32表示位,U表示无符号整数,S表示有符号整数,F表示浮点数,C表示通道,C1表示一个通道的图像,C3表示3个通道的图像。
如果需要更多的通道,可以采用CV_8UC(ch)
的方式,例如
CV_8UC(2)表示8位无符号整数2通道的图像
其它:
通过源码可以发现存在4通道,在这里第四通道代表的透明度