OpenCV基础之图片模板匹配

LZQ plus

发布于 2018.02.20 23:26 阅读 2761 评论 0

 

这次主要介绍的是OpenCV如何实现内容匹配,以及OpenCV相关的一些其他的函数学习心得。(下面的两张图是原图和匹配模板)

   

 

先看代码:


#include <opencv2\opencv.hpp>

#include <Windows.h>

using namespace std;

using namespace cv;

void main() {

    Mat  image_source = imread("../Imgs/5.png");

    Mat  player_tmp = imread("../Imgs/player.png");

    Mat  player;

    if (!image_source.data || !player_tmp.data) {

        cout << "未能读取到图片信息,图片来源有误!" << endl;

        Sleep(1500);

        return;

    }

 

    Mat source_copy;

    image_source.copyTo(source_copy);//复制一份source_copy画矩形,image_source画圆形

 

    matchTemplate(image_source,player_tmp,player,TM_CCOEFF_NORMED);

 

    double min_val = 0, max_val = 0;

    Point min_loc, max_loc;

    minMaxLoc(player,&min_val,&max_val,&min_loc,&max_loc);

 

    circle(image_source,

        Point(max_loc.x + player_tmp.cols / 2, max_loc.y + player_tmp.rows / 2),

        20,

        CV_RGB(255, 0, 0),

        2,

        8,

        0);

 

    rectangle(source_copy,

        Point(max_loc.x - 1, max_loc.y - 1 ), 

        Point(max_loc.x + player_tmp.cols + 1 , max_loc.y + player_tmp.rows + 1), 

        CV_RGB(255, 0, 0), 

        2,

        0);

 

    imshow("source image", image_source);

    imshow("match result", player);

    imshow("source copy", source_copy);

    waitKey(0);

    destroyAllWindows();

 

    return;

}

 

第一个介绍的是OpenCV中,函数matchTemplate()的介绍:

matchTemplate( 

    InputArray image, // 用于搜索的输入图像, 8U 32F, 大小 W-H 

    InputArray templ, // 用于匹配的模板,和image类型相同, 大小 w-h 

    OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)-(H-h+1) 

    int method // 用于比较的方法 

); 

 

第二个是OpenCV中,函数circle()的介绍:

参数从左到右分别为:

         Img 为图像,单通道多通道都行,不需要特殊要求

         center为画圆的圆心坐标

         radius为圆的半径

         color为设定圆的颜色,比如用CV_RGB(255, 0,0)设置为红色, CV_RGB(255, 255,255)设置为白色,CV_RGB(0, 0,0)设置为黑色

         thickness为设置圆线条的粗细,值越大则线条越粗,为负数则是填充效果

 

第三个是OpenCV中,函数rectangle()的介绍:

参数从左到右分别为:

    cv::Mat& img, // 待绘制的图像 

    cv::Point pt1, // 矩形的第一个顶点 

    cv::Point pt2 // 矩形的对角顶点 

    const cv::Scalar& color, // 线条的颜色(RGB 

    int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)  就是粗细

int shift = 0 // 偏移量 

 

上段代码中有这么一段

 

double min_val = 0, max_val = 0;

Point min_loc, max_loc;

minMaxLoc(player,&min_val,&max_val,&min_loc,&max_loc);

 

这里的max_loc有着重大的作用,它的意义就是代表着 模板图片的左上角的的(0,0)像素在整个原图(大图)中的具体坐标,可以输出试一试。

 

我的这个是在原图上画了一个圆,又在copy的图上画了一个长方形,最后的效果如下:

其中中间的那个窗口显示的就是函数matchTemplate处理后的模样。