DlgRecMatch.cpp
上传用户:panpan8800
上传日期:2013-06-29
资源大小:274k
文件大小:18k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // DlgRecMatch.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ImageProcessing.h"
  5. #include "DlgRecMatch.h"
  6. #include "CDib.h"
  7. #include "GlobalApi.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDlgRecMatch dialog
  15. CDlgRecMatch::CDlgRecMatch(CWnd* pParent /*=NULL*/,CImageProcessingDoc* pDoc)
  16. : CDialog(CDlgRecMatch::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CDlgRecMatch)
  19. // NOTE: the ClassWizard will add member initialization here
  20. //}}AFX_DATA_INIT
  21. // 设置计算图象控件位置标志位为FALSE
  22. m_bCalImgLoc = FALSE;
  23. // 设置初始图象
  24. m_pDibInit = pDoc->m_pDibInit;
  25. // 获得文档指针
  26. m_pDoc = pDoc;
  27. // 分配模板图象内存
  28. m_pDibModel = new CDib;
  29. // 分配结果图象
  30. m_pDibResult = new CDib;
  31. }
  32. void CDlgRecMatch::DoDataExchange(CDataExchange* pDX)
  33. {
  34. CDialog::DoDataExchange(pDX);
  35. //{{AFX_DATA_MAP(CDlgRecMatch)
  36. // NOTE: the ClassWizard will add DDX and DDV calls here
  37. //}}AFX_DATA_MAP
  38. }
  39. BEGIN_MESSAGE_MAP(CDlgRecMatch, CDialog)
  40. //{{AFX_MSG_MAP(CDlgRecMatch)
  41. ON_BN_CLICKED(IDC_RECOG_OPEN_MODEL, OnRecogOpenModel)
  42. ON_BN_CLICKED(IDC_RECOG_MATCH, OnRecogMatch)
  43. ON_WM_PAINT()
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CDlgRecMatch message handlers
  48. void CDlgRecMatch::OnRecogOpenModel() 
  49. {
  50. CFileDialog dlg(TRUE,"bmp","*.bmp");
  51. if(dlg.DoModal() == IDOK)
  52. {
  53.  
  54.   CFile file;
  55.  
  56.   CString strPathName;
  57.  
  58. strPathName = dlg.GetPathName();
  59.  
  60. // 打开文件
  61. if( !file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite))
  62. {
  63. // 返回
  64. return ;
  65. }
  66. // 读入模板图象
  67. if(!m_pDibModel->Read(&file)){
  68. // 恢复光标形状
  69. EndWaitCursor();
  70. // 清空已分配内存
  71. m_pDibModel->Empty();
  72. // 返回
  73.   return;
  74. }
  75. }
  76. // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的模板配准,其它的可以类推)
  77. if(m_pDibModel->m_nColorTableEntries != 256)
  78. {
  79. // 提示用户
  80. MessageBox("目前只支持256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  81. // 清空已分配内存
  82. m_pDibModel->Empty();
  83. // 返回
  84. return;
  85. }
  86. // 初始图象的长宽大小
  87. CSize sizeImage = m_pDibInit->GetDimensions();
  88. int nImageWidth = sizeImage.cx ;
  89. int nImageHeight = sizeImage.cy ;
  90. // 模板图象的长宽大小
  91. CSize sizeModelImage = m_pDibModel->GetDimensions() ;
  92. int nModelWidth = sizeImage.cx ;
  93. int nModelHeight = sizeImage.cy ;
  94. // 判断模板尺寸和初始图象的大小,如果模板大于初始图象,则推出
  95. if(nModelHeight > nImageHeight || nModelWidth > nImageWidth )
  96. {
  97. // 提示用户
  98. MessageBox("模板尺寸大于源图像尺寸!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  99. // 释放已分配内存
  100. m_pDibModel->Empty();
  101. // 返回
  102. return;
  103. }
  104. // 如果打开新的待配准文件,将图象位置设置标志位设为FALSE,以便再次调整位置
  105. m_bCalImgLoc = FALSE;
  106. // 更新显示
  107. this->Invalidate();
  108. }
  109. /*************************************************************************
  110.  *
  111.  * 函数名称:
  112.  *   CalImageLocation()
  113.  *
  114.  * 输入参数:
  115.  *   无
  116.  *
  117.  * 返回值:
  118.  *   无
  119.  *
  120.  * 说明:
  121.  *   该函数设置对话框中的控件位置和大小,并设置显示图象的位置。默认的图象大小为352×288,如果图象小于
  122.  *此大小,则控件大小设置为256*256,并将图象放置在控件中间。
  123.  *
  124.  *************************************************************************
  125.  */
  126. void CDlgRecMatch::CalImageLocation()
  127. {
  128. // ------------------------------------------------------
  129. // 获得控件IDC_RECOG_INIIMAGE的句柄,并获得控件的初始位置信息
  130. CWnd* pWnd=GetDlgItem(IDC_RECOG_INIIMAGE);
  131. WINDOWPLACEMENT *winPlacement;
  132. winPlacement=new WINDOWPLACEMENT;
  133. pWnd->GetWindowPlacement(winPlacement);
  134. // 图象宽度
  135. int nImageWidth;
  136. nImageWidth = m_pDibInit->m_lpBMIH->biWidth;
  137. // 图象高度
  138. int nImageHeight;
  139. nImageHeight = m_pDibInit->m_lpBMIH->biHeight;
  140. // -----------------------------------------------------------------
  141. // 调整控件IDC_RECOG_INIIMAGE的大小位置,并同时设置显示基准图象的位置
  142. if(nImageHeight > 256){
  143. winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;
  144. m_rectInitImage.bottom = winPlacement->rcNormalPosition.bottom;
  145. m_rectInitImage.top    = winPlacement->rcNormalPosition.top;
  146. }
  147. else{
  148. winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
  149. m_rectInitImage.bottom = winPlacement->rcNormalPosition.top + 128 + nImageHeight/2;
  150. m_rectInitImage.top    = winPlacement->rcNormalPosition.top + 128 - nImageHeight/2;
  151. }
  152. if(nImageWidth > 256){
  153. winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
  154. m_rectInitImage.right = winPlacement->rcNormalPosition.right;
  155. m_rectInitImage.left  = winPlacement->rcNormalPosition.left;
  156. }
  157. else{
  158. winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
  159. m_rectInitImage.right = winPlacement->rcNormalPosition.left + 128 + nImageWidth/2;
  160. m_rectInitImage.left  = winPlacement->rcNormalPosition.left + 128 - nImageWidth/2;
  161. }
  162. // 设置IDC_RECOG_INIIMAGE控件的大小位置
  163. pWnd->SetWindowPlacement(winPlacement);
  164. // 获得显示模板图象控件的右边位置,以便确认显示模板图象控件的位置
  165. int nIniImgRight;
  166. nIniImgRight = winPlacement->rcNormalPosition.right;
  167. int  nIniImgLeft;
  168. nIniImgLeft   = winPlacement->rcNormalPosition.left;
  169. // 获得IDC_REG_INIT_IMAGE控件的下边位置,以便调整其他控件的位置
  170. int nIniImgBottom;
  171. nIniImgBottom = winPlacement->rcNormalPosition.bottom;
  172. // 获得IDC_REG_INIT_IMAGE控件的下边位置,以便调整其他控件的位置
  173. int nIniImgtop = winPlacement->rcNormalPosition.top;
  174. // ------------------------------------------------------
  175. // 获得控件IDC_RECOG_MODIMAGE的句柄,并获得初始位置信息
  176. pWnd=GetDlgItem(IDC_RECOG_MODIMAGE);
  177. pWnd->GetWindowPlacement(winPlacement);
  178. // 如果还未打开模板图象,则设置结果图象大小和初始图象大小相等
  179. if(!m_pDibModel->IsEmpty()){
  180. nImageWidth  = m_pDibModel->m_lpBMIH->biWidth;
  181. nImageHeight = m_pDibModel->m_lpBMIH->biHeight;
  182. }
  183. // 调整控件IDC_RECOG_MODIMAGE的大小位置,并同时设置显示结果图象的位置
  184. // 先调整控件的左边位置,和IDC_REG_INIT_IMAGE控件相隔15个象素
  185. winPlacement->rcNormalPosition.left = nIniImgRight + 15;
  186. if(nImageHeight > 256){
  187. winPlacement->rcNormalPosition.top = nIniImgtop;
  188. winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;
  189. m_rectModelImage.bottom = winPlacement->rcNormalPosition.bottom;
  190. m_rectModelImage.top    = nIniImgtop;
  191. }
  192. else{
  193. winPlacement->rcNormalPosition.top = nIniImgtop;
  194. winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
  195. m_rectModelImage.bottom = winPlacement->rcNormalPosition.top + 128 + nImageHeight/2;
  196. m_rectModelImage.top    = winPlacement->rcNormalPosition.top + 128 - nImageHeight/2;
  197. }
  198. if(nImageWidth > 256){
  199. winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
  200. m_rectModelImage.right = winPlacement->rcNormalPosition.right;
  201. m_rectModelImage.left  = winPlacement->rcNormalPosition.left;
  202. }
  203. else{
  204. winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
  205. m_rectModelImage.right = winPlacement->rcNormalPosition.left + 128 + nImageWidth/2;
  206. m_rectModelImage.left  = winPlacement->rcNormalPosition.left + 128 - nImageWidth/2;
  207. }
  208. // 设置IDC_RECOG_MODIMAGE控件的大小位置
  209. pWnd->SetWindowPlacement(winPlacement);
  210. // 获得IDC_RECOG_MODIMAGE控件的右边位置,以便调整其他控件的位置
  211. nIniImgRight  = winPlacement->rcNormalPosition.right;
  212. // ------------------------------------------------------
  213. // 获得控件IDC_RECOG_RESLTIMAGE的句柄,并获得初始位置信息
  214. pWnd=GetDlgItem(IDC_RECOG_RESLTIMAGE);
  215. pWnd->GetWindowPlacement(winPlacement);
  216. // 如果还未生成结果图象,则设置结果图象大小和初始图象大小相等
  217. if(!m_pDibResult->IsEmpty()){
  218. nImageWidth  = m_pDibResult->m_lpBMIH->biWidth;
  219. nImageHeight = m_pDibResult->m_lpBMIH->biHeight;
  220. }
  221. // 调整控件IDC_RECOG_RESLTIMAGE的大小位置,并同时设置显示结果图象的位置
  222. // 先调整控件的左边位置,和IDC_RECOG_MODIMAGE控件相隔15个象素
  223. winPlacement->rcNormalPosition.left = nIniImgRight + 15;
  224. if(nImageHeight > 256){
  225. winPlacement->rcNormalPosition.top = nIniImgtop;
  226. winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;
  227. m_rectResltImage.bottom = winPlacement->rcNormalPosition.bottom;
  228. m_rectResltImage.top    = winPlacement->rcNormalPosition.top;
  229. }
  230. else{
  231. winPlacement->rcNormalPosition.top = nIniImgtop;
  232. winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 256;
  233. m_rectResltImage.bottom = winPlacement->rcNormalPosition.top + 128 + nImageHeight/2;
  234. m_rectResltImage.top    = winPlacement->rcNormalPosition.top + 128 - nImageHeight/2;
  235. }
  236. if(nImageWidth > 256){
  237. winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
  238. m_rectResltImage.right = winPlacement->rcNormalPosition.right;
  239. m_rectResltImage.left  = winPlacement->rcNormalPosition.left;
  240. }
  241. else{
  242. winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 256;
  243. m_rectResltImage.right = winPlacement->rcNormalPosition.left + 128 + nImageWidth/2;
  244. m_rectResltImage.left  = winPlacement->rcNormalPosition.left + 128 - nImageWidth/2;
  245. }
  246. // 设置IDC_REG_RESLT_IMAGE控件的大小位置
  247. pWnd->SetWindowPlacement(winPlacement);
  248. // ------------------------------------------------------
  249. if(nIniImgBottom > winPlacement->rcNormalPosition.bottom)
  250. nIniImgBottom = winPlacement->rcNormalPosition.bottom;
  251. nIniImgRight  = winPlacement->rcNormalPosition.right;
  252. // 设置控件IDOK的位置大小
  253. pWnd=GetDlgItem(IDOK);
  254. pWnd->GetWindowPlacement(winPlacement);
  255. winPlacement->rcNormalPosition.top = nIniImgBottom +15;
  256. winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
  257. pWnd->SetWindowPlacement(winPlacement);
  258. // 设置控件IDCANCEL的位置大小
  259. pWnd=GetDlgItem(IDCANCEL);
  260. pWnd->GetWindowPlacement(winPlacement);
  261. winPlacement->rcNormalPosition.top = nIniImgBottom +15;
  262. winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
  263. pWnd->SetWindowPlacement(winPlacement);
  264. // 设置控件IDC_RECOG_OPEN_MODEL的位置大小
  265. pWnd=GetDlgItem(IDC_RECOG_OPEN_MODEL);
  266. pWnd->GetWindowPlacement(winPlacement);
  267. winPlacement->rcNormalPosition.top = nIniImgBottom +15;
  268. winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
  269. pWnd->SetWindowPlacement(winPlacement);
  270. // 设置控件IDC_RECOG_MATCH的位置大小
  271. pWnd=GetDlgItem(IDC_RECOG_MATCH);
  272. pWnd->GetWindowPlacement(winPlacement);
  273. winPlacement->rcNormalPosition.top = nIniImgBottom +15;
  274. winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
  275. pWnd->SetWindowPlacement(winPlacement);
  276. // 调整此对话框的大小
  277. this->GetWindowPlacement(winPlacement);
  278. //winPlacement->rcNormalPosition.top = nIniImgtop -50;
  279. winPlacement->rcNormalPosition.bottom = nIniImgBottom + 272;
  280. winPlacement->rcNormalPosition.left   = nIniImgLeft   - 20;
  281. winPlacement->rcNormalPosition.right  = nIniImgRight  + 20;
  282. this->SetWindowPlacement(winPlacement);
  283. // 释放已分配内存
  284. delete winPlacement;
  285. // 设置计算图象控件位置标志位为TRUE
  286. m_bCalImgLoc = TRUE;
  287. }
  288. void CDlgRecMatch::OnPaint() 
  289. {
  290. CPaintDC dc(this); // device context for painting
  291. // 如果还没有计算图象的位置,则进行计算
  292. if(!m_bCalImgLoc){
  293. CalImageLocation();
  294. }
  295. // 显示大小
  296. CSize sizeDisplay;
  297. // 显示位置
  298. CPoint pointDisplay;
  299. // 显示初始图象
  300. if(!m_pDibInit->IsEmpty()){
  301. sizeDisplay.cx=m_pDibInit->m_lpBMIH->biWidth;
  302. sizeDisplay.cy=m_pDibInit->m_lpBMIH->biHeight;
  303. pointDisplay.x = m_rectInitImage.left;
  304. pointDisplay.y = m_rectInitImage.top;
  305. m_pDibInit->Draw(&dc,pointDisplay,sizeDisplay);
  306. }
  307. // 显示模板图象
  308. if(!m_pDibModel->IsEmpty()){
  309. sizeDisplay.cx=m_pDibModel->m_lpBMIH->biWidth;
  310. sizeDisplay.cy=m_pDibModel->m_lpBMIH->biHeight;
  311. pointDisplay.x = m_rectModelImage.left;
  312. pointDisplay.y = m_rectModelImage.top;
  313. m_pDibModel->Draw(&dc,pointDisplay,sizeDisplay);
  314. }
  315. // 显示结果图象
  316. if(!m_pDibResult->IsEmpty()){
  317. sizeDisplay.cx=m_pDibResult->m_lpBMIH->biWidth;
  318. sizeDisplay.cy=m_pDibResult->m_lpBMIH->biHeight;
  319. pointDisplay.x = m_rectResltImage.left;
  320. pointDisplay.y = m_rectResltImage.top;
  321. m_pDibResult->Draw(&dc,pointDisplay,sizeDisplay);
  322. }
  323. }
  324. /*************************************************************************
  325.  *
  326.  * 函数名称:
  327.  *   TemplateMatch()
  328.  *
  329.  * 输入参数:
  330.  *   CDib* pDibSrc - 指向CDib类的指针,含有待匹配图象信息 
  331.  *   CDib* pDibTemplate - 指向CDib类的指针,含有模板图象信息 
  332.  *
  333.  * 返回值:
  334.  *   BOOL - 成功则返回TRUE,否则返回FALSE
  335.  *
  336.  * 说明:
  337.  *   该函数将对图象进行模板匹配操作。需要注意的是,此程序只处理256灰度级的
  338.  *图象。
  339.  *
  340.  *************************************************************************
  341.  */
  342. BOOL CDlgRecMatch::TemplateMatch(CDib* pDibSrc, CDib* pDibTemplate)
  343. {
  344. // 指向源图像的指针
  345. LPBYTE lpSrc,lpTemplateSrc;
  346. // 指向缓存图像的指针
  347. LPBYTE lpDst;
  348. //循环变量
  349. long i;
  350. long j;
  351. long m;
  352. long n;
  353. //中间结果
  354. double dSigmaST;
  355. double dSigmaS;
  356. double dSigmaT;
  357. //相似性测度
  358. double R;
  359. //最大相似性测度
  360. double  dbMaxR;
  361. //最大相似性出现位置
  362. int nMaxWidth;
  363. int nMaxHeight;
  364. //像素值
  365. unsigned char unchPixel;
  366. unsigned char unchTemplatePixel;
  367. // 获得图象数据存储的高度和宽度
  368. CSize sizeSaveImage;
  369. sizeSaveImage = pDibSrc->GetDibSaveDim();
  370. // 获得模板图象数据存储的高度和宽度
  371. CSize sizeSaveTemplate;
  372. sizeSaveTemplate = pDibTemplate->GetDibSaveDim();
  373. // 暂时分配内存,以保存新图像
  374. CDib* pDibNew;
  375. pDibNew = new CDib;
  376. // 如果分配内存失败,则推出
  377. if(!CopyDIB(pDibSrc,pDibNew)){
  378. // 释放已分配内存
  379. pDibNew->Empty();
  380. // 返回
  381. return FALSE;
  382. }
  383. // 初始化新分配的内存
  384. lpDst = (LPBYTE)pDibNew->m_lpImage; 
  385. // 图象的高度
  386. int nImageHeight ;
  387. nImageHeight = pDibSrc->m_lpBMIH->biHeight;
  388. // 图象的宽度
  389. int nImageWidth;
  390. nImageWidth = pDibSrc->m_lpBMIH->biWidth;
  391. // 模板图象的高度
  392. int nTemplateHeight;
  393. nTemplateHeight = pDibTemplate->m_lpBMIH->biHeight;
  394. // 模板图象的宽度
  395. int nTemplateWidth;
  396. nTemplateWidth = pDibTemplate->m_lpBMIH->biWidth;
  397. //计算dSigmaT
  398. dSigmaT = 0;
  399. for (n = 0;n < nTemplateHeight ;n++)
  400. {
  401. for(m = 0;m < nTemplateWidth ;m++)
  402. {
  403. // 指向模板图像倒数第j行,第i个象素的指针
  404. lpTemplateSrc = (LPBYTE)pDibTemplate->m_lpImage + sizeSaveTemplate.cx * n + m;
  405. unchTemplatePixel = (unsigned char)*lpTemplateSrc;
  406. dSigmaT += (double)unchTemplatePixel*unchTemplatePixel;
  407. }
  408. }
  409. //找到图像中最大相似性的出现位置
  410.  dbMaxR = 0.0;
  411. for (j = 0;j < nImageHeight - nTemplateHeight +1 ;j++)
  412. {
  413. for(i = 0;i < nImageWidth - nTemplateWidth + 1;i++)
  414. {
  415. dSigmaST = 0;
  416. dSigmaS = 0;
  417. for (n = 0;n < nTemplateHeight ;n++)
  418. {
  419. for(m = 0;m < nTemplateWidth ;m++)
  420. {
  421. // 指向源图像倒数第j+n行,第i+m个象素的指针
  422. lpSrc  = (LPBYTE)pDibSrc->m_lpImage + sizeSaveImage.cx * (j+n) + (i+m);
  423. // 指向模板图像倒数第n行,第m个象素的指针
  424. lpTemplateSrc  = (LPBYTE)pDibTemplate->m_lpImage + sizeSaveTemplate.cx * n + m;
  425. unchPixel = (unsigned char)*lpSrc;
  426. unchTemplatePixel = (unsigned char)*lpTemplateSrc;
  427. dSigmaS += (double)unchPixel*unchPixel;
  428. dSigmaST += (double)unchPixel*unchTemplatePixel;
  429. }
  430. }
  431. //计算相似性
  432. R = dSigmaST / ( sqrt(dSigmaS)*sqrt(dSigmaT));
  433. //与最大相似性比较
  434. if (R >  dbMaxR)
  435. {
  436.  dbMaxR = R;
  437. nMaxWidth = i;
  438. nMaxHeight = j;
  439. }
  440. }
  441. }
  442. // 对目标图象的象素进行赋值
  443. for(i=0; i<nImageHeight; i++)
  444. for( j=0; j<nImageWidth; j++){
  445. lpDst[i*sizeSaveImage.cx +j] /=2;
  446. }
  447. //将最大相似性出现区域部分复制到目标图像
  448. for (n = 0;n < nTemplateHeight ;n++)
  449. {
  450. for(m = 0;m < nTemplateWidth ;m++)
  451. {
  452. lpTemplateSrc = (LPBYTE)pDibTemplate->m_lpImage + sizeSaveTemplate.cx * n + m;
  453. lpDst = (LPBYTE)pDibNew->m_lpImage + sizeSaveImage.cx * (n+nMaxHeight) + (m+nMaxWidth);
  454. *lpDst = *lpTemplateSrc;
  455. }
  456. }
  457. // 复制图像
  458. memcpy(pDibSrc->m_lpImage, pDibNew->m_lpImage, nImageWidth * nImageHeight);
  459. // 释放内存
  460. pDibNew->Empty();
  461. // 返回
  462. return TRUE;
  463. }
  464. /*************************************************************************
  465.  *
  466.  * 函数名称:
  467.  *   OnRecogMatch()
  468.  *
  469.  * 输入参数:
  470.  *   无
  471.  * 
  472.  * 返回值:
  473.  *   无
  474.  *
  475.  * 说明:
  476.  *   根据图象模板,在待匹配的图象中找到匹配的位置
  477.  *
  478.  *************************************************************************
  479.  */
  480. void CDlgRecMatch::OnRecogMatch() 
  481. {
  482. // 更改光标形状
  483. BeginWaitCursor();
  484. // 分配结果图象内存
  485. if(!m_pDibInit->IsEmpty()){
  486. // 如果分配内存失败,则推出
  487. if(!CopyDIB(m_pDibInit,m_pDibResult)){
  488. // 释放已分配内存
  489. m_pDibResult->Empty();
  490. // 返回
  491. return ;
  492. }
  493. }
  494. // 设置计算图象控件位置标志位为FALSE以重新设置图象控件位置
  495. m_bCalImgLoc = FALSE;
  496. // 调用TemplateMatch()函数进行模板匹配
  497. if (TemplateMatch(m_pDibResult, m_pDibModel))
  498. {
  499. // 更新显示
  500. Invalidate();
  501. }
  502. else
  503. {
  504. // 提示用户
  505. MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  506. }
  507. // 恢复光标
  508. EndWaitCursor();
  509. // 更新视图
  510. Invalidate();
  511. }
  512. void CDlgRecMatch::OnOK() 
  513. {
  514. // TODO: Add extra validation here
  515. // 释放已分配内存
  516. if(!m_pDibModel->IsEmpty()){
  517. m_pDibModel->Empty();
  518. m_pDibModel = NULL;
  519. }
  520. if(!m_pDibResult->IsEmpty()){
  521. m_pDibResult->Empty();
  522. m_pDibResult = NULL;
  523. }
  524. CDialog::OnOK();
  525. }
  526. void CDlgRecMatch::OnCancel() 
  527. {
  528. // TODO: Add extra cleanup here
  529. // 释放已分配内存
  530. if(!m_pDibModel->IsEmpty()){
  531. m_pDibModel->Empty();
  532. m_pDibModel = NULL;
  533. }
  534. if(!m_pDibResult->IsEmpty()){
  535. m_pDibResult->Empty();
  536. m_pDibResult = NULL;
  537. }
  538. CDialog::OnCancel();
  539. }