2.java openCV4.x 入门-hello OpenCV

|------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 专栏简介 |||
| 💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 我们唯一拥有的就是今天,唯一能把握的也是今天 建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫 | 🧭文章导航🧭 ⬆️1.环境搭建 ⬇️3.数据类型(CvType)与Scalar |

hello OpenCV

今天就是简单的搭建下项目,了解第一个类,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)表示像素亮度。

图像数据在计算机内存中的存储顺序为以图像最左上点(也可能是最左下点)开始,存储如下图所示

|----------|----------|-----|------------|
| l~0 0~ | l~0 1~ | ... | l~0 N-1~ |
| l~1 0~ | l~1 1~ | ... | l~1 N-1~ |
| ... | ... | ... | ... |
| l~M-1 0~ | l~M-1 1~ | ... | l~M-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需要调用类库,这里提供两种调用方式。

方式一:直接读取类库

java 复制代码
System.load("D:\\OpenCV\\opencv\\build\\java\\x64\\opencv_java460.dll");

方式二:loadLibrary

java 复制代码
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

这种方式需要将opencv_java480.dll放在jdk的bin目录下。

4. 示例代码

Mat提供了一系列的构造方法,可以根据自己需要创建mat对象,如下所示

java 复制代码
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());

        //创建带颜色的矩阵 BGR
        Mat 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();
    }
}

输出信息说明

bash 复制代码
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通道,在这里第四通道代表的透明度

相关推荐
孤寂大仙v3 分钟前
【C++】STL----list常见用法
开发语言·c++·list
蜗牛^^O^28 分钟前
Docker和K8S
java·docker·kubernetes
她似晚风般温柔7891 小时前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
从心归零1 小时前
sshj使用代理连接服务器
java·服务器·sshj
咩咩大主教1 小时前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
FuLLovers1 小时前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
everyStudy2 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
luthane2 小时前
python 实现average mean平均数算法
开发语言·python·算法
Ylucius3 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习