zoukankan      html  css  js  c++  java
  • OpenCV模板匹配函数matchTemplate详解

    参考文档:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#id2

    最近一直在做一个logo检测的项目,检测logo的有无,接触到模板匹配。模板匹配虽然精度不高,但选择恰当的方法,设置合适的阈值也能起到一定作用。有的时候我们还能用模板匹配来定位。下面对模板匹配进行一个总结。

    模板匹配:模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.

    matchTemplate()参数详解

    CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ,
                                     OutputArray result, int method );
    image:待匹配的源图像
    templ:模板图像
    result:保存结果的矩阵,我们可以通过minMaxLoc() 确定结果矩阵的最大值和最小值的位置.
      minMaxLoc()函数:查找全局最小和最大稀疏数组元素并返回其值及其位置
      void minMaxLoc(const SparseMat& a, double* minVal,double* maxVal, int* minIdx=0, int* maxIdx=0);
    • a: 匹配结果矩阵
    • &minVal&maxVal: 在矩阵 result 中存储的最小值和最大值
    • &minLoc&maxLoc: 在结果矩阵中最小值和最大值的坐标.

    method :模板匹配的算法
      有以下六种:
      enum { TM_SQDIFF=0, TM_SQDIFF_NORMED=1, TM_CCORR=2, TM_CCORR_NORMED=3, TM_CCOEFF=4, TM_CCOEFF_NORMED=5 };
    • TM_SQDIFF,TM_SQDIFF_NORMED匹配数值越低表示匹配效果越好,其它四种反之。
    • TM_SQDIFF_NORMED,TM_CCORR_NORMED,TM_CCOEFF_NORMED是标准化的匹配,得到的最大值,最小值范围在0~1之间,其它则需要自己对结果矩阵归一化。
    • 不同的方法会得到差异很大的结果,可以通过测试选择最合适的方法。

    归一化函数normalize()

    normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

    模板匹配的大致用法如下:

    void templateMatching(const Mat& srcImage,const Mat& templateImage)
    {
        Mat result;
        int result_cols = srcImage.cols - templateImage.cols + 1;
        int result_rows = srcImage.rows - templateImage.rows + 1;
        if(result_cols < 0 || result_rows < 0)
        {
            qDebug() << "Please input correct image!";
            return;
        }
        result.create(result_cols, result_rows, CV_32FC1);
    //    enum { TM_SQDIFF=0, TM_SQDIFF_NORMED=1, TM_CCORR=2, TM_CCORR_NORMED=3, TM_CCOEFF=4, TM_CCOEFF_NORMED=5 };
        matchTemplate(srcImage,templateImage,result,TM_CCOEFF_NORMED);   //最好匹配为1,值越小匹配越差
        double minVal = -1;
        double maxVal;
        Point minLoc;
        Point maxLoc;
        Point matchLoc;
        minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
    
     //取大值(视匹配方法而定)
    //    matchLoc = minLoc;
        matchLoc = maxLoc;
    
        //取大值,值越小表示越匹配
        QString str = "Similarity:" + QString::number((maxVal) * 100, 'f', 2) + "%";
        qDebug(str.toAscii().data());
    
        Mat mask = srcImage.clone();
    //绘制最匹配的区域 rectangle(mask, matchLoc, Point(matchLoc.x
    + templateImage.cols, matchLoc.y + templateImage.rows), Scalar(0, 255, 0), 2, 8, 0); imshow("mask",mask); }

    分别采用两个不同颜色的模板图进行测试,得到如下两组结果图,以供参考。

    测试结果1:

                           

                           

     测试结果2:

     

                       

  • 相关阅读:
    很老的一篇文章:李翱(伊秀女性网):从程序员到精英站长的跨度
    推荐一款很好用的CSS下拉菜单框架
    网站推广之软文写作与发布技巧
    SEO网站外链接分析工具
    图解几大浏览器的区别(搞笑)
    好文摘抄:极简生活:一来,一去
    南通搜索引擎优化:浅谈国内SEO的发展趋势
    关注程序员健康之——程序员最有效的十大戒烟方法
    [你必须知道的css系列]第一回:丰富的利器:CSS选择符之通配符、类选择符、包含选择符、ID选择符
    [你必须知道的css系列]第一回:冠冕堂皇:CSS的作用及其基本结构
  • 原文地址:https://www.cnblogs.com/yysky/p/10497858.html
Copyright © 2011-2022 走看看