理解openCV中的模板匹配

理解openCV中的模板匹配,opencv,Opencv,只是想澄清我的困惑。我已经测试了openCV模板匹配方法来匹配一些数字。首先,我有一个数字0 1 2 3 4 5 1 2 3 4 5的序列(二值化后,字符宽度可能不同)。模板匹配如何与数字“1”匹配?是的 在所有窗口中滑动,直到找到2个匹配项(2个输出),或 匹配第一个“1”后停止,或 找到两个数字“1”之间的最高相关性,然后选择其中一个 编辑:输出如附件所示。它只匹配一个数字“1”,而不匹配两个数字“1” [Q] 如何同时检测两个数字“1”?我知道这是一个老问题,但这里有一个答案 当您进行匹

只是想澄清我的困惑。我已经测试了openCV模板匹配方法来匹配一些数字。首先,我有一个数字0 1 2 3 4 5 1 2 3 4 5的序列(二值化后,字符宽度可能不同)。模板匹配如何与数字“1”匹配?是的

  • 在所有窗口中滑动,直到找到2个匹配项(2个输出),或
  • 匹配第一个“1”后停止,或
  • 找到两个数字“1”之间的最高相关性,然后选择其中一个
  • 编辑:输出如附件所示。它只匹配一个数字“1”,而不匹配两个数字“1”


    [Q] 如何同时检测两个数字“1”?

    我知道这是一个老问题,但这里有一个答案

    当您进行匹配模板时,它将输出灰度图像。在那之后,你需要在上面做一个最小最大值。然后,您可以检查在您要查找的范围内是否有结果。在下面的示例中,我使用EmguCV(C#中OpenCV的包装器),仅当最佳查找(minValues数组的索引0)低于0.75时(您可以根据需要调整此阈值),才在其周围绘制一个矩形

    代码如下:

    Image<Gray, float> result = new Image<Gray, float>(new System.Drawing.Size(nWidth, nHeight));
    result = image.CurrentImage.MatchTemplate(_imageTemplate.CurrentImage, Emgu.CV.CvEnum.TM_TYPE.CV_TM_SQDIFF_NORMED);
    
    
    double[] minValues;
    double[] maxValues;
    System.Drawing.Point[] minLocations;
    System.Drawing.Point[] maxLocations;
    
    result.MinMax(out minValues, out maxValues, out minLocations, out maxLocations);
    if (minValues[0] < 0.75)
    {
        Rectangle rect = new Rectangle(new Point(minLocations[0].X, minLocations[0].Y), 
            new Size(_imageTemplate.CurrentImage.Width, _imageTemplate.CurrentImage.Height));
        image.CurrentImage.Draw(rect, new Bgr(0,0,255), 1);
    }
    else
    {
        //Nothing has been found
    }
    
    Image结果=新图像(新系统图尺寸(nWidth,nHeight));
    结果=image.CurrentImage.MatchTemplate(_imageTemplate.CurrentImage,Emgu.CvEnum.TM_TYPE.CV_TM_SQDIFF_NORMED);
    双重价值观;
    双[]最大值;
    系统.图纸.点位置;
    系统.图纸.点[]最大位置;
    结果.MinMax(输出最小值、输出最大值、输出最小位置、输出最大位置);
    如果(最小值[0]<0.75)
    {
    矩形rect=新矩形(新点(最小位置[0].X,最小位置[0].Y),
    新大小(_imageTemplate.CurrentImage.Width,_imageTemplate.CurrentImage.Height));
    image.CurrentImage.Draw(rect,新Bgr(0,0255),1);
    }
    其他的
    {
    //什么也没找到
    }
    
    编辑

    以下是一个输出示例:


    你应该在谷歌上多搜索一点……是的,我在这里发布之前已经看过了。但是,当我在我的示例中尝试时,只选择了一个数字进行匹配。您使用的是哪种匹配方法?相关性?尝试CV_TM_SQDIFF我使用的是CV_TM_CCORR_Normad,它的值为1.0(最高匹配)。您使用CV_TM_SQDIFF的输出是什么?您可以粘贴一些您所做操作的图像吗?我将在下周收到代码时编辑我的答案