这次主要介绍的是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处理后的模样。
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}