opencv学习笔记二十:模板匹配
程序员文章站
2024-03-17 00:02:22
...
模板匹配就是拿模板去遍历图像,在遍历的每个位置计算结果,即匹配程度,opencv中 提供了 6 种计算方法:
- 差值平方和匹配 CV_TM_SQDIFF
- 标准化差值平方和匹配 CV_TM_SQDIFF_NORMED
- 相关匹配 CV_TM_CCORR
- 标准相关匹配 CV_TM_CCORR_NORMED
- 相关匹配 CV_TM_CCOEFF
- 标准相关匹配 CV_TM_CCOEFF_NORMED
平方和匹配是模板与模板覆盖下的原图像之间的像素差平方和,值越小代表匹匹配,所以前两种要找最小值的位置;
相关匹配是模板与模板覆盖下的原图像之间的像素乘积,标准相关匹配其实是先将两幅图像像素各转换成一列向量,通过计算两幅图像向量之间的夹角cos() = A*B/|A||B|来确定匹配程度,夹角越小,说明越相似,cos() 值就越大,所以后四种要找最大值的位置。
在 OpenCV 中,提供了相应的函数完成这个操作。
matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像
minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int value = 2;
Mat src, dst, temp;
void callback(int, void*);
int main(int arc, char** argv){
src = imread("1.png");
temp = imread("2.png");
namedWindow("src",CV_WINDOW_AUTOSIZE);
imshow("src", src);
imshow("temp", temp);
namedWindow("output", CV_WINDOW_AUTOSIZE);
createTrackbar("method", "output", &value, 5, callback);
callback(0, 0);
waitKey(0);
return 0;
}
void callback(int, void*) {
int width = src.cols - temp.cols + 1;
int height = src.rows - temp.rows + 1;
Mat result(width, height, CV_32FC1);
matchTemplate(src, temp, result, value);
normalize(result, result,0,1, NORM_MINMAX);
Point minLoc, maxLoc,temLoc;
double min, max;
minMaxLoc(result, &min, &max, &minLoc, &maxLoc,Mat());
if (value == CV_TM_SQDIFF || value == CV_TM_SQDIFF_NORMED) {
temLoc = minLoc;
}else {
temLoc = maxLoc;
}
src.copyTo(dst);
rectangle(dst, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2);
imshow("match", dst);
rectangle(result, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 0), 2);
imshow("output", result);
}
原图像如下:
模板图像 如下:
匹配结果如下:
推荐阅读
-
opencv学习笔记二十:模板匹配
-
《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记 博客分类: Linux命令行与shell脚本编程大全 psqlmysql
-
《Linux命令行与shell脚本编程大全》 第二十一章 学习笔记 博客分类: Linux命令行与shell脚本编程大全 gawk变量数组内建函数自定义函数
-
《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记 博客分类: Linux命令行与shell脚本编程大全 psqlmysql
-
《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记 博客分类: Linux命令行与shell脚本编程大全 dashzshzmodloadautoloadzcompile
-
JavaWeb同步学习笔记之二十七、JavaWeb_MVC案例之删除
-
JavaWeb同步学习笔记之二十六、JavaWeb_MVC案例之查询
-
学习笔记6(opencv+python阈值分割(最大熵))
-
OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配
-
reduce() 和 findContours()的使用陷阱 博客分类: OpenCV学习笔记