OpenCV的核心数据结构

  1. Mat类
  • Mat类是OpenCV中最重要的数据结构之一,用于表示图像和矩阵数据。Mat类封装了多维数组,并提供了多种操作图像数据的方法和函数。
    Mat`类的主要属性和方法
    • 构造函数:
      • Mat():创建一个空的Mat对象。
      • Mat(int rows, int cols, int type):创建一个指定大小和类型的Mat对象。
      • Mat(Size size, int type):根据给定的大小和类型创建一个Mat对象。
      • Mat(Mat m, Range rowRange, Range colRange):从现有的Mat对象中创建一个子矩阵。
    • 主要方法:
      • size():返回矩阵的大小(行数和列数)。
      • type():返回矩阵的类型(如CV_8UC3,表示8位无符号三通道图像)。
      • channels():返回矩阵的通道数。
      • depth():返回矩阵中元素的位深度。
      • clone():创建一个包含相同数据的新Mat对象。
      • copyTo(Mat m):将当前Mat对象的数据复制到另一个Mat对象中。
      • convertTo(Mat m, int rtype):将当前Mat对象转换为指定类型,并存储在另一个Mat对象中。
      • at(int row, int col):访问矩阵中的元素。
        Mat`类的应用场景
    1. 图像存储:

      • Mat类最常见的用途是存储图像数据,可以是灰度图、彩色图像或多通道图像。
    2. 图像处理:

      • 使用Mat类,可以进行各种图像处理操作,如滤波、变换、阈值处理等。
    3. 矩阵计算:

      • Mat类也可以用于矩阵计算和线性代数运算。
        示例代码
        以下代码展示了如何使用Mat类来创建和操作图像数据。
        java复制代码import org.opencv.core.Core;
        import org.opencv.core.Mat;
        import org.opencv.core.CvType;
        import org.opencv.core.Scalar;
        import org.opencv.core.Size;
        import org.opencv.imgcodecs.Imgcodecs;
        import org.opencv.highgui.HighGui;

      public class MatExample {
      static {
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
      }

       public static void main(String[] args) {// 创建一个3x3的单通道矩阵Mat mat = new Mat(3, 3, CvType.CV_8UC1, new Scalar(0));System.out.println("Matrix: \n" + mat.dump());// 创建一个指定大小和类型的矩阵,并用特定值初始化Mat matColor = new Mat(new Size(3, 3), CvType.CV_8UC3, new Scalar(255, 0, 0));System.out.println("Color Matrix: \n" + matColor.dump());// 读取图像并存储在Mat对象中Mat img = Imgcodecs.imread("image.jpg", Imgcodecs.IMREAD_COLOR);if (img.empty()) {System.out.println("Could not open or find the image!");return;}// 显示图像HighGui.imshow("Loaded Image", img);HighGui.waitKey();// 克隆图像Mat imgClone = img.clone();System.out.println("Cloned Image: \n" + imgClone.dump());// 转换图像类型Mat imgGray = new Mat();Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);System.out.println("Gray Image: \n" + imgGray.dump());// 访问和修改矩阵中的元素imgGray.put(0, 0, 128); // 将第一个像素的灰度值设置为128System.out.println("Modified Gray Image: \n" + imgGray.dump());}
      

      }

      import org.opencv.core.Core;
      import org.opencv.core.Mat;
      import org.opencv.imgcodecs.Imgcodecs;
      import org.opencv.imgproc.Imgproc;

      public class OpenCVExample {
      static {
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
      }

       public static void main(String[] args) {Mat image = Imgcodecs.imread("example.jpg");if (image.empty()) {System.out.println("Could not open or find the image!");return;}// 转换为灰度图像Mat grayImage = new Mat();Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);// 应用高斯滤波Mat blurredImage = new Mat();Imgproc.GaussianBlur(grayImage, blurredImage, new Size(15, 15), 0);// 保存结果Imgcodecs.imwrite("output.jpg", blurredImage);}
      

      }

  1. Point、Point2f、Point3f类

这些类用于表示二维和三维空间中的点。Point类通常用于整数坐标,Point2f和Point3f则用于浮点数坐标。

import org.opencv.core.Point;
import org.opencv.core.Point2f;public class PointExample {public static void main(String[] args) {Point point = new Point(10, 20);Point2f point2f = new Point2f(10.5f, 20.5f);System.out.println("Point: " + point);System.out.println("Point2f: " + point2f);}
}
  1. Size类

Size类用于表示图像的尺寸,包含宽度和高度两个属性。

import org.opencv.core.Size;public class SizeExample {public static void main(String[] args) {Size size = new Size(640, 480);System.out.println("Size: " + size);}
}
  1. Rect类

Rect类用于表示矩形区域,包含位置和大小两个属性。

import org.opencv.core.Rect;public class RectExample {public static void main(String[] args) {Rect rect = new Rect(50, 50, 200, 200);System.out.println("Rect: " + rect);}
}
  1. DMatch类

DMatch类在OpenCV中用于表示描述符匹配中的一个匹配对,是特征匹配算法的核心部分。特征匹配是计算机视觉中一种基本操作,广泛应用于图像拼接、目标识别和跟踪等任务。

DMatch类的主要属性

  • queryIdx:查询图像中描述符的索引。表示当前要匹配的特征点在查询图像中的位置。
  • trainIdx:训练图像中描述符的索引。表示在数据库或训练图像中找到的匹配特征点的位置。
  • imgIdx:图像索引(在多图像匹配中使用)。当在多个训练图像中搜索匹配时,用于标识当前匹配到的训练图像。
  • distance:两个特征点之间的距离,表示匹配的好坏程度,距离越小表示匹配越好。常用的距离度量方法包括欧氏距离和汉明距离,具体取决于特征描述符的类型。

DMatch类的应用场景

  1. 特征匹配:在图像配准和拼接中,通过匹配图像中的关键点来找到相同或相似的区域。
  2. 物体识别:通过匹配特征点来识别图像中的物体。
  3. 跟踪:在视频序列中,通过匹配连续帧中的特征点来实现目标跟踪。

示例代码

以下代码展示了如何使用DMatch类进行特征匹配。

java复制代码import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.core.MatOfDMatch;
import org.opencv.features2d.Features2d;
import org.opencv.features2d.DescriptorMatcher;
import org.opencv.features2d.ORB;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.highgui.HighGui;public class DMatchExample {static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static void main(String[] args) {// 加载两张待匹配的图像Mat img1 = Imgcodecs.imread("image1.jpg", Imgcodecs.IMREAD_GRAYSCALE);Mat img2 = Imgcodecs.imread("image2.jpg", Imgcodecs.IMREAD_GRAYSCALE);// 检查图像是否加载成功if (img1.empty() || img2.empty()) {System.out.println("Could not open or find the images!");return;}// 初始化ORB特征检测器ORB orb = ORB.create();// 检测特征点和计算描述符MatOfKeyPoint keypoints1 = new MatOfKeyPoint();MatOfKeyPoint keypoints2 = new MatOfKeyPoint();Mat descriptors1 = new Mat();Mat descriptors2 = new Mat();orb.detectAndCompute(img1, new Mat(), keypoints1, descriptors1);orb.detectAndCompute(img2, new Mat(), keypoints2, descriptors2);// 初始化描述符匹配器DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);// 进行匹配MatOfDMatch matches = new MatOfDMatch();matcher.match(descriptors1, descriptors2, matches);// 筛选出好的匹配点double maxDist = 0;double minDist = 100;for (DMatch match : matches.toArray()) {double dist = match.distance;if (dist < minDist) minDist = dist;if (dist > maxDist) maxDist = dist;}// 只保留好的匹配点MatOfDMatch goodMatches = new MatOfDMatch();for (DMatch match : matches.toArray()) {if (match.distance <= Math.max(2 * minDist, 30.0)) {goodMatches.push_back(new MatOfDMatch(match));}}// 绘制匹配结果Mat imgMatches = new Mat();Features2d.drawMatches(img1, keypoints1, img2, keypoints2, goodMatches, imgMatches);// 显示结果HighGui.imshow("Matches", imgMatches);HighGui.waitKey();}
}

6.Scalar

Scalar类在OpenCV中用于表示多通道值的类,经常用于表示颜色、权重或其他多维数据。它是一个简单的四元素容器(包含四个double类型的值),可以表示不同颜色通道的值,如BGR颜色(蓝、绿、红)或者灰度值。

Scalar类的主要属性和方法

  • 构造函数:
    • Scalar(double v0):构造一个只有一个通道的Scalar对象。
    • Scalar(double v0, double v1):构造一个有两个通道的Scalar对象。
    • Scalar(double v0, double v1, double v2):构造一个有三个通道的Scalar对象。
    • Scalar(double v0, double v1, double v2, double v3):构造一个有四个通道的Scalar对象。
  • 主要方法:
    • val[]:一个包含四个元素的数组,分别表示Scalar对象的四个通道的值。
    • clone():创建一个包含相同数据的新Scalar对象。
    • equals(Object obj):判断两个Scalar对象是否相等。
    • toString():返回一个表示Scalar对象的字符串。

Scalar类的应用场景

  1. 表示颜色值:
    • 在图像处理和计算机视觉中,颜色是一个非常重要的属性。Scalar类可以用来表示各种颜色值,例如BGR颜色值和灰度值。
  2. 设置颜色和填充图像区域:
    • 在图像处理操作中,常常需要设置某个区域的颜色值,例如绘制图形、填充区域等。

示例代码

以下代码展示了如何使用Scalar类来表示和操作颜色值。

import org.opencv.core.Core;
import org.opencv.core.Scalar;public class ScalarExample {static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static void main(String[] args) {// 表示蓝色的Scalar(BGR格式)Scalar blueColor = new Scalar(255, 0, 0);// 表示绿色的Scalar(BGR格式)Scalar greenColor = new Scalar(0, 255, 0);// 表示红色的Scalar(BGR格式)Scalar redColor = new Scalar(0, 0, 255);// 表示灰度值Scalar grayValue = new Scalar(128);// 打印Scalar值System.out.println("Blue Color: " + blueColor);System.out.println("Green Color: " + greenColor);System.out.println("Red Color: " + redColor);System.out.println("Gray Value: " + grayValue);// 克隆一个Scalar对象Scalar clonedBlue = blueColor.clone();System.out.println("Cloned Blue Color: " + clonedBlue);// 检查两个Scalar对象是否相等System.out.println("Blue and Cloned Blue are equal: " + blueColor.equals(clonedBlue));}
}

类型标识符
CV_8UC1:8位无符号整型单通道
CV_8UC3:8位无符号整型三通道(通常用于 RGB 图像)
CV_16UC1:16位无符号整型单通道
CV_16UC3:16位无符号整型三通道
CV_32FC1:32位浮点型单通道
CV_32FC3:32位浮点型三通道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核epoll

Linux网络IO模型 同步和异步&#xff0c;阻塞和非阻塞 Linux下的五种IO模型 同步和异步&#xff0c;阻塞和非阻塞 Linux 下的五种I/O模型&#xff1a; 阻塞IO&#xff08;Blocking IO&#xff09; BIO 非阻塞IO&#xff08;No Blocking IO&#xff09; IO复用&#xff08;se…

Linux系统管理磁盘管理004

本章主要讲述详细lvm扩容。 操作系统&#xff1a; CentOS Stream 9 扩容目标&#xff1a; jianglv扩容到600MB 扩容前 [rootlocalhost ~]# lvdisplay lgb--- Logical volume ---LV Path /dev/lgb/nginx_lvmLV Name nginx_lvmVG Name …

DEJA_VU3D - Cesium功能集 之 121-底图机制

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,工作原因可能无法像以前那样周更2-3篇,但是闲下来还是会不定期的更新,Cesium不…

手把手教你实现条纹结构光三维重建(1)——多频条纹生成

关于条纹结构光三维重建的多频相移、格雷码、格雷码相移、互补格雷码等等编码方法&#xff0c;我们在大多数平台上&#xff0c;包括现在使用语言大模型提问&#xff0c;都可以搜到相关的理论&#xff0c;本人重点是想教会你怎么快速用代码实现。 首先说下硬件要求&#xff0c;…

从0到1:企业办公审批小程序开发笔记

可行性分析 企业办公审批小程序&#xff0c;适合各大公司&#xff0c;企业&#xff0c;机关部门办公审批流程&#xff0c;适用于请假审批&#xff0c;报销审批&#xff0c;外出审批&#xff0c;合同审批&#xff0c;采购审批&#xff0c;入职审批&#xff0c;其他审批等规划化…

7-7 二分搜索

7-7 二分搜索 分数 10 全屏浏览 切换布局 作者 王东 单位 贵州师范学院 二分搜索。 输入样例&#xff1a; 第一行输入一个数n&#xff0c;第二行输入n个数&#xff0c;第三行输入要查的值。 12 11 14 23 25 68 78 84 97 155 201 310 479 97输出样例&#xff1a; 输出ke…

云计算期末复习(3)

Amazon云计算 习题 私有IP、公有IP和弹性IP的区别在哪里? EC2的实例一旦被创建就会动态地分配公共IP地址和私有IP地址。私有IP地址由动态主机配置协议(DHCP)分配产生。 私有IP、公有IP和弹性IP的主要区别在于它们的使用场景、可达性和管理方式&#xff1a; 私有IP&#xff1a…

基于Flask的python后端,组合支付记录,充值余额+赠送余额+微信支付功能实现详解

手里一个项目 涉及到订单补差价的支付问题&#xff0c;记录下代码与逻辑 该系统基于Flask框架&#xff0c;并支持多种支付方式的组合&#xff0c;包括直接微信支付、充值账户余额支付和赠送账户余额支付。 本文将详细介绍这一差价支付功能的实现细节&#xff0c;代码主要包括四…

46-1 护网溯源 - 钓鱼邮件溯源

一、客户提供钓鱼邮件样本 二、行为分析 三、样本分析 对钓鱼邮件中的木马程序1111.exe文件进行了分析,提交了360安全大脑沙箱云和微步在线云沙箱。 360安全大脑沙箱云显示,该1111.exe文件存在危险,因此在解压时需要谨慎操作,以免触发木马程序。 建议使用360压缩软件进行…

面试(02)————Java集合篇

目录 一、为什么数组索引是从0开始&#xff1f;如果从1开始不行吗&#xff1f; 二、ArrayList底层的实现原理是什么&#xff1f; ​编辑三、ArrayList list new ArrayList(10)中的list扩容几次&#xff1f; 四、如何实现数组与List之间的转换&#xff1f; 五、ArrayList…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(三)

概述 在上一篇 Swift 序列(Sequence)排序面面俱到 - 从过去到现在(二) 博文中,我们介绍了如何构建一个自定义类型中“多属性”排序的通用实现。 而在本课中我们将再接再厉介绍 iOS 15+ 中新的排序机制,并简要剖析就地排序(In-place sorting)对运行性能有着怎样的显著影…

基础乐理入门

基础概念 乐音&#xff1a;音高&#xff08;频率&#xff09;固定&#xff0c;振动规则的音。钢琴等乐器发出的是乐音&#xff0c;听起来悦耳、柔和。噪音&#xff1a;振动不规则&#xff0c;音高也不明显的音。风声、雨声、机器轰鸣声是噪音&#xff0c;大多数打击乐器&#…

【RK3568】制作Android11开机动画

Android 开机 logo 分为两种&#xff1a;静态显示和动态显示。静态显示就是循环显示一张图片&#xff1b;动态显示就是以特定帧率顺序显示多张图片 1.准备 android logo 图片 Android logo最好是png格式的&#xff0c;因为同一张图片的情况下&#xff0c;png 格式的比 jpg和b…

线性表和链表

一&#xff0c;线性结构 1.Array Array文档&#xff1a;可以自行阅读相关文档来了解Array class array.array(typecode[, initializer]) array.append(x)&#xff1a;添加元素到数组末尾 array.count(x)&#xff1a;计算元素出现次数 array.extend(iterable)&#xff1a;将迭代…

shell编程(二)——字符串与数组

本文为shell 编程的第二篇&#xff0c;介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’&#xff0c;也可以用双引号 “”&#xff0c;也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号&#xff08;使用转义符…

ChatTTS增强版V2,批量导出srt,语速控制,情感控制,支持朗读数字,问题修复

ChatTTS增强版最新版本已经发布&#xff0c;本次更新我主要增加了多文本批量、SRT导出、语速控制、情感控制、停顿控制等新功能&#xff0c;并针对上一版本中存在的数字读音异常、随机uv_break等问题进行了修复。 视频版本 【ChatTTS增强版V2&#xff0c;批量导出srt&#xff…

Java - Date类与Calendar类

在Java中&#xff0c;Date 类和 Calendar 类都被用于处理日期和时间&#xff0c;但它们之间存在一些重要的差异。下面是对这两个类的简要说明以及它们之间的主要区别。 Date 类 java.util.Date 类表示一个特定的时间点&#xff08;精确到毫秒&#xff09;。它包含自1970年1月…

Android AAudio——C API控制音频流(四)

上一篇文章我们介绍了 C API 中音频流的创建流程,以及打开音频流操作,这里我们再来看一下音频流的其他操作流程 一、音频流操作介绍 1、操作流程图 下图是状态变化流程图,虚线框表示瞬时状态,实线框表示稳定状态。 2、操作函数 上图中主要包含下面几个操作函数: aaudio…

代码随想录训练营Day30

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、重新安排行程 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 今天是跟着代码随想录刷题的第30天&#xff0c;主要是复习了回溯算法…

ubuntu上存在多个版本python,根据需要选择你想使用的python版本

文章目录 前言一、二、使用步骤总结 前言 参考1 一、 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1二、使用步骤 总结