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

相关文章

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.