我正在使用Android OpenCV来检测相机输入框的功能。我正在使用带有BFMatcher的ORB特征检测器和ORB描述符提取器。现在我以
的格式获得了一些匹配Matmatches = Mat [ 421*1*CV_32FC4, isCont=true, isSubmat=false, nativeObj=0x5fad7b30, dataAddr=0x5fab84f0 ]
我想知道nativeObj和dataAddr代表什么?我想以像素为单位获得两个匹配特征之间的距离,任何想法?
我发现其他人有同样的问题但没有回复。 How to Access Points location on OpenCV Matcher?
提前致谢!
答案 0 :(得分:2)
当您执行功能描述符的匹配时,您应该获得MatOfDMatch
。你的代码应该是这样的:
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
MatOfDMatch matches = new MatOfDMatch();
matcher.match(descriptors1,descriptors2 ,matches);
您可以将MatOfDMatch
转换为List<DMatch>
以便于操作。你可以用:
List<DMatch> matchesList = matches.toList();
然后您可以访问匹配的点并获得笛卡尔坐标:
Point pt1 = keypoints1.toList().get(matchesList.get(i).queryIdx).pt;
Point pt2 = keypoints2.toList().get(matchesList.get(i).trainIdx).pt;
在计算两点之间的距离后:
double dist_x_pow = Math.pow(Math.abs(pt1.x - pt2.x),2);
double dist_y_pow = Math.pow(Math.abs(pt1.y - pt2.y),2);
double DISTANCE = Math.sqrt(dist_x_pow + dist_y_pow);
关于nativeObj
和dataAddr
我不确定,但我认为这与OpenCV库在C中实现这一事实有关,我认为此值代表内存中的地址Mat对象。