C# 使用OpenCV匹配

C# 使用OpenCV匹配,c#,opencv,feature-detection,opencvsharp,C#,Opencv,Feature Detection,Opencvsharp,我对什么是OpenCV(feature2D)匹配感到困惑,我正在使用OpenCVSharp并执行以下操作: var pt1 = detector.Detect(img1); var pt2 = detector.Detect(img2); Mat desc1 = new Mat(); Mat desc2 = new Mat(); ex

我对什么是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

那么我遗漏了什么?

“我遗漏了什么”-匹配距离不是点之间的距离,而是描述符之间的距离。在这些点上可以找到points@berak你能澄清一下吗?我仍然对API有点困惑。这是否意味着我已经在检索正确的点对?如果不是,你能告诉我怎么做吗?要知道,如果这是一场“好”的比赛,你需要比较比赛距离,而不是点与点之间的距离。(这就是“描述符匹配”背后的全部想法。两幅图像之间可能存在任意旋转/平移,因此点距离没有用处。)@berak但将其与什么进行比较?我有dmatch距离,但我不确定将它与small==good进行比较。参见,例如。