0

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

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

我想知道 nativeObj 和 dataAddr 代表什么?我想以像素为单位获得两个匹配特征之间的距离,知道吗?

我发现其他人也有同样的问题,但没有回复。如何在 OpenCV Matcher 上访问点位置?

提前致谢!

4

1 回答 1

2

当您执行特征描述符的匹配时,您应该得到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 对象的内存地址。

于 2013-03-11T22:37:20.263 回答