• opencvmatchTemplate模板匹配(大图中寻找小图)


    单个匹配

    11.png

     12.png

    #include<opencv2/opencv.hpp>
    #include<iostream>
    
    int main(int argc, char** argv) {
        
        cv::Mat src = cv::imread("D:/bb/tu/11.png");
        cv::Mat templ = cv::imread("D:/bb/tu/12.png");
        cv::Mat ftmp;
        cv::matchTemplate(src, templ, ftmp,5);   //模板匹配
        /*
        参数1:src用于搜索的输入图像, 8U 或 32F, 大小 W-H
        参数2:用于匹配的模板,和src类型相同, 大小 w-h
        参数3:匹配结果图像, 类型 32F, 大小 (W-w+1)-(H-h+1)
        参数4:用于比较的方法(有六种)
              cv::TM_SQDIFF=0 该方法使用平方差进行匹配,因此最佳的匹配结果在结果为0处,值越大匹配结果越差
              cv::TM_SQDIFF_NORMED=1:该方法使用归一化的平方差进行匹配,最佳匹配也在结果为0处
              cv::TM_CCORR=2:相关性匹配方法,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳
                    匹配位置在值最大处,值越小匹配结果越差  【个人测试:匹配性很差】
              cv::TM_CCORR_NORMED=3:归一化的相关性匹配方法,与相关性匹配方法类似,最佳匹配位置也是在值最大处
              cv::TM_CCOEFF=4:相关性系数匹配方法,该方法使用源图像与其均值的差、模板与其均值的差二者之间的相
                    关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表示二者不相关
              cv::TM_CCOEFF_NORMED=5:归一化的相关性系数匹配方法,正值表示匹配的结果较好,负值则表示匹配的效
                    果较差,也是值越大,匹配效果也好
        */
    
        std::cerr << cv::TM_CCOEFF_NORMED << std::endl;
    
        normalize(ftmp, ftmp, 1, 0, cv::NORM_MINMAX);//可以不归一化
        double minVal; double maxVal;
        cv::Point minLoc; 
        cv::Point maxLoc;
        minMaxLoc(ftmp, &minVal, &maxVal, &minLoc, &maxLoc); //找到最佳匹配点
        //从匹配结果图像中找出最佳匹配点
        rectangle(src, cv::Rect(maxLoc.x, maxLoc.y, templ.cols, templ.rows), cv::Scalar(0, 0, 255), 2, 8);//画出匹配到的矩形框
        //注意:与方法有关,有的是最小值是最佳匹配;有的是最大值是最佳匹配
    
        cv::imshow("src", src);
        cv::waitKey();
        return 0;
    }

    多个匹配

    13.png

     14.png

    #include<opencv2/opencv.hpp>
    #include<iostream>
    
    
    int main(int argc, char** argv) {
        
        cv::Mat src = cv::imread("D:/bb/tu/13.png");
        cv::Mat tem = cv::imread("D:/bb/tu/14.png");
    
        cv::Mat resultImage;
        matchTemplate(src, tem, resultImage, 5);//模板匹配
    
        /*
        我寻找多个匹配的思路:
        matchTemplate之后,resultImage中保存了匹配相似度
        匹配方法是cv::TM_CCOEFF_NORMED=5,值越大,相似度越高
        相似度大于0.97,我就认为匹配非常好,所以我要遍历出相似度
        大于0.97的坐标
        */
    
        std::vector<cv::Point> point;
        for (int i = 0; i < resultImage.rows; i++) {  //i是行号
            for (int j = 0; j < resultImage.cols; j++) {  //j是列号
                float t = resultImage.at<float>(i, j); //返回指点坐标的数据
                if (t > 0.97) {
                    point.insert(point.end(), cv::Point(j,i));
                }
                
            }
        }
        
        //画出多个匹配
        for (int i = 0; i < point.size(); i++)
        {
            rectangle(src, cv::Rect(point[i].x, point[i].y, tem.cols, tem.rows), cv::Scalar(0, 0, 255), 2, 8);
        }
    
        cv::imshow("src", src);
        cv::waitKey();
        return 0;
    }

      

  • 相关阅读:
    C语言高速入口系列(七)
    数据结构:最小生成树--Prim算法
    poj2387-Til the Cows Come Home dijkstra获得水的问题
    iOS开展UI一片—简单的浏览器观看节目
    spark安装mysql与hive
    键入强力推进并解决强转
    华为u8800怎样root?
    用友ERP-U8最新破解(再次更新版本,附安装过程中的解决办法)
    Delphi 自带的那个 Hand 光标很难看?没关系,一行代码解决问题:
    阿里余额宝的来龙与去脉
  • 原文地址:https://www.cnblogs.com/liming19680104/p/15836562.html
Copyright © 2020-2023  润新知