Recog.cpp
上传用户:xjt2008yy
上传日期:2010-01-18
资源大小:272k
文件大小:4k
源码类别:

生物技术

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "cdib.h"
  3. #include "math.h"
  4. #include "GlobalApi.h"
  5. /*************************************************************************
  6.  *
  7.  * 函数名称:
  8.  *   TemplateMatch()
  9.  *
  10.  * 输入参数:
  11.  *   CDib* pDibSrc - 指向CDib类的指针,含有待匹配图象信息 
  12.  *   CDib* pDibTemplate - 指向CDib类的指针,含有模板图象信息 
  13.  *
  14.  * 返回值:
  15.  *   BOOL - 成功则返回TRUE,否则返回FALSE
  16.  *
  17.  * 说明:
  18.  *   该函数将对图象进行模板匹配操作。需要注意的是,此程序只处理256灰度级的
  19.  *图象。
  20.  *
  21.  *************************************************************************
  22.  */
  23. BOOL TemplateMatch(CDib* pDibSrc, CDib* pDibTemplate)
  24. {
  25. // 指向源图像的指针
  26. LPBYTE lpSrc,lpTemplateSrc;
  27. // 指向缓存图像的指针
  28. LPBYTE lpDst;
  29. //循环变量
  30. long i;
  31. long j;
  32. long m;
  33. long n;
  34. //中间结果
  35. double dSigmaST;
  36. double dSigmaS;
  37. double dSigmaT;
  38. //相似性测度
  39. double R;
  40. //最大相似性测度
  41. double  dbMaxR;
  42. //最大相似性出现位置
  43. int nMaxWidth;
  44. int nMaxHeight;
  45. //像素值
  46. unsigned char unchPixel;
  47. unsigned char unchTemplatePixel;
  48. // 获得图象数据存储的高度和宽度
  49. CSize sizeSaveImage;
  50. sizeSaveImage = pDibSrc->GetDibSaveDim();
  51. // 获得模板图象数据存储的高度和宽度
  52. CSize sizeSaveTemplate;
  53. sizeSaveTemplate = pDibTemplate->GetDibSaveDim();
  54. // 暂时分配内存,以保存新图像
  55. CDib* pDibNew;
  56. pDibNew = new CDib;
  57. // 如果分配内存失败,则推出
  58. if(!CopyDIB(pDibSrc,pDibNew)){
  59. // 释放已分配内存
  60. pDibNew->Empty();
  61. // 返回
  62. return FALSE;
  63. }
  64. // 初始化新分配的内存,设定初始值为255
  65. lpDst = (LPBYTE)pDibNew->m_lpImage; 
  66. memset(lpDst, (BYTE)255, pDibNew->GetSizeImage());
  67. // 图象的高度
  68. int nImageHeight ;
  69. nImageHeight = pDibSrc->m_lpBMIH->biHeight;
  70. // 图象的宽度
  71. int nImageWidth;
  72. nImageWidth = pDibSrc->m_lpBMIH->biWidth;
  73. // 模板图象的高度
  74. int nTemplateHeight;
  75. nTemplateHeight = pDibTemplate->m_lpBMIH->biHeight;
  76. // 模板图象的宽度
  77. int nTemplateWidth;
  78. nTemplateWidth = pDibTemplate->m_lpBMIH->biWidth;
  79. //计算dSigmaT
  80. dSigmaT = 0;
  81. for (n = 0;n < nTemplateHeight ;n++)
  82. {
  83. for(m = 0;m < nTemplateWidth ;m++)
  84. {
  85. // 指向模板图像倒数第j行,第i个象素的指针
  86. lpTemplateSrc = (LPBYTE)pDibTemplate->m_lpImage + sizeSaveTemplate.cx * n + m;
  87. unchTemplatePixel = (unsigned char)*lpTemplateSrc;
  88. dSigmaT += (double)unchTemplatePixel*unchTemplatePixel;
  89. }
  90. }
  91. //找到图像中最大相似性的出现位置
  92.  dbMaxR = 0.0;
  93. for (j = 0;j < nImageHeight - nTemplateHeight +1 ;j++)
  94. {
  95. for(i = 0;i < nImageWidth - nTemplateWidth + 1;i++)
  96. {
  97. dSigmaST = 0;
  98. dSigmaS = 0;
  99. for (n = 0;n < nTemplateHeight ;n++)
  100. {
  101. for(m = 0;m < nTemplateWidth ;m++)
  102. {
  103. // 指向源图像倒数第j+n行,第i+m个象素的指针
  104. lpSrc  = (LPBYTE)pDibSrc->m_lpImage + sizeSaveImage.cx * (j+n) + (i+m);
  105. // 指向模板图像倒数第n行,第m个象素的指针
  106. lpTemplateSrc  = (LPBYTE)pDibTemplate->m_lpImage + sizeSaveTemplate.cx * n + m;
  107. unchPixel = (unsigned char)*lpSrc;
  108. unchTemplatePixel = (unsigned char)*lpTemplateSrc;
  109. dSigmaS += (double)unchPixel*unchPixel;
  110. dSigmaST += (double)unchPixel*unchTemplatePixel;
  111. }
  112. }
  113. //计算相似性
  114. R = dSigmaST / ( sqrt(dSigmaS)*sqrt(dSigmaT));
  115. //与最大相似性比较
  116. if (R >  dbMaxR)
  117. {
  118.  dbMaxR = R;
  119. nMaxWidth = i;
  120. nMaxHeight = j;
  121. }
  122. }
  123. }
  124. //将最大相似性出现区域部分复制到目标图像
  125. for (n = 0;n < nTemplateHeight ;n++)
  126. {
  127. for(m = 0;m < nTemplateWidth ;m++)
  128. {
  129. lpTemplateSrc = (LPBYTE)pDibTemplate->m_lpImage + sizeSaveTemplate.cx * n + m;
  130. lpDst = (LPBYTE)pDibNew->m_lpImage + sizeSaveImage.cx * (n+nMaxHeight) + (m+nMaxWidth);
  131. *lpDst = *lpTemplateSrc;
  132. }
  133. }
  134. // 复制图像
  135. memcpy(pDibSrc->m_lpImage, pDibNew->m_lpImage, nImageWidth * nImageHeight);
  136. // 释放内存
  137. pDibNew->Empty();
  138. // 返回
  139. return TRUE;
  140. }