- 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`类的应用场景
-
图像存储:
- Mat类最常见的用途是存储图像数据,可以是灰度图、彩色图像或多通道图像。
-
图像处理:
- 使用Mat类,可以进行各种图像处理操作,如滤波、变换、阈值处理等。
-
矩阵计算:
- 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); }
}
- Mat类也可以用于矩阵计算和线性代数运算。
- 构造函数:
- 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);
}
}
- 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);
}
}
- 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);
}
}
- DMatch类
DMatch类在OpenCV中用于表示描述符匹配中的一个匹配对,是特征匹配算法的核心部分。特征匹配是计算机视觉中一种基本操作,广泛应用于图像拼接、目标识别和跟踪等任务。
DMatch类的主要属性
- queryIdx:查询图像中描述符的索引。表示当前要匹配的特征点在查询图像中的位置。
- trainIdx:训练图像中描述符的索引。表示在数据库或训练图像中找到的匹配特征点的位置。
- imgIdx:图像索引(在多图像匹配中使用)。当在多个训练图像中搜索匹配时,用于标识当前匹配到的训练图像。
- distance:两个特征点之间的距离,表示匹配的好坏程度,距离越小表示匹配越好。常用的距离度量方法包括欧氏距离和汉明距离,具体取决于特征描述符的类型。
DMatch类的应用场景
- 特征匹配:在图像配准和拼接中,通过匹配图像中的关键点来找到相同或相似的区域。
- 物体识别:通过匹配特征点来识别图像中的物体。
- 跟踪:在视频序列中,通过匹配连续帧中的特征点来实现目标跟踪。
示例代码
以下代码展示了如何使用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类的应用场景
- 表示颜色值:
- 在图像处理和计算机视觉中,颜色是一个非常重要的属性。Scalar类可以用来表示各种颜色值,例如BGR颜色值和灰度值。
- 设置颜色和填充图像区域:
- 在图像处理操作中,常常需要设置某个区域的颜色值,例如绘制图形、填充区域等。
示例代码
以下代码展示了如何使用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位浮点型三通道