映像匹配 平台一
SkySeraph Mar 29th 2011 HQU
Email:zgzhaobo@gmail.com QQ:452728574
Latest Modified Date:Mar 29th 2011 HQU
一 工具:VS2010+OpenCV2.0
語言:CPP
二 原理:採用的是歸一化積相關灰階匹配
原理可參考:http://wenku.baidu.com/view/48b0e93467ec102de2bd89eb.html
三 核心源碼
執行
//----------------------------------------------////模板匹配void CTemplateMatchDlg::OnBnClickedTemplatematch(){// 驗證if(pTmpImg == NULL){AfxMessageBox(_T("請先選擇模板!"));return;}if(iTmpImgType!=1 && iTmpImgType!=-1 ){AfxMessageBox(_T("模板必須是灰階/二值映像,請進行灰階化轉換!"));return;}// 驗證模板int h = pTmpImg->height;int w = pTmpImg->width;if(w > IMAGE_WIDTH || h > IMAGE_HEIGHT){AfxMessageBox(_T("模板尺寸大於源映像尺寸,請重新選擇模板!"));return;}// 更改游標形狀BeginWaitCursor();// 進行模板匹配TemplateMatch(pWorkImg,pTmpImg);// 顯示ShowImage(pWorkImg, IDC_PICSHOW3);// 恢複游標形狀EndWaitCursor();}
匹配
//----------------------------------------------////模板匹配:歸一化積相關灰階匹配/*----------------------------------------------/----------------------------------------------*/void CTemplateMatchDlg::TemplateMatch(IplImage* img, IplImage* tmpImg){//迴圈變數int i, j, m, n;double dSumT; //模板元素的平方和double dSumS; //映像子領域元素的平方和double dSumST; //映像子領域和模板的點積//響應值/相似性測度double R;//記錄當前的最大響應double MaxR;//最大響應出現位置int nMaxX = 0;int nMaxY = 0;//源映像的高、寬int nHeight = img->width;int nWidth = img->height;int nStep = img->widthStep;uchar* cData;cData = (uchar*)img->imageData;//模板的高、寬int nTplHeight = tmpImg->width;int nTplWidth = tmpImg->height;int nTplStep = tmpImg->widthStep;uchar* cTplData;cTplData = (uchar*)tmpImg->imageData;//計算 dSumT:模板元素的平方和dSumT = 0;for (m = 0;m < nTplHeight ;m++){for(n = 0;n < nTplWidth ;n++){// 模板映像第m行,第n個象素的灰階值int nGray = cTplData[m*nTplStep+n];dSumT += (double)nGray*nGray;}}//找到映像中最大響應/最大相似性的出現位置MaxR = 0;for (i = 0;i < nHeight - nTplHeight +1 ;i++){for(j = 0;j < nWidth - nTplWidth + 1;j++){dSumST = 0;dSumS = 0;for (m = 0;m < nTplHeight ;m++){for(n = 0;n < nTplWidth ;n++){// 原映像第i+m行,第j+n列象素的灰階值int nGraySrc = cData[(i+m)*nStep+(j+n)];// 模板映像第m行,第n個象素的灰階值int nGrayTpl = cTplData[m*nTplStep+ m];dSumS += (double)nGraySrc*nGraySrc;dSumST += (double)nGraySrc*nGrayTpl;}}R = dSumST / ( sqrt(dSumS)*sqrt(dSumT));//計算相關響應/相似性//與最大相似性比較if (R > MaxR){MaxR = R;nMaxX = j;nMaxY = i;}}}//清空靶心圖表像/對靶心圖表像的像素進行賦值if(img)for (m = 0;m < nHeight ;m++){for(n = 0;n < nWidth ;n++){cData[m*nStep+n] = cData[m*nStep+n]/2; //像素值減半}}//cvZero(img); //int nStep2 = img->widthStep;//uchar* cData2;//cData2 = (uchar*)img->imageData;//將找到的首選地區複製到靶心圖表像for (m = 0;m < nTplHeight ;m++){for(n = 0;n < nTplWidth ;n++){int nGray = cTplData[m*nTplStep+n];//cData[m*nStep+n] = 0;cData[(nMaxY+m)*nStep+(nMaxX+n)] = RGB(nGray, nGray, nGray);}}}
四 效果
介面
處理結果
Author: SKySeraph
Email/GTalk: zgzhaobo@gmail.com QQ:452728574
From: http://www.cnblogs.com/skyseraph/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,請尊重作者的