opencv|opencv C++模板匹配的简单实现
目录
- 一简单实现
- 二函数及原理讲解
- 1matchTemplate()参数详解
- 2minMaxLoc()函数
一 简单实现
#include#include using namespace cv; using namespace std; int main(){ Mat img = imread("52.jpg"); Mat templ = imread("templ.jpg"); Mat result; matchTemplate(img,templ,result,TM_CCOEFF_NORMED); //原图,模板,匹配方法 double maxVal, minVal; Point maxLoc, minLoc; //寻找最大值,最小值 minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); //绘制矩形,矩形的左上角是最大值的位置,右下角是在最大值上加上模板的行宽和和列高 rectangle(img,Point(maxLoc.x,maxLoc.y),Point(maxLoc.x+templ.cols,maxLoc.y+templ.rows),Scalar(0,0,255),2); //颜色红色,粗度2 imshow("原图", img); imshow("模板",templ); imshow("result",result); waitKey(0); return 0; }
结果如下,分别是模板图,原图(找到了与模板匹配的部分,并矩形框标记,结果图,暂时觉得有点问题的 )
文章图片
二 函数及原理讲解
1 matchTemplate()参数详解
matchTemplate( InputArray image, InputArray templ,OutputArray result, int method );
image:待匹配的源图像
templ:模板图像
result:保存结果的矩阵,我们可以通过minMaxLoc() 确定结果矩阵的最大值和最小值的位置.
method :模板匹配的算法有以下六种:enum { TM_SQDIFF=0, TM_SQDIFF_NORMED=1, TM_CCORR=2, TM_CCORR_NORMED=3, TM_CCOEFF=4, TM_CCOEFF_NORMED=5 };
【opencv|opencv C++模板匹配的简单实现】TM_SQDIFF,TM_SQDIFF_NORMED匹配数值越低表示匹配效果越好,其它四种反之。
TM_SQDIFF_NORMED,TM_CCORR_NORMED,TM_CCOEFF_NORMED是标准化的匹配,得到的最大值,最小值范围在0~1之间,其它则需要自己对结果矩阵归一化。
不同的方法会得到差异很大的结果,可以通过测试选择最合适的方法。
cv::TM_SQDIFF 判断 minVal 越小,效果越好
计算模板与目标图像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高;
cv::TM_SQDIFF_NORMED 判断 minVal 越接近0,效果越好
范化的cv::TM_SQDIFF,取值为0-1之间,完美匹配返回值为0;
cv::TM_CCORR 判断 maxVal 越大,效果越好
使用dot product计算匹配度,越高匹配度就好;
cv::TM_CCORR_NORMED 判断 maxVal 越接近1,效果越好
范化的cv::TM_CCORR,0-1之间,我用的这个;
cv::TM_CCOEFF 判断 maxVal 越大,效果越好
采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;
cv::TM_CCOEFF_NORMED 判断 maxVal 越接近1,效果越好
范化的cv::TM_CCOEFF,-1 ~ 1之间。
2 minMaxLoc()函数
查找全局最小和最大稀疏数组元素并返回其值及其位置
void minMaxLoc(const SparseMat& a, double* minVal,double* maxVal, int* minIdx=0, int* maxIdx=0);
a: 匹配结果矩阵
&minVal 和 &maxVal: 在矩阵 result 中存储的最小值和最大值
&minLoc 和 &maxLoc: 在结果矩阵中最小值和最大值的坐标.
到此这篇关于opencv C++模板匹配的文章就介绍到这了,更多相关opencv 模板匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- c++基础概念笔记
- 通过复盘快速成长(附模板)
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- C++Primer之|C++Primer之 函数探幽
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- QML基础信息