7

我写了一个代码,它通过 KNN 算法找到 K 个最接近的匹配项。获得 matMatch 和 matchIndices 后,我尝试在两个结果帧之间绘制匹配对。

我将matMaskmatchIndices输入到函数Features2DToolbox.DrawMatches中:

Image<Bgr, byte> imResult = Features2DToolbox.DrawMatches(imModelCurr, imModel.keyPoints, imObserPrev,imObser.keyPoints, **matchIndices**, new Bgr(System.Drawing.Color.Yellow), new Bgr(System.Drawing.Color.Red), **matMask**, Features2DToolbox.KeypointDrawType.NOT_DRAW_SINGLE_POINTS);

http://www.emgu.com/wiki/files/2.4.0/document/html/e92d37e6-fe4a-ad09-9304-cd2d2533bfa8.htm但我注意到它给了我匹配对之间错误的绘图:

在此处输入图像描述

然后我尝试自己实现这样的功能:

 for (int i = 0; i < matMask.Rows; ++i)
        {
            if (**matMask[i, 0]** > 0) 
            {
                int indForCurrFrm = **matchIndices[i, 0]**;
                int indForPrevFrm = i;

                //for frame i-1
                PointF fromFirstFrame = getImgObserved(keyPoints[indForPrevFrm]);

                //for frame i
                PointF NextCorrespondingMatchedFrame = getImModelXY(keyPoints[indForCurrFrm]);

                imColorPrv2.Draw(new CircleF(fromFirstFrame, 5), new Bgr(mtchColor), 3);// for frame i-1
                imColorShow.Draw(new CircleF(NextCorrespondingMatchedFrame, 5), new Bgr(mtchColor), 3); // for frame i

                 // draw line on my own matching
              imResult.Draw(new LineSegment2DF(fromFirstFrame,NextCorrespondingMatchedFrame),new Bgr(System.Drawing.Color.FloralWhite),1);

            }
        }

并获取相应的对点坐标(X,Y)并自己绘制[查看快照中的结果]。

在左下角,您可以看到匹配项(以白线显示),每个对应的对都有一个相同颜色的圆圈[由我自己的函数],而在另一侧的右下角,它是 Emgu 的 DrawMatches 函数绘制的结果.注意这两个函数使用相同的matMash和matchIndices。

所以我想知道 EMGU 的 DrawMatches 是否有错误或者我做错了什么?

4

1 回答 1

0

使用每个对应对的描述符之间的欧几里德距离从matchIndices过滤最佳匹配可能非常有用。有时,第一张图像中的一个关键点可以很好地匹配第二张图像中的许多关键点,这可能会混淆结果中的绘制线。

过滤可能是这样的:

vector< DMatch > filtered_matches;

 for( int i = 0; i < descriptors_of_model.rows; i++ )
    { 
      if( matchIndices[i].distance < SMALL_THRESHOLD )
          filtered_matches.push_back( matchIndices[i]); 

     }
于 2013-07-25T15:00:22.017 回答