基于相关系数影像匹配实习报告 - 图文(3)

2019-08-20 20:40

}

return FAILURE;

FILE* pSrcFileRight = NULL;

pSrcFileRight = fopen(srcFileRight,\if(pSrcFileRight == NULL) { printf(\原始右片影像打开失败\\n\ return FAILURE; }

//读取左片数据

BITMAPFILEHEADER bmfhLeft; BITMAPINFOHEADER bmihLeft;

fread(&bmfhLeft, sizeof(BITMAPFILEHEADER), 1, pSrcFileLeft); fread(&bmihLeft, sizeof(BITMAPINFOHEADER), 1, pSrcFileLeft); if(bmihLeft.biBitCount != 8) { printf(\只支持8位位图: 左片\\n\ return FAILURE; }

DWORD widthLeft = bmihLeft.biWidth; DWORD heightLeft = bmihLeft.biHeight;

DWORD _widthLeft = (widthLeft*8 + 31)/32*4; //saved widthLeft in files DWORD pixelCountLeft = _widthLeft*heightLeft;

fseek(pSrcFileLeft, 256*sizeof(RGBQUAD), SEEK_CUR); BYTE* pSrcBitsLeft = new BYTE[pixelCountLeft]; //new 1 fread(pSrcBitsLeft, sizeof(BYTE), pixelCountLeft, pSrcFileLeft); fclose(pSrcFileLeft); pSrcFileLeft = NULL; //读取右片数据

BITMAPFILEHEADER bmfhRight; BITMAPINFOHEADER bmihRight;

fread(&bmfhRight, sizeof(BITMAPFILEHEADER), 1, pSrcFileRight); fread(&bmihRight, sizeof(BITMAPINFOHEADER), 1, pSrcFileRight); if(bmihRight.biBitCount != 8) { printf(\只支持8位位图: 右片\\n\ return FAILURE; }

DWORD widthRight = bmihRight.biWidth; DWORD heightRight = bmihRight.biHeight;

DWORD _widthRight = (widthRight*8 + 31)/32*4; //saved widthRight in files DWORD pixelCountRight = _widthRight*heightRight;

fseek(pSrcFileRight, 256*sizeof(RGBQUAD), SEEK_CUR); BYTE* pSrcBitsRight = new BYTE[pixelCountRight]; //new 2 fread(pSrcBitsRight, sizeof(BYTE), pixelCountRight, pSrcFileRight); fclose(pSrcFileRight); pSrcFileRight = NULL; //开始计算左片特征点 //计算左片的兴趣点存储于该vector中 vector FeaturePointLeft; vector FeaturePointRight; int Count1(0); int Count2(0); Moravec(pSrcBitsLeft, &FeaturePointLeft, m_threshold_L, m_window1_L, m_window2_L, widthLeft, heightLeft, &Count1); Moravec(pSrcBitsRight, &FeaturePointRight, m_threshold_R, m_window1_R, m_window2_R, widthRight, heightRight, &Count2); cout << FeaturePointLeft.size() << endl; cout << FeaturePointRight.size() << endl; FeaturePointLeft = RemoveReplicative(FeaturePointLeft); FeaturePointRight = RemoveReplicative(FeaturePointRight); cout << \ cout << \ SaveList(FeaturePointLeft, \ SaveList(FeaturePointRight, \ //特征点计算完毕,存储于vector中 //遍历vector, 在右片中搜寻相关系数最大的窗口 vector::iterator iter1; vector::iterator iter2; int k = m_window3 / 2; int i(0), j(0), m(0), n(0); BYTE* pTemplate = new BYTE[m_window3*m_window3]; //new 5 ZeroMemory(pTemplate, sizeof(BYTE)*m_window3*m_window3); BYTE* pTarget = new BYTE[m_window3*m_window3]; //new 6 ZeroMemory(pTarget, sizeof(BYTE)*m_window3*m_window3); vector MatchedPoints; float MaxR(0); float R(0); double A(0), B(0), C(0), D(0), E(0); //计算相关系数的中间量 int lMaxWidth; int lMaxHeight; int Count3(0), Count4(0); for (iter1 = FeaturePointLeft.begin(); iter1 != FeaturePointLeft.end(); ++iter1) { cout << endl << \

//计算该点对应的特征点 B = 0.0; D = 0.0; MaxR = 0.0; R = 0.0;

if (iter1->x < k || iter1->y < k || iter1->x > heightLeft - k || iter1->y > widthLeft - k) { cout << \ continue; }

//逐个搜索

//将左片小窗口内的数据拷贝//可先求出B,D for (i = 0; i < m_window3; ++i) { for(j = 0; j < m_window3 ; ++j) { //B = 小窗口所有像素灰度值求和 //D = ....................的平方再求和 B += pSrcBitsLeft[(i+iter1->y)*_widthLeft + (j+iter1->x)]; D += pSrcBitsLeft[(i+iter1->y)*_widthLeft + (j+iter1->x)] * pSrcBitsLeft[(i+iter1->y)*_widthLeft + (j+iter1->x)]; } }

Count4 = 0;

//逐个小窗口计算R

for (iter2 = FeaturePointRight.begin(); iter2 != FeaturePointRight.end(); ++iter2) {

if (iter2->x < k || iter2->y < k || iter2->x > heightRight - k || iter2->y > widthRight - k) { cout << \ continue; } A = 0.0; C = 0.0; E = 0.0; j = iter2->x; //i,j为中心点 i = iter2->y; j -= k; //i,j为顶点 i -= k; int centerX = j + k; int centerY = i + k; //这里的centerX,centerY就是右片某个小窗口的中心 //求A,C,E for (m = 0; m < m_window3; ++m) {

for(n = 0; n < m_window3 ; ++n) { //C = 左片小窗口所有像素灰度值求和 //E = ........................平方的求和 //A = 对应位置像素灰度直乘积之和 C += pSrcBitsRight[(i+m)*_widthRight + (j+n)]; E

pSrcBitsRight[(i+m)*_widthRight+(j+n)]*pSrcBitsRight[(i+m)*_widthRight+(j+n)]; A += pSrcBitsRight[(i+m)*_widthRight+(j+n)] * pSrcBitsLeft[(m+iter1->y)*_widthLeft + (n+iter1->x)]; } } double temp1 = D - B*B/m_window3/m_window3; double temp2 = E - C*C/m_window3/m_window3; if (temp1 != 0 && temp2 != 0) { R = (A - B*C/m_window3/m_window3) / sqrt(temp1*temp2); } else R = 0; if (R > MaxR) { MaxR = R; lMaxWidth = centerX; lMaxHeight = centerY; cout << R << endl; } } if (MaxR >= m_CoRelated) { MATCHEDPOINTS mp; mp.coefficient = MaxR; mp.x1 = iter1->x; mp.y1 = iter1->y; mp.x2 = lMaxWidth; mp.y2 = lMaxHeight; MatchedPoints.push_back(mp); } } //保存结果位图

+=

DrawCross(pSrcBitsLeft, pSrcBitsRight, MatchedPoints, _widthLeft, _widthRight, pixelCountLeft, pixelCountRight); SaveBand(widthLeft, heightLeft, _widthLeft*heightLeft, 8, pSrcBitsLeft, dstFileLeft); SaveBand(widthRight, heightRight, _widthRight*heightRight, 8, pSrcBitsRight, dstFileRight); //保存特征点列表 SaveList(MatchedPoints, txtFile); //clean up delete[] pSrcBitsLeft; delete[] pSrcBitsRight; delete[] pTemplate; pSrcBitsLeft = NULL; pSrcBitsRight = NULL; pTemplate = NULL; if (m_flag1 == 1) { ShellExecute(NULL, \ } return nRetCode; }


基于相关系数影像匹配实习报告 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浙教版七下数学第4章《因式分解》单元培优测试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: