沈阳建站费用,宝安高端网站设计怎么样,国外设计网站排名,莱芜网站制作图像模板匹配原理 例如给定一张图片#xff0c;如上图大矩阵所示#xff0c;然后给定一张模板图像#xff0c;如上图小矩阵。 我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域#xff0c;…图像模板匹配原理 例如给定一张图片如上图大矩阵所示然后给定一张模板图像如上图小矩阵。 我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域通过比较灰色区域中的内容与模板中的内容两者如果一致那么则认定两者是相似的从而实现了在目标图像中寻找模板图像的匹配过程若两者不一致比如上图阴影区域中第一个像素值为3而模板中第一个像素值为4那么两者之间存在差距,通过每一个对应像素之间进行一次度量计算作为模板匹配中的匹配系数(度量矩阵)之后移动图像中的阴影区域一次移动一个像素从左往右从上往下)再次对阴影区域所对应的像素值与模板中的像素进行度量计算得到模板匹配系数每移动一次阴影区域就可以得到一个模板匹配系数之后寻找这个系数所代表的匹配的最佳结果的位置即为最终的匹配结果(相似程度最高)。 如上图所示用TM_CCORR_NORMED方法处理后的result为度量矩阵(即匹配系数),最白的位置代表最高的匹配系数以系数最佳(最大或者最小看你用什么算法)为顶点即图像的左上角点opencv中图像坐标原点为左上角点y向下值越大x向右值越大做一个长宽和模板图像一样大小的矩形框即为最佳匹配的区域。
实际中我们可以使用函数minMaxLoc来定位矩阵R中的最大值最小值。
图像模板匹配函数
matchTenplate()
vodi cv::matchTemplate(InputArray image,InputArray templ,OutputArray result,int method,InputArray mask noArray())
·image:待模板匹配的原图像图像数据类型为CV_8U和CV_32F两者之一。
·templ:模板图像需要与image具有相同的数据类型但是尺寸不能大于image。
·result:模板匹配结果输出图像图像数据类型为CV_32F。如果image的尺寸为W*H模板图像尺寸为w*h,则输出图像的尺寸为(W-w1) * (H-h1)。
·method模板匹配方法标志。
·mask:匹配模板的掩码必须与模板图像具有相同的数据类型和尺寸默认情况下不设置目前仅支持在TM_SQDIFF和TM_CCORR_NORMED这两种匹配方法时使用。
图像模板匹配方法标志 ·平方差匹配TM_SQDIFF:
最好匹配为0匹配程度越低值越大。 ·标准平方差匹配TM_SQDIFF_NORMED: ·相关匹配TM_CCORR:
此类方法采用模板与图像间的乘法操作所以较大的数表示匹配程度高0表示最差的匹配效果。 ·标准相关匹配TM_CCORR_NORMED: ·系数匹配TM_CCOEFF:
此类方法将模板对其均值的相对值与图像对其均值的相对值进行匹配1表示完美匹配-1表示糟糕匹配0表示没有任何相关性(随机序列)。 ·标准系数匹配:TM_CCOEFF_NORMED: 随着从简单的测量(平方差)到更复杂的测量(相关系数)我们可获得越来越准确的匹配(也意味着越来越大的计算代价),最好的办法是对所有这些设置多做一些测试实验以便为自己的应用选择同时兼顾速度和精度的最佳方案。
示例:
#include opencv2/opencv.hpp
#include iostreamusing namespace cv; //opencv的命名空间
using namespace std;//主函数
int main()
{Mat img imread(E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png);Mat temp imread(E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lena_face.png);//模板图像Mat result; //匹配结果matchTemplate(img, temp, 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 temp.cols, maxLoc.y temp.rows), Scalar(0, 0, 255), 2);//矩形框绘制
circle(img, Point(maxLoc.x, maxLoc.y), 1, Scalar(255, 0, 120), 30); //最大值点的位置imshow(原图像, img);imshow(模板图像, temp);imshow(result, result);waitKey(0);//等待函数用于显示图像return 0;}