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); // 将第一个像素的灰度值设置为128
           System.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位浮点型三通道

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值