首页 文章

如何从两个匹配的特征获得像素距离

提问于
浏览
0

我正在使用Android OpenCV来检测相机输入框的功能 . 我正在使用带有BFMatcher的ORB特征检测器和ORB描述符提取器 . 现在我得到了一些匹配Mat的格式

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

我想知道nativeObj和dataAddr代表什么?我想 get the distance between two matched features 在像素,任何想法?

我发现其他人有同样的问题而且没有回复 . How to Access Points location on OpenCV Matcher?

提前致谢!

1 回答

  • 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);
    

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

相关问题