当前位置: 首页 > news >正文

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位浮点型三通道

相关文章:

  • codereview时通常需要关注哪些
  • Mongodb---java篇
  • 简述React 和 Vue 的 diff 时间复杂度从 O(n^3) 优化 到 O(n) ,那么 O(n^3) 和 O(n) 是如何计算出来的 ?
  • 特征提取(Feature Extraction)特征评估(五)
  • 【Linux】The server quit without updating PID file的几种解决方案
  • ubuntu20.04设置文件开机自启动
  • 持续总结中!2024年面试必问 20 道分布式、微服务面试题(二)
  • ffmpeg视频编码原理和实战-(2)视频帧的创建和编码packet压缩
  • 6.4分享会
  • 2024全国高考作文题解读(Chat GPT 4.0版本)
  • 讯方618代表有话说 | 行业大咖详解鸿蒙,全程在线答疑
  • java static 如何理解
  • Edge 工作区是什么?它都有哪些作用?
  • 删除目录
  • 【Android Studio】导入import android.support.v7.app.AppcompatActivity;时报错
  • Brief introduction of how to 'Call, Apply and Bind'
  • CAP理论的例子讲解
  • ES2017异步函数现已正式可用
  • hadoop集群管理系统搭建规划说明
  • JavaScript DOM 10 - 滚动
  • Java多线程(4):使用线程池执行定时任务
  • Laravel 中的一个后期静态绑定
  • LeetCode29.两数相除 JavaScript
  • Linux各目录及每个目录的详细介绍
  • MD5加密原理解析及OC版原理实现
  • React Native移动开发实战-3-实现页面间的数据传递
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue2.x学习三:事件处理生命周期钩子
  • 半理解系列--Promise的进化史
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊一聊前端的监控
  • 十年未变!安全,谁之责?(下)
  • 算法---两个栈实现一个队列
  • 通过git安装npm私有模块
  • ​iOS安全加固方法及实现
  • ‌JavaScript 数据类型转换
  • #if和#ifdef区别
  • #QT(TCP网络编程-服务端)
  • #面试系列-腾讯后端一面
  • (1) caustics\
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (二)hibernate配置管理
  • (二)JAVA使用POI操作excel
  • (二)构建dubbo分布式平台-平台功能导图
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Neo4j下载安装以及初次使用
  • **PHP分步表单提交思路(分页表单提交)
  • **python多态
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net OpenCVSharp生成灰度图和二值图
  • .net web项目 调用webService
  • .net操作Excel出错解决