C# 使用OpenCV匹配
我对什么是OpenCV(feature2D)匹配感到困惑,我正在使用OpenCVSharp并执行以下操作: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
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进行比较。参见,例如。