opencv,模板匹配源码
opencv模板匹配6种方法 总结

opencv模板匹配6种方法总结
OpenCV中的模板匹配是一种常见的图像处理技术,用于在图像中查找与
给定模板相匹配的区域。
以下是OpenCV中模板匹配的6种方法:
1. ():这是最基本的方法,它使用滑动窗口在源图像中查找与模板相匹配的区域。
它返回一个包含每个匹配区域位置和相似度的二维数组。
2. _CCOEFF:这是使用余弦相似度作为匹配度量的一种方法。
它计算模板
和源图像之间的余弦相似度,并返回与模板匹配的区域位置和相似度。
3. _CCOEFF_NORMED:这是使用归一化余弦相似度作为匹配度量的一种
方法。
它计算模板和源图像之间的归一化余弦相似度,并返回与模板匹配的区域位置和相似度。
4. _CCORR:这是使用相关系数作为匹配度量的一种方法。
它计算模板和源图像之间的相关系数,并返回与模板匹配的区域位置和相似度。
5. _CCORR_NORMED:这是使用归一化相关系数作为匹配度量的一种方法。
它计算模板和源图像之间的归一化相关系数,并返回与模板匹配的区域位置和相似度。
6. _SQDIFF:这是使用平方差异作为匹配度量的一种方法。
它计算模板和源图像之间的平方差异,并返回与模板匹配的区域位置和差异值。
总结来说,这6种方法都使用了不同的相似度度量来在源图像中查找与模板相匹配的区域。
其中,()是最基本的方法,而其他方法则提供了不同的相似度度量选项。
选择哪种方法取决于具体的应用场景和需求。
1.4利用Opencv进行模板匹配(templatematching)-在图片中查找图片

1.4利⽤Opencv进⾏模板匹配(templatematching)-在图⽚中查找图⽚原理:利⽤相关匹配的算法(cv2.TM_COEFF_NORMED), 简单讲就是⽤此算法把模板计算出来,再计算出图⽚的值,从图⽚中查找出最相近的位置。
import cv2import numpy as npimport imutilsdef template_matching(image_full_path, tmpl_full_path, min_confidence=0.93, ):""":param image_full_path: 输⼊图⽚路径,在该图⽚中查找模板图像:param tmpl_full_path: 模板图⽚,在输⼊图⽚中查找此模板:param min_confidence: 最⼩信⼼度,该⽅法返回⼤于此信⼼度的结果:return: 返回result_dic ==> {信⼼度:(坐标Tuple)}, sorted(confidence_list,reverse=True)==>信⼼度降序排列列表"""img = cv2.imread(image_full_path) # 读取输⼊图⽚gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图,采⽤CV_BGR2GRAY,转换公式Gray = 0.1140*B + 0.5870*G + 0.2989*R# template = cv2.imread(tmpl_full_path, cv2.IMREAD_GRAYSCALE) # 读取模板图⽚的灰度图template = cv2.imread(tmpl_full_path) # 为保证输⼊图⽚与模板⼀致性,两张图⽚⽤相同⽅法读取灰度图⽚template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)# w, h = template.shape[::-1] # 获取模板的宽和⾼(绘图时使⽤,本函数内⽆意义)res = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED) # TM_CCOEFF_NORMED 标准相关匹配loc = np.where(res >= min_confidence) # 在结果中筛选⼤于最⼩信⼼度的结果result_dic = {}confidence_list = []for pt in zip(*loc[::-1]):result_dic[res[pt[1]][pt[0]]] = ptconfidence_list.append(res[pt[1]][pt[0]])# cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 3) # 在⽬标位置绘制⼀个红⾊矩形框,边宽3pxreturn result_dic, sorted(confidence_list, reverse=True)def diff_size_template_matching(image_full_path, tmpl_full_path, min_confidence=0.95, ):""":param image_full_path: 输⼊图⽚路径,在该图⽚中查找模板图像:param tmpl_full_path: 模板图⽚,在输⼊图⽚中查找此模板:param min_confidence: 最⼩信⼼度,该⽅法返回⼤于此信⼼度的结果:return: 返回result_dic ==> {信⼼度:(坐标Tuple)}, sorted(confidence_list,reverse=True)==>信⼼度降序排列列表"""template = cv2.imread(tmpl_full_path)template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) # 获得灰度模板image = cv2.imread(image_full_path)gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 获得灰度图⽚result_dic = {}confidence_list = []for scale in np.linspace(0.2, 1.0, 100)[::-1]: # 1倍到0.2倍分100级变化(级数越⾼,可能获得的匹配精度越⾼,处理越慢)resized = imutils.resize(template, width=int(template.shape[1] * scale)) # 以scale 为倍数改变模板⼤⼩# (w, h) = resized.shape[::-1] # 求改变后的模板宽⾼result = cv2.matchTemplate(gray_img, resized, cv2.TM_CCOEFF_NORMED) # 每次改变都进⾏⼀次匹配loc = np.where(result >= min_confidence) # 在结果中筛选⼤于最⼩信⼼度的结果for pt in zip(*loc[::-1]):result_dic[result[pt[1]][pt[0]]] = ptconfidence_list.append(result[pt[1]][pt[0]])# cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 3)return result_dic, sorted(confidence_list, reverse=True)if__name__ == '__main__':pass。
opencv-matchTemplate模板匹配(大图中寻找小图)

opencv-matchTemplate模板匹配(⼤图中寻找⼩图)单个匹配11.png12.png#include<opencv2/opencv.hpp>#include<iostream>int main(int argc, char** argv) {cv::Mat src = cv::imread("D:/bb/tu/11.png");cv::Mat templ = cv::imread("D:/bb/tu/12.png");cv::Mat ftmp;cv::matchTemplate(src, templ, ftmp,5); //模板匹配/*参数1:src⽤于搜索的输⼊图像, 8U 或 32F, ⼤⼩ W-H参数2:⽤于匹配的模板,和src类型相同,⼤⼩ w-h参数3:匹配结果图像, 类型 32F, ⼤⼩ (W-w+1)-(H-h+1)参数4:⽤于⽐较的⽅法(有六种)cv::TM_SQDIFF=0 该⽅法使⽤平⽅差进⾏匹配,因此最佳的匹配结果在结果为0处,值越⼤匹配结果越差cv::TM_SQDIFF_NORMED=1:该⽅法使⽤归⼀化的平⽅差进⾏匹配,最佳匹配也在结果为0处cv::TM_CCORR=2:相关性匹配⽅法,该⽅法使⽤源图像与模板图像的卷积结果进⾏匹配,因此,最佳匹配位置在值最⼤处,值越⼩匹配结果越差【个⼈测试:匹配性很差】cv::TM_CCORR_NORMED=3:归⼀化的相关性匹配⽅法,与相关性匹配⽅法类似,最佳匹配位置也是在值最⼤处cv::TM_CCOEFF=4:相关性系数匹配⽅法,该⽅法使⽤源图像与其均值的差、模板与其均值的差⼆者之间的相关性进⾏匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值等于0直接表⽰⼆者不相关cv::TM_CCOEFF_NORMED=5:归⼀化的相关性系数匹配⽅法,正值表⽰匹配的结果较好,负值则表⽰匹配的效果较差,也是值越⼤,匹配效果也好*/std::cerr << cv::TM_CCOEFF_NORMED << std::endl;normalize(ftmp, ftmp, 1, 0, cv::NORM_MINMAX);//可以不归⼀化double minVal; double maxVal;cv::Point minLoc;cv::Point maxLoc;minMaxLoc(ftmp, &minVal, &maxVal, &minLoc, &maxLoc); //找到最佳匹配点//从匹配结果图像中找出最佳匹配点rectangle(src, cv::Rect(maxLoc.x, maxLoc.y, templ.cols, templ.rows), cv::Scalar(0, 0, 255), 2, 8);//画出匹配到的矩形框//注意:与⽅法有关,有的是最⼩值是最佳匹配;有的是最⼤值是最佳匹配cv::imshow("src", src);cv::waitKey();return0;}多个匹配13.png14.png#include<opencv2/opencv.hpp>#include<iostream>int main(int argc, char** argv) {cv::Mat src = cv::imread("D:/bb/tu/13.png");cv::Mat tem = cv::imread("D:/bb/tu/14.png");cv::Mat resultImage;matchTemplate(src, tem, resultImage, 5);//模板匹配/*我寻找多个匹配的思路:matchTemplate之后,resultImage中保存了匹配相似度匹配⽅法是cv::TM_CCOEFF_NORMED=5,值越⼤,相似度越⾼相似度⼤于0.97,我就认为匹配⾮常好,所以我要遍历出相似度⼤于0.97的坐标*/std::vector<cv::Point> point;for (int i = 0; i < resultImage.rows; i++) { //i是⾏号for (int j = 0; j < resultImage.cols; j++) { //j是列号float t = resultImage.at<float>(i, j); //返回指点坐标的数据if (t > 0.97) {point.insert(point.end(), cv::Point(j,i));}}}//画出多个匹配for (int i = 0; i < point.size(); i++){rectangle(src, cv::Rect(point[i].x, point[i].y, tem.cols, tem.rows), cv::Scalar(0, 0, 255), 2, 8); }cv::imshow("src", src);cv::waitKey();return0;}。
opencv——matchTemplate模板匹配

opencv——matchTemplate 模板匹配模板匹配的概念和原理模板匹配就是在⼀幅图像中寻找与模板图像最匹配(相似)部分。
具体步骤为从左到右,从上向下计算模板图像与图像覆盖区域的匹配度,匹配程度越⼤,两者相同的可能性越⼤。
实现模板匹配:matchTemplate 函数void matchTemplate(InputArray image, InputArray temp1, OutputArray result, int method);image ,待搜索的图像,且需为 8 位或 32 位浮点型图像。
temp1,搜索模板,需要和原图⽚有⼀样的数据类型,且尺⼨不能⼤于源图像。
result ,⽐较结果的映射图像,其必须为单通道、32 位浮点型图像,⼤⼩为 (image.cols - temp1.cols +1)×(image.rows - temp1.rows +1)method ,匹配⽅法,有 6 种选项:匹配⽅法计算公式平⽅差匹配法TM_SQDIFF归⼀化平⽅差匹配法TM_SQDIFF_NORMED相关匹配法TM_CCORR归⼀化相关匹配法TM_CCORR_NORMED系数匹配法TM_CCOEFF其中化相关系数匹配法TM_CCOEFF_NORMED代码⽰例:#include<opencv.hpp>#include<iostream>#include<string>using namespace std;using namespace cv;Mat src, temp;int method = 0;void ChangeMethod(int, void*) {switch (method){case0:method = TM_SQDIFF;break;case1:method = TM_SQDIFF_NORMED;break;case2:method = TM_CCORR;break;case3:method = TM_CCORR_NORMED;break;case4:method = TM_CCOEFF;break;case5:method = TM_CCOEFF_NORMED;break;}Mat result;matchTemplate(src, temp, result, method);imshow("result", result);Mat dst = src.clone();double mxValue, mnValue;Point mxPoint, mnPoint;minMaxLoc(result, &mnValue, &mxValue, &mnPoint, &mxPoint);//if (method == TM_SQDIFF || method == TM_SQDIFF_NORMED) {rectangle(dst, mnPoint, Point(mnPoint.x + temp.cols, mnPoint.y + temp.rows), Scalar(0, 0, 255)); }else{rectangle(dst, mxPoint, Point(mxPoint.x + temp.cols, mxPoint.y + temp.rows), Scalar(0, 0, 255)); }imshow("dst", dst);}int main() {src = imread("C:/Users/齐明洋/Desktop/1.jpg");temp = imread("C:/Users/齐明洋/Desktop/a.jpg");imshow("src", src);imshow("temp", temp);namedWindow("dst");createTrackbar("method", "dst", &method, 5, ChangeMethod);ChangeMethod(0, 0);waitKey(0);}效果演⽰:原图和模板:TM_SQDIFF ⽅法TM_SQDIFF_NORMED ⽅法TM_CCORR ⽅法TM_CCORR_NORMED ⽅法TM_CCOEFF ⽅法TM_CCOEFF_NORMED ⽅法。
OpenCV实战(1)——图像相似度算法(比对像素方差,感知哈希算法,模板匹配(OCR数字。。。

OpenCV实战(1)——图像相似度算法(⽐对像素⽅差,感知哈希算法,模板匹配(OCR数字。
如果需要处理的原图及代码,请移步⼩编的GitHub地址 传送门: 如果点击有误:https:///LeBron-Jian/ComputerVisionPractice 最近⼀段时间学习并做的都是对图像进⾏处理,其实⾃⼰也是新⼿,各种尝试,所以我这个门外汉想总结⼀下⾃⼰学习的东西,图像处理的流程。
但是动起笔来想总结,⼀下却不知道⾃⼰要写什么,那就把⾃⼰做过的相似图⽚搜索的流程整理⼀下,想到什么说什么吧。
⼀:图⽚相似度算法(对像素求⽅差并⽐对)的学习1.1 算法逻辑1.1.1 缩放图⽚ 将需要处理的图⽚所放到指定尺⼨,缩放后图⽚⼤⼩由图⽚的信息量和复杂度决定。
譬如,⼀些简单的图标之类图像包含的信息量少,复杂度低,可以缩放⼩⼀点。
风景等复杂场景信息量⼤,复杂度⾼就不能缩放太⼩,容易丢失重要信息。
根据⾃⼰需求,弹性的缩放。
在效率和准确度之间维持平衡。
1.1.2 灰度处理 通常对⽐图像相似度和颜⾊关系不是很⼤,所以处理为灰度图,减少后期计算的复杂度。
如果有特殊需求则保留图像⾊彩。
1.1.3 计算平均值 此处开始,与传统的哈希算法不同:分别依次计算图像每⾏像素点的平均值,记录每⾏像素点的平均值。
每⼀个平均值对应着⼀⾏的特征。
1.1.4 计算⽅差 对得到的所有平均值进⾏计算⽅差,得到的⽅差就是图像的特征值。
⽅差可以很好的反应每⾏像素特征的波动,既记录了图⽚的主要信息。
1.1.5 ⽐较⽅差 经过上⾯的计算之后,每张图都会⽣成⼀个特征值(⽅差)。
到此,⽐较图像相似度就是⽐较图像⽣成⽅差的接近成程度。
⼀组数据⽅差的⼤⼩可以判断稳定性,多组数据⽅差的接近程度可以反应数据波动的接近程度。
我们不关注⽅差的⼤⼩,只关注两个⽅差的差值的⼤⼩。
⽅差差值越⼩图像越相似!1.2 代码:import cv2import matplotlib.pyplot as plt#计算⽅差def getss(list):#计算平均值avg=sum(list)/len(list)#定义⽅差变量ss,初值为0ss=0#计算⽅差for l in list:ss+=(l-avg)*(l-avg)/len(list)#返回⽅差return ss#获取每⾏像素平均值def getdiff(img):#定义边长Sidelength=30#缩放图像img=cv2.resize(img,(Sidelength,Sidelength),interpolation=cv2.INTER_CUBIC)#灰度处理gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#avglist列表保存每⾏像素平均值avglist=[]#计算每⾏均值,保存到avglist列表for i in range(Sidelength):avg=sum(gray[i])/len(gray[i])avglist.append(avg)#返回avglist平均值return avglist#读取测试图⽚img1=cv2.imread("james.jpg")diff1=getdiff(img1)print('img1:',getss(diff1))#读取测试图⽚img11=cv2.imread("durant.jpg")diff11=getdiff(img11)print('img11:',getss(diff11))ss1=getss(diff1)ss2=getss(diff11)print("两张照⽚的⽅差为:%s"%(abs(ss1-ss2))) x=range(30)plt.figure("avg")plt.plot(x,diff1,marker="*",label="$jiames$") plt.plot(x,diff11,marker="*",label="$durant$") plt.title("avg")plt.legend()plt.show()cv2.waitKey(0)cv2.destroyAllWindows() 两张原图: 图像结果如下:img1: 357.03162469135805img11: 202.56193703703704两张照⽚的⽅差为:154.469687654321 实验环境开始设置了图⽚像素值,⽽且进⾏灰度化处理,此⽅法⽐对图像相似对不同的图⽚⽅差很⼤,结果很明显,但是对⽐⽐较相似,特别相似的图⽚不适应。
python opencv模板匹配参数详解

python opencv模板匹配参数详解在使用pythonopencv进行模板匹配时,需要了解一些参数的含义和作用,以便得到更好的匹配效果。
1. 模板匹配方法opencv中提供了多种模板匹配方法,包括cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_SQDIFF、cv2.TM_SQDIFF_NORMED。
其中,TM_CCOEFF、TM_CCORR、TM_SQDIFF分别表示相关系数匹配法、相关性匹配法、平方差匹配法;NORMED表示对结果进行归一化处理。
2. 模板和待匹配图像的大小模板和待匹配图像的大小对匹配效果有很大影响。
如果模板大小和待匹配图像大小相差较大,会导致匹配不准确。
因此,在进行模板匹配时,应该根据实际情况选择合适的模板大小和待匹配图像大小。
3. 匹配结果的阈值在进行模板匹配时,需要设置一个阈值来确定匹配程度。
如果设置的阈值过高,则可能导致无法匹配;如果设置的阈值过低,则可能导致误匹配。
因此,在设置匹配阈值时,应该根据实际情况进行调整。
4. 匹配结果的位置模板匹配后,会返回匹配结果的位置。
通常情况下,匹配结果的位置是模板在待匹配图像中的左上角顶点坐标。
如果需要得到匹配结果的中心坐标,则可以根据模板的大小进行计算。
5. 匹配结果的可靠性在进行模板匹配时,可能会出现多个匹配结果的情况。
为了提高匹配结果的可靠性,可以采用多个模板进行匹配,或者对匹配结果进行滤波处理。
总之,了解模板匹配的各种参数和方法,能够帮助我们得到更好的匹配效果。
同时,也需要根据实际情况进行调整,以达到最优的匹配结果。
python opencv模板匹配参数详解

python opencv模板匹配参数详解Python OpenCV模板匹配参数详解在图像处理和计算机视觉中,模板匹配是一种常用的算法。
它用于在一幅图像中查找特定的目标。
在Python OpenCV中,模板匹配是通过cv2.matchTemplate()函数实现的。
该函数接受两个参数:输入图像和模板图像。
它返回一个结果数组,该数组指示了每个像素处的匹配分值。
在进行模板匹配时,参数的选择至关重要。
错误的参数选择可能会导致结果不准确。
因此,本文将详细介绍Python OpenCV模板匹配的参数,帮助您获取更准确的匹配结果。
参数介绍在Python OpenCV中,cv2.matchTemplate()函数的参数如下所示:cv2.matchTemplate(img,template,method,result=No ne,mask=None)其中,img是指用于查找目标的输入图像,template 是指将在img上查找的模板图像。
method是指使用的匹配方法,result是可选的输出数组,mask是可选的掩码图像。
在这些参数中,method是最关键的参数。
它决定了匹配算法的选择。
以下是常用的匹配方法:1. TM_SQDIFF这是平方差匹配法。
它在模板和输入图像之间计算像素值差的平方,并返回最佳匹配的位置。
它的数学表达式如下:R(x,y)=∑(i,j)(T(i,j)−I(x+i,y+j))^2其中,I是输入图像,T是模板图像。
R(x,y)是在点(x,y)处的匹配分值。
2. TM_SQDIFF_NORMED这是归一化的平方差匹配法。
它使用像素值差的平方来计算匹配分值,并将分值标准化为0到1之间的范围。
3. TM_CCORR这是相关性匹配法。
它计算模板和输入图像之间的互相关,并返回最佳匹配的位置。
4. TM_CCORR_NORMED这是归一化的相关性匹配法。
与TM_CCORR相似,但将分值标准化为0到1之间的范围。
OpenCV模板匹配算法详解

OpenCV模板匹配算法详解1 理论介绍模板匹配是在⼀幅图像中寻找⼀个特定⽬标的⽅法之⼀,这种⽅法的原理⾮常简单,遍历图像中的每⼀个可能的位置,⽐较各处与模板是否“相似”,当相似度⾜够⾼时,就认为找到了我们的⽬标。
OpenCV提供了6种模板匹配算法:1. 平⽅差匹配法CV_TM_SQDIFF2. 归⼀化平⽅差匹配法CV_TM_SQDIFF_NORMED3. 相关匹配法CV_TM_CCORR4. 归⼀化相关匹配法CV_TM_CCORR_NORMED5. 相关系数匹配法CV_TM_CCOEFF6. 归⼀化相关系数匹配法CV_TM_CCOEFF_NORMED⽤T表⽰模板图像,I表⽰待匹配图像,切模板图像的宽为w⾼为h,⽤R表⽰匹配结果,匹配过程如下图所⽰:上述6中匹配⽅法可⽤以下公式进⾏描述:2 ⽰例代码下⾯给出⽅法6的python代码1import numpy as np2import cv234def EM(pModel, width, height):5 sum = np.double(0.0)6for i in range(0,height):7for j in range(0,width):8 sum += pModel[i][j]9return sum1011def EM2(pModel, width, height):12 sum = np.double(0.0)13for i in range(0,height):14for j in range(0,width):15 sum += pModel[i][j]*1.0*pModel[i][j]16return sum1718def EI(pToSearch, l, h, u, v, pModel, width, height):19 sum = np.double(0.0)20 roi = pToSearch[v:v+height, u:u+width]21for i in range(0,height):22for j in range(0,width):23 sum += roi[i][j]24return sum2526def EI2(pToSearch, l, h, u, v, pModel, width, height):27 sum = np.double(0.0)28 roi = pToSearch[v:v+height, u:u+width]29for i in range(0,height):30for j in range(0,width):31 sum += roi[i][j]*1.0*roi[i][j]32return sum3334def EIM(pToSearch, l, h, u, v, pModel, width, height):35 sum = np.double(0.0)36 roi = pToSearch[v:v+height, u:u+width]37for i in range(0,height):38for j in range(0,width):39 sum += pModel[i][j]*1.0*roi[i][j]40return sum4142def Match(pToSearch, l, h, pModel, width, height):43 uMax = l-width44 vMax = h-height45 N = width*height46 len = (uMax+1)*(vMax+1)47 MatchRec = [0.0 for x in range(0, len)]48 k = 04950 M = EM(pModel,width,height)51 M2 = EM2(pModel,width,height)52for p in range(0, uMax+1):53for q in range(0, vMax+1):54 I = EI(pToSearch,l,h,p,q,pModel,width,height)55 I2 = EI2(pToSearch,l,h,p,q,pModel,width,height)56 IM = EIM(pToSearch,l,h,p,q,pModel,width,height)5758 numerator=(N*IM-I*M)*(N*IM-I*M)59 denominator=(N*I2-I*I)*(N*M2-M*M)6061 ret = numerator/denominator62 MatchRec[k]=ret63 k+=16465 val = 066 k = 067 x = y = 068for p in range(0, uMax+1):69for q in range(0, vMax+1):70if MatchRec[k] > val:71 val = MatchRec[k]72 x = p73 y = q74 k+=175print"val: %f"%val76return (x, y)7778def main():79 img = cv2.imread('niu.jpg', cv2.IMREAD_GRAYSCALE)80 temp = cv2.imread('temp.png', cv2.IMREAD_GRAYSCALE)8182print temp.shape83 imgHt, imgWd = img.shape84 tempHt, tempWd = temp.shape85#print EM(temp, tempWd, tempHt)86 (x, y) = Match(img, imgWd, imgHt, temp, tempWd, tempHt)87 cv2.rectangle(img, (x, y), (x+tempWd, y+tempHt), (0,0,0), 2)88 cv2.imshow("temp", temp)89 cv2.imshow("result", img)90 cv2.waitKey(0)91 cv2.destroyAllWindows()9293if__name__ == '__main__':94 main()归⼀化相关系数匹配法代码58⾏中的N就是公式(6)中的w*h,由于python代码运⾏速度⽐较慢,代码的58、59⾏相当于对公式(6)的分⼦分母都进⾏了平⽅操作,并且分⼦分母都乘以了N⽅,以减⼩计算量,所以代码61⾏的ret相当于公式(6)中的R(x,y)的平⽅,为了更快的进⾏算法验证,⽤上述代码进⾏验证时请尽量选⽤较⼩的匹配图像及模板图像,下图显⽰了我的匹配结果(待匹配图像295x184模板69x46⽤了⼗⼏分钟):3 OpenCV源码较新版本的OpenCV库中的模板匹配已经进⾏了较多的算法改进,直接看新版本中的算法需要了解很多相关理论知识,所以我们结合OpenCV0.9.5的源码进⾏讲解,该版本的源码基本上是C风格代码更容易进⾏理解(如果要对OpenCV源码进⾏研究,建议⽤该版本进⾏⼊门),仍以归⼀化相关系数匹配法为例进⾏分析。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
竭诚为您提供优质文档/双击可除opencv,模板匹配源码
篇一:opencv模板匹配
opencv模板匹配
V1.0
zhbrain
1、2、1)2)3、1)2)
opencv模板匹配原理--没有金字塔................................................. ..........................4模板匹配—使用金字塔................................................. ...............................................5主要函数简介................................................. ................................................... ........5程序流程.................................................
................................................... ................5验证和结果................................................. ................................................... ...............5实验环境................................................. ................................................... ................5实验结果................................................. ................................................... . (5)
opencv模板匹配
1、opencv模板匹配原理--没有金字塔
函数:
cvmatchtemplate(source,target,result,method);说明:source:源图像,一般我们使用灰度图像;如果source 为Rgb图像,使用函数cvcvtcolor(source,dst,cV_Rgb2gRay)这里,dst为转换后的灰度图像。
target:模板图像。
Result:匹配后的矩阵,width=s_width–t_taget+1,height=s_height–t_height+1使用函数
iplimage*result=cvcreateimage(resultsize,ipl_depth_ 32F,1)获得。
method:cV_tm_sqdiFF:
cV_tm_sqdiFF_noRmed
cV_tm_ccoRR
cV_tm_ccoRR_noRmed
cV_tm_ccoeFF
cV_tm_ccoeFF_noRmed
一般的,使用cV_tm_ccoRR_noRmed,存在的问题是没有使用去均值,可能对亮度变化比较敏感。
程序流程:读入模板和源图像建立result图像模板匹配使用cvminmaxloc找到最大(最小)值输出结果
2、模板匹配—使用金字塔
cvpyrdown(src,dst,filter)
src:源图像,尺寸为width×height
dst:经过一次下采样得到的图像,尺寸为width/2×height/2filter:卷积滤波器,目前仅支持cV_gaussian_5×5
cvsetimageRoi(image,rect)
image:源图像,经过这个函数后,图像大小变为rect (长方形)rect:(x,y,width,height)(x,y)为长方形的左上角坐标,width,height为长方形的宽和高。
1)主要函数简介
2)程序流程
读入模板和源图像cypyrdown(假设只有一次)得到源
图像和模板下采样图像设置这里的匹配result图像模板匹配使用cvminmaxloc找到最大值以这个最大值为中心(x1,y1),将源图像裁剪为width=w_template+7,
height=h_template+7图像,rect左上角坐标为
x2=x1-w_template/2-3y2=y1-h_template/2-3再次建立result1图像模板匹配使用cvminmaxloc找到最大值
3、验证和结果
corei52410mthinkpadx220主机ubuntu10.04–gcc
源图像大小360×360,模板大小140×140采用一级金字塔
验证方法:源图像s、模板t,分别采用加噪声和更改亮度
1)实验环境
2
模板匹配程序耗时约10ms。
篇二:模板匹配
opencv学习_11(模板匹配(包括单模板和多模板))
分类:opencv学习笔记20xx-11-0821:1676(opencv,模板匹配源码)63人阅读评论(6)收藏举报
模板匹配源码opencv
模板匹配——在一幅图像中匹配与模板相似的单个或
者多个目标
(1)目标匹配函数:
cvmatchtemplate(constcvarr*image,constcvarr*templ, cvarr*result,intmethod);
image待搜索图像
templ模板图像
Result匹配结果用来存放通过以下方法计算出滑动窗口与模板的相似值
method计算匹配程度的方法
关于匹配方法,使用不同的方法产生的结果的意义可能不太一样,有些返回的值越大表示匹配程度越好,而有些方法返回的值越小表示匹配程度越好
关于参数method:
cV_tm_sqdiFF平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
cV_tm_ccoRR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
cV_tm_ccoeFF相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
cV_tm_sqdiFF_noRmed 归一化平方差匹配法
cV_tm_ccoRR_noRmed归一化相关匹配法
cV_tm_ccoeFF_noRmed归一化相关系数匹配法
(2):接着就是要找最值以及最值对应的坐标。