2013-03-09 16 views
0

我正在使用Android OpenCV从摄像头的输入帧中检测特征。我在BFMatcher中使用了ORB特征检测器和ORB描述符提取器。现在我得到了一些匹配垫的格式如何从两个匹配的特征中获取像素距离

matches = Mat [ 421*1*CV_32FC4, isCont=true, isSubmat=false, nativeObj=0x5fad7b30, dataAddr=0x5fab84f0 ] 

我不知道什么是nativeObj和dataAddr代表什么?我想以像素为单位获得两个匹配功能之间的距离,有什么想法?

我发现别人有同样的问题,没有答复。 How to Access Points location on OpenCV Matcher?

在此先感谢!

回答

1

当您执行功能描述符匹配时,您应该获得MatOfDMatch。您的代码应该是这样的:

DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 
MatOfDMatch matches = new MatOfDMatch(); 
matcher.match(descriptors1,descriptors2 ,matches); 

可以变换MatOfDMatchList<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); 
你可以做到这一点

关于nativeObjdataAddr我不确定,但我认为这与OpenCV库在C中实现的事实有关,我认为这个值表示Mat对象的内存中的地址。

+0

非常感谢!这非常有用! – user2062340 2013-03-13 07:33:46

相关问题