2.java openCV4.x 入门-hello OpenCV

本文介绍了OpenCV的基本概念,包括jar包的作用,如何表示和处理图像,以及Mat类的构造函数和CvType的数据类型。内容涵盖了环境搭建、图像数据结构以及Mat对象的创建和使用。
摘要由CSDN通过智能技术生成
专栏简介

💒个人主页
📰专栏目录

点击上方查看更多内容
📖心灵鸡汤📖

我们唯一拥有的就是今天,唯一能把握的也是今天
建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 1.环境搭建
⬇️ 3.数据类型(CvType)与Scalar


   今天就是简单的搭建下项目,了解第一个类,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 0l0 1...l0 N-1
l1 0l1 1...l1 N-1
............
lM-1 0lM-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());

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

输出信息说明

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要喷香水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值