2.java openCV4.x 入门-hello OpenCV

2024-04-01 17:44
文章标签 java 入门 opencv hello opencv4

本文主要是介绍2.java openCV4.x 入门-hello OpenCV,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

专栏简介

💒个人主页
📰专栏目录

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

我们唯一拥有的就是今天,唯一能把握的也是今天
建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 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 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());//创建带颜色的矩阵 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通道,在这里第四通道代表的透明度

这篇关于2.java openCV4.x 入门-hello OpenCV的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867762

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2