OpenCV 4.x Java中DescriptorExtractor与DescriptorMatcher的替代方案及用法
OpenCV 4中DescriptorExtractor与DescriptorMatcher的替代方案及代码修改
问题说明
使用旧版ORB特征匹配代码时,ORB检测功能正常,但无法找到DescriptorExtractor和DescriptorMatcher类,需明确OpenCV 4中的替代类及用法。
替代类说明
- DescriptorExtractor:OpenCV 4已将其整合到
Feature2D接口中,ORB类本身实现了Feature2D,无需单独创建DescriptorExtractor实例,直接用ORB对象的compute方法即可完成描述符计算。 - DescriptorMatcher:仍可使用
DescriptorMatcher类,需确保导入OpenCV 4对应包,创建方式与旧版一致,类路径为org.opencv.features2d.DescriptorMatcher。
修改后的完整代码
MatOfKeyPoint keypoints = new MatOfKeyPoint(); // 直接创建ORB实例,兼顾关键点检测与描述符计算 ORB orb = ORB.create(); // 创建汉明距离暴力匹配器(适配ORB描述符特性) DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); // 处理第一张图片 Imgproc.cvtColor(img1, img1, Imgproc.COLOR_RGB2GRAY); Mat descriptors1 = new Mat(); MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); // 分开执行检测与计算 orb.detect(img1, keypoints1); orb.compute(img1, keypoints1, descriptors1); // 处理第二张图片 Imgproc.cvtColor(img2, img2, Imgproc.COLOR_RGB2GRAY); Mat descriptors2 = new Mat(); MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); orb.detect(img2, keypoints2); orb.compute(img2, keypoints2, descriptors2); // 执行特征匹配 MatOfDMatch matches = new MatOfDMatch(); MatOfDMatch filteredMatches = new MatOfDMatch(); matcher.match(descriptors1, descriptors2, matches); List<DMatch> matchesList = matches.toList();
简化写法补充
可使用detectAndCompute方法一步完成关键点检测与描述符计算,代码更简洁:
// 替代分开的detect和compute调用 orb.detectAndCompute(img1, new Mat(), keypoints1, descriptors1); orb.detectAndCompute(img2, new Mat(), keypoints2, descriptors2);
注:第二个参数为掩码,无需时传入空Mat即可。
内容的提问来源于stack exchange,提问作者Mich
相关产品推荐
相关产品推荐

