如何使用 OpenCV Java 库匹配两幅图像的关键点?
javaobject oriented programmingprogramming更新于 2025/10/8 11:56:17
org.opencv.features2d.Feature2D (抽象) 类的 detect() 方法检测给定图像的关键点。对于此方法,您需要传递一个表示源图像的 Mat 对象和一个空的 MatOfKeyPoint 对象来保存读取的关键点。
org.opencv.features2d.Feature2D 类的 drawMatches() 方法查找两幅给定图像的关键点之间的匹配并绘制它们。此方法接受以下参数 −
src1 −表示第一幅源图像的 Mat 类的对象。
keypoints1 − 表示第一幅源图像的关键点的 MatOfKeyPoint 类的对象。
src2 − 表示第二幅源图像的 Mat 类的对象。
keypoints2 − 表示第二幅源图像的关键点的 MatOfKeyPoint 类的对象。
matches1to2 − 从第一幅图像匹配到第二幅图像,这意味着 keypoints1[i] 在 keypoints2[matches[i]] 中有一个对应点。
dst −表示目标图像的 Mat 类的对象。
因此,要匹配两个图像的关键点 −
使用 imread() 方法读取两个源图像。
使用 detect() 方法获取两个图像的关键点。
使用 drawMatches() 方法查找并绘制匹配项。
示例
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfDMatch;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.features2d.FastFeatureDetector;
import org.opencv.features2d.Features2d;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
public class MatchingKeypoints {
public static void main(String args[]) throws Exception {
//加载 OpenCV 核心库
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
//读取源图像
String file1 ="D:\Images\feature1.jpg";
Mat src1 = Imgcodecs.imread(file1);
String file2 ="D:\Images\feature2.jpg";
Mat src2 = Imgcodecs.imread(file2);
//创建一个空矩阵来存储目标图像
Mat dst = new Mat();
FastFeatureDetector detector = FastFeatureDetector.create();
//检测两幅图像中的关键点
MatOfKeyPoint keyPoints1 = new MatOfKeyPoint();
detector.detect(src1, keyPoints1);
MatOfKeyPoint keyPoints2 = new MatOfKeyPoint();
detector.detect(src2, keyPoints2);
MatOfDMatch matof1to2 = new MatOfDMatch();
Features2d.drawMatches(src1, keyPoints1, src2, keyPoints2, matof1to2, dst);
HighGui.imshow("Feature Matching", dst);
HighGui.waitKey();
}
}
输入图像
Image1 −

Image2 −

输出

相关文章
有用资源
java 参考教程 - 该教程包含有关 java 的更多信息:https://www.cainiaomax.com/java/

