【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
三 核心源码
执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | //---------------------------------------------- ////模板匹配 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(); } |
匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | //---------------------------------------------- ////模板匹配:归一化积相关灰度匹配 /*---------------------------------------------- /----------------------------------------------*/ 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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步