我对什么是 OpenCV (feature2D) 匹配感到困惑,我正在使用 OpenCVSharp 并执行以下操作:
var pt1 = detector.Detect(img1);
var pt2 = detector.Detect(img2);
Mat desc1 = new Mat();
Mat desc2 = new Mat();
extractor.Compute(img1, ref pt1, desc1);
extractor.Compute(img2, ref pt2, desc2);
var matcher = new BFMatcher();
var matches = matcher.Match(desc1, desc2);
Cv2.DrawMatches(img1, pt1, img2, pt2, matches, target);
这工作得很好,但是我不想画它们,我想自己从这些匹配中做一些事情,但是匹配中的所有项目都是具有以下数据的项目数组:QueryIdx TrainIdx Distance 和 ImgIdx。ImgIdx 听起来无关紧要(始终为 0),我能想到的只是 QueryIdx 和 TrainIdx 将分别是 Pt1 和 Pt2 中的点的索引,但似乎并非如此,就好像我在匹配中获得第一个结果时它具有以下数据:
{DMatch (QueryIdx:0, TrainIdx:4, ImgIdx:0, Distance:414.4816)}
如果我尝试分别获得以下数据,这将导致 Pt1 的 index0 和 Pt2 的 index4:
{(x:1490.127 y:1808.562)}
{(x:1852.559 y:1789.147)}
但是,如果我计算我们得到的这些点之间的距离
1808.562 - 1789.147 = 19.415
1852.559 - 1490.127 = 382.432
19.415² = 376.942
482.432² = 146254.234
376.942 + 146254.234 = 146631.176
sqrt(146631.176) = 382.431
And finally 382.431 != 414.4816
那我错过了什么?