}
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
//计算该点对应的特征点 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; }