python代码:

1 import numpy as np2 import cv23 4 def EM(pModel, width, height):5     sum = np.double(0.0)6     for i in range(0,height):7         for j in range(0,width):8             sum += pModel[i][j]9     return sum
10
11 def EM2(pModel, width, height):
12     sum = np.double(0.0)
13     for i in range(0,height):
14         for j in range(0,width):
15             sum += pModel[i][j]*1.0*pModel[i][j]
16     return sum
17
18 def EI(pToSearch, l, h, u, v, pModel, width, height):
19     sum = np.double(0.0)
20     roi = pToSearch[v:v+height, u:u+width]
21     for i in range(0,height):
22         for j in range(0,width):
23             sum += roi[i][j]
24     return sum
25
26 def EI2(pToSearch, l, h, u, v, pModel, width, height):
27     sum = np.double(0.0)
28     roi = pToSearch[v:v+height, u:u+width]
29     for i in range(0,height):
30         for j in range(0,width):
31             sum += roi[i][j]*1.0*roi[i][j]
32     return sum
33
34 def EIM(pToSearch, l, h, u, v, pModel, width, height):
35     sum = np.double(0.0)
36     roi = pToSearch[v:v+height, u:u+width]
37     for i in range(0,height):
38         for j in range(0,width):
39             sum += pModel[i][j]*1.0*roi[i][j]
40     return sum
41
42 def Match(pToSearch, l, h, pModel, width, height):
43     uMax = l-width
44     vMax = h-height
45     N = width*height
46     len = (uMax+1)*(vMax+1)
47     MatchRec = [0.0 for x in range(0, len)]
48     k = 0
49
50     M = EM(pModel,width,height)
51     M2 = EM2(pModel,width,height)
52     for p in range(0, uMax+1):
53         for 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)
57
58             numerator=(N*IM-I*M)*(N*IM-I*M)
59             denominator=(N*I2-I*I)*(N*M2-M*M)
60
61             ret = numerator/denominator
62             MatchRec[k]=ret
63             k+=1
64
65     val = 0
66     k = 0
67     x = y = 0
68     for p in range(0, uMax+1):
69         for q in range(0, vMax+1):
70             if MatchRec[k] > val:
71                 val = MatchRec[k]
72                 x = p
73                 y = q
74             k+=1
75     print "val: %f"%val
76     return (x, y)
77
78 def main():
79     img = cv2.imread('niu.jpg', cv2.IMREAD_GRAYSCALE)
80     temp = cv2.imread('temp.png', cv2.IMREAD_GRAYSCALE)
81
82     print temp.shape
83     imgHt, imgWd = img.shape
84     tempHt, tempWd = temp.shape
85     #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()
92
93 if __name__ == '__main__':
94     main()归一化相关系数匹配法


/*
* pImage: 待匹配图像
* image: 待匹配图像宽(width*depth并已4字节对齐)
* roiSize: 待匹配图像尺寸
* pTemplate: 模板图像
* templStep: 模板图像宽
* templSize: 模板图像尺寸
* pResult: 匹配结果
* resultStep: 匹配结果宽
* pBuffer: 中间结果数据缓存
*/
IPCVAPI_IMPL( CvStatus, icvMatchTemplate_CoeffNormed_32f_C1R,(const float *pImage, int imageStep, CvSize roiSize,const float *pTemplate, int templStep, CvSize templSize,float *pResult, int resultStep, void *pBuffer) )
{float *imgBuf = 0;              // 待匹配图像相关数据float *templBuf = 0;            // 模板图像数据double *sumBuf = 0;             // 待匹配图像遍历块单行和double *sqsumBuf = 0;           // 待匹配图像遍历块单行平方和double *resNum = 0;             // 模板图像和待匹配图像遍历块内积double *resDenom = 0;           // 待匹配图像遍历块累加和及待匹配图像遍历块平方累加和double templCoeff = 0;          // 模板图像均分差倒数double templSum = 0;            // 模板图像累加和int winLen = templSize.width * templSize.height;double winCoeff = 1. / (winLen + DBL_EPSILON);          // + DBL_EPSILON 加一个小整数防止分母为零CvSize resultSize = cvSize( roiSize.width - templSize.width + 1,roiSize.height - templSize.height + 1 );int x, y;// 计算并为imgBuf、templBuf、sumBuf、sqsumBuf、resNum、resDenom分配存储空间CvStatus result = icvMatchTemplateEntry( pImage, imageStep, roiSize,pTemplate, templStep, templSize,pResult, resultStep, pBuffer,cv32f, 1, 1,(void **) &imgBuf, (void **) &templBuf,(void **) &sumBuf, (void **) &sqsumBuf,(void **) &resNum, (void **) &resDenom );if( result != CV_OK )return result;imageStep /= sizeof_float;templStep /= sizeof_float;resultStep /= sizeof_float;/* calc common statistics for template and image */{const float *rowPtr = (const float *) imgBuf;double templSqsum = icvCrossCorr_32f_C1( templBuf, templBuf, winLen );          // 模板图像平方累加和templSum = icvSumPixels_32f_C1( templBuf, winLen );                             // 模板图像累加和templCoeff = (double) templSqsum - ((double) templSum) * templSum * winCoeff;   // 模板图像均方差的平方templCoeff = icvInvSqrt64d( fabs( templCoeff ) + FLT_EPSILON );                 // 模板图像均方差倒数for( y = 0; y < roiSize.height; y++, rowPtr += templSize.width ){sumBuf[y] = icvSumPixels_32f_C1( rowPtr, templSize.width );                 // 待匹配图像按模板图像宽度求每行之和(遍历位置第一列)sqsumBuf[y] = icvCrossCorr_32f_C1( rowPtr, rowPtr, templSize.width );       // 待匹配图像按模板图像宽度求每行平方之和(遍历位置第一列)}}/* main loop - through x coordinate of the result */for( x = 0; x < resultSize.width; x++ ){double sum = 0;double sqsum = 0;float *imgPtr = imgBuf + x;                                                      // 待匹配图像起始位置/* update sums and image band buffer */                                          // 如果不是第1列需重新更新sumBuf,更新后sumBuf为遍历位置第x列每行之和(行宽为模板图像宽)if( x > 0 ){const float *src = pImage + x + templSize.width - 1;float *dst = imgPtr - 1;float out_val = dst[0];dst += templSize.width;for( y = 0; y < roiSize.height; y++, src += imageStep, dst += templSize.width ){float in_val = src[0];sumBuf[y] += in_val - out_val;sqsumBuf[y] += (in_val - out_val) * (in_val + out_val);out_val = dst[0];dst[0] = (float) in_val;}}for( y = 0; y < templSize.height; y++ )                                          // 求遍历位置第x列,第1行处遍历块累加和sum及平方累加和sqsum{sum += sumBuf[y];sqsum += sqsumBuf[y];}for( y = 0; y < resultSize.height; y++, imgPtr += templSize.width ){double res = icvCrossCorr_32f_C1( imgPtr, templBuf, winLen );               // 求模板图像和待匹配图像y行x列处遍历块的内积if( y > 0 )                                                                 // 如果不是第1行需更新遍历块累加和sum及平方累加和sqsum{sum -= sumBuf[y - 1];sum += sumBuf[y + templSize.height - 1];sqsum -= sqsumBuf[y - 1];sqsum += sqsumBuf[y + templSize.height - 1];}resNum[y] = res;resDenom[y] = sum;resDenom[y + resultSize.height] = sqsum;}for( y = 0; y < resultSize.height; y++ ){double sum = ((double) resDenom[y]);double wsum = winCoeff * sum;double res = ((double) resNum[y]) - wsum * templSum;double nrm_s = ((double) resDenom[y + resultSize.height]) - wsum * sum;res *= templCoeff * icvInvSqrt64d( fabs( nrm_s ) + FLT_EPSILON );pResult[x + y * resultStep] = (float) res;}}return CV_OK;
}


转自:模板匹配算法详细解说

模板匹配—归一化相关系数匹配算法相关推荐

  1. OpenCV-Python:模板匹配

    啥叫模板匹配 模板匹配就是在大图中找小图,也就说在一幅图像中寻找另一幅模板图像的位置: OpenCV使用 cv2.matchTemplate() 实现模板匹配. import cv2 import n ...

  2. python模板匹配_OpenCV-Python:模板匹配

    啥叫模板匹配 模板匹配就是在大图中找小图,也就说在一幅图像中寻找另一幅模板图像的位置: OpenCV使用 cv2.matchTemplate() 实现模板匹配. importcv2importnump ...

  3. python 模板匹配多个物体

    参考: https://www.jianshu.com/p/c20adfa72733 平方差匹配CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配值为0 归一化平方差匹配CV_TM_SQDIF ...

  4. 【OpenCV + Python】模板匹配

    模板匹配是用来在一副大图中搜寻查找模版图像位置的方法.OpenCV 为我们提供了函数:cv2.matchTemplate().和2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置 ...

  5. MFC与Halcon混合编程--基于相关性的模板匹配

    文章目录 前言 一.基于相关性的模板匹配 二.基于相关性的模板匹配的代码实现 1.Halcon中完成基于相关性的模板匹配 2.MFC实现与Halcon混合编程 3.实现效果 前言 正在学习Halcon ...

  6. python 模板匹配对比

    对于形变,以下两种 相关系数的效果比较好: cv2.TM_CCOEFF cv2.TM_CCOEFF_NORMED 其余四种会误检. 平方差匹配CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配 ...

  7. java opencv 模板匹配算法_OpenCV探索之路(九):模板匹配

    模板匹配的作用在图像识别领域作用可大了.那什么是模板匹配? 模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术. 说的有点抽象,下面给个例子说明就很明白了. 在上面这幅全明 ...

  8. OpenCV(二十)模板匹配

    目录 一.基础理论 1.作用与过程 2.原理 3.函数matchTemplate 二.代码 三.效果 参考资料 一.基础理论 1.作用与过程 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域, ...

  9. OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配

    直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化 原理 图像的直方图是什么? 直方图是图像 ...

最新文章

  1. HOGDescriptor 描述类
  2. HQL语句中数据类型转换,及hibernate中createQuery执行hql报错
  3. 手机权限的一些问题记录
  4. 纠错编码基本实验matlab,纠错编码基本实验matlab实现包含源代码
  5. ubuntu中以root权限打开文件(夹)
  6. QTP对象TO与RO
  7. 大数据的说法 正确的是_前端测试题:(解析)用于播放音频文件的正确HTML5元素是?...
  8. make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)
  9. 洛谷P1852 奇怪的字符串
  10. jsencrypt代码分析——openssl的rsa加密解密在js的实现
  11. Gentoo解决Windows系统txt文本中文乱码问题
  12. Atitit.工作流系统的本质是dsl 图形化的dsl  4gl
  13. [改善Java代码]使用静态内部类提高封装性
  14. 一个APP从启动到主页面显示经历了哪些过程?跳槽薪资翻倍
  15. live2d模型二次开发
  16. vb adodc连接mysql_VB中用ADODC控件连接ACCESS数据库
  17. Web 前端视频资源分享(Bootstrap/Vue/小程序)
  18. Matpower建模
  19. 程序人生 - 游戏帧数很高,为什么还是会卡顿?
  20. 全网最最最详细的软件著作权申请步骤

热门文章

  1. Redis学习-String
  2. VMware Fusion指定虚拟机IP
  3. iOS:quartz2D绘图(给图形绘制阴影)
  4. Window7系统 中常见的进程命令分析?
  5. 旅游资源及线路管理系统
  6. scipy.spatial.distance 与 sklearn cosine_similarity
  7. 分布式系统设计的概念
  8. ctype_digit()函数
  9. UML第一次作业:UML用例图绘制
  10. DPDK架构与特点(转)