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学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows