【My Project】图像匹配平台一
图像匹配 平台一
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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的
作者:skyseraph
出处:http://www.cnblogs.com/skyseraph/
更多精彩请直接访问SkySeraph个人站点:http://skyseraph.com//
Email/GTalk: zgzhaobo@gmail.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。