📄 match.cpp
字号:
// 利用降维法快速计算匹配相关内积
// return : SumX {relimg} & SumXY
long CMatch::CalSumXY_DSP_Code(long * pSumXY , BYTE * refimg, BYTE * relimg, CSize s1, CSize s2)
{
int i,j,m;
int k , Num;
int r1 = s1.cy;
int c1 = s1.cx;
int r2 = s2.cy;
int c2 = s2.cx;
int r3 = r1-r2 + 1;
int c3 = c1-c2 + 1;
long SumX=0;
BYTE * pTmpRef = new BYTE[r1*c1];
BYTE * pTmpRel = new BYTE[r2*c2];
BYTE * pref = pTmpRef;
BYTE * prel = pTmpRel;
BYTE * pApp;
int RealSize = r2 * c2;
/* only suitable for memcopy byte data */
for(i=0;i<r2;i++)
{
memcpy(pTmpRel + i*c2 , relimg + i*c2 , c2 * sizeof(BYTE));
memcpy(pTmpRef + i*c2 , refimg + i*c1 , c2 * sizeof(BYTE));
}
/* 计算实时图灰度值之和 */
for(k=0 ; k < r2*c2 ; k++) SumX += pTmpRel[k];
prel = pTmpRel;
pref = pTmpRef;
/* 计算相关面: Rxy */
for(i=0 ; i< c3 ; i+=2 )
{
Num = i;
/* 拷入一列数据 */
for (m=0 ; m< r2 ; m++)
*(pref + (m+1) * c2 -1) = *(refimg + m*c1 + c2+i-1);
pSumXY[Num] = bDot4(prel, pref, RealSize);
pApp = refimg + (r2-1)*c1 + i ;
/* from UP to DOWN for calculate the Rxy */
for(j=1 ; j < r3 ; j++) /* begin at j = 1 */
{
pApp += c1;
memcpy(pref + r2*c2 , pApp , c2 * sizeof(BYTE));
pref += c2;
Num += c3 ;
pSumXY[Num] = bDot4(prel, pref, RealSize);
}
if( c3 - i ==1 ) break; /* the size is odd then end here */
/* 拷入一列数据 */
for (m=0 ; m< r2 ; m++)
*(pref + (m+1) * c2) = *(refimg + (m+r3-1)*c1 + c2+i);
pref ++;
Num ++; /* shift right by ONE pixel */
pSumXY[Num] = bDot4(prel, pref, RealSize);
pApp = refimg + (r3-1)*c1 + i+1 ;
/* from DOWN to UP for calculate the Rxy */
for(j = r3 - 2 ; j >= 0 ; j--) /* begin at nMight-2 */
{
pApp -= c1;
memcpy(pref - c2 , pApp , c2 * sizeof(BYTE));
pref -= c2;
Num -= c3;
pSumXY[Num] = bDot4(prel, pref, RealSize);
}
pref ++;
}
delete pTmpRef;
delete pTmpRel;
return SumX;
}
/* 在DSP上实现匹配计算(相关面)的程序代码 */
float ** CMatch::CalCormap_DSP_Code(BYTE ** ref, BYTE ** rel, CSize s1, CSize s2)
{
int i,j,m;
int k , Num;
int r1 = s1.cy;
int c1 = s1.cx;
int r2 = s2.cy;
int c2 = s2.cx;
int r3 = r1-r2 + 1;
int c3 = c1-c2 + 1;
long SumX=0;
long SumXY=0;
long * Rxy = new long[r3 * c3];
long * KRef = new long[r3 * c3];
long * AvgY = new long[r3 * c3];
BYTE * pTmpRef = new BYTE[r1*c1];
BYTE * pTmpRel = new BYTE[r2*c2];
BYTE * pref = pTmpRef;
BYTE * prel = pTmpRel;
BYTE * pApp;
BYTE * refimg = CComlib::Trans2To1(ref , s1);
BYTE * relimg = CComlib::Trans2To1(rel , s2);
int RealSize = r2 * c2;
/* 读入参考图象的预处理数据 */
int length;
CComlib::LoadAsDspDataFile(KRef, &length, DspFile[2] ,'l');
CComlib::LoadAsDspDataFile(AvgY, &length, DspFile[3] ,'l');
/* only suitable for memcopy byte data */
for(i=0;i<r2;i++)
{
memcpy(pTmpRel + i*c2 , relimg + i*c2 , c2 * sizeof(BYTE));
memcpy(pTmpRef + i*c2 , refimg + i*c1 , c2 * sizeof(BYTE));
}
/* 计算实时图灰度值之和 */
for(k=0 ; k < r2*c2 ; k++) SumX += pTmpRel[k];
prel = pTmpRel;
pref = pTmpRef;
/* 计算相关面: Rxy */
for(i=0 ; i< c3 ; i+=2 )
{
Num = i;
/* 拷入一列数据 */
for (m=0 ; m< r2 ; m++)
*(pref + (m+1) * c2 -1) = *(refimg + m*c1 + c2+i-1);
Rxy[Num] = bDot4(prel, pref, RealSize);
pApp = refimg + (r2-1)*c1 + i ;
/* from UP to DOWN for calculate the Rxy */
for(j=1 ; j < r3 ; j++) /* begin at j = 1 */
{
pApp += c1;
memcpy(pref + r2*c2 , pApp , c2 * sizeof(BYTE));
pref += c2;
Num += c3 ;
Rxy[Num] = bDot4(prel, pref, RealSize);
}
if( c3 - i ==1 ) break; /* the size is odd then end here */
/* 拷入一列数据 */
for (m=0 ; m< r2 ; m++)
*(pref + (m+1) * c2) = *(refimg + (m+r3-1)*c1 + c2+i);
pref ++;
Num ++; /* shift right by ONE pixel */
Rxy[Num] = bDot4(prel, pref, RealSize);
pApp = refimg + (r3-1)*c1 + i+1 ;
/* from DOWN to UP for calculate the Rxy */
for(j = r3 - 2 ; j >= 0 ; j--) /* begin at nMight-2 */
{
pApp -= c1;
memcpy(pref - c2 , pApp , c2 * sizeof(BYTE));
pref -= c2;
Num -= c3;
Rxy[Num] = bDot4(prel, pref, RealSize);
}
pref ++;
}
for(k=0;k<r3*c3;k++)
Rxy[k] = (Rxy[k]-SumX * AvgY[k])/ KRef[k];
float ** cor = (float **) CComlib::fspace_2d(r3,c3,sizeof(float));
for(i=0;i<r3;i++)
for(j=0;j<c3;j++)
cor[i][j] = (float) Rxy[i*c3+j];
delete Rxy;
delete KRef;
delete AvgY;
delete pTmpRef;
delete pTmpRel;
delete refimg;
delete relimg;
return cor;
}
/* 预先计算参考图有效区累积和与平方和数据 */
int CMatch::PreCalImgRegExDx(BYTE ** img , BYTE **Mask, long *SumYY, long *SumY, int row, int col, int RegSize)
{
int i,j,m,n;
int r = row - RegSize + 1 ;
int c = col - RegSize + 1 ;
int counts = 0;
for (m=0;m<RegSize;m++)
for (n=0;n<RegSize;n++)
{
if (Mask[m][n] == 255) counts ++;
}
int num = 0;
for (i=0;i<r;i++)
for (j=0;j<c;j++)
{
long sumY = 0;
long sumYY = 0;
for (m=0;m<RegSize;m++)
for (n=0;n<RegSize;n++)
{
if (Mask[m][n]==255)
{
sumY += (long) img[i+m][j+n]; // sum(yi)
sumYY += (long)img[i+m][j+n] * img[i+m][j+n] ; // sum(yi*yi)
}
}
SumYY[num] = sumYY;
SumY[num] = sumY;
num ++;
}
return counts;
}
/* 预先计算参考图有效区累积和与平方和数据 */
int CMatch::PreCalImgRegExDx(BYTE * img , BYTE **Mask, long *SumYY, long *SumY, int row, int col, int RegSize)
{
int i,j,m,n;
long sumY, sumYY;
int r = row - RegSize + 1 ;
int c = col - RegSize + 1 ;
int counts = 0;
for (m=0;m<RegSize;m++)
for (n=0;n<RegSize;n++)
{
if (Mask[m][n] == 255) counts ++;
}
int num = 0;
for (i=0;i<r;i++)
for (j=0;j<c;j++)
{
sumY = sumYY = 0;
for (m=0;m<RegSize;m++)
for (n=0;n<RegSize;n++)
{
if (Mask[m][n]==255)
{
sumY += img[(i+m)*col + j+n]; // sum(yi)
sumYY += img[(i+m)*col + j+n] * img[(i+m)*col + j+n] ; // sum(yi*yi)
}
}
SumYY[num] = sumYY;
SumY[num] = sumY;
num ++;
}
return counts;
}
void CMatch::MultiMatch_Sect( CString reffile , CString relfile ,
CString datafile , CString resultfile,
CString postfile, int num, BOOL bFlightDir ,float fDirDeg, int nSize ,
int ErrSize, int TSize, BOOL bVerL, BOOL bVerR, float fRatioLR)
{
return ;
}
NPOT CMatch::OutputSigleResultToFile(SRESULT &rlt, COORDINATE Local, float **Rxy , int mr, int mc, CString OutFileName , int nErrSize , int TSize)
{
CMatchPeak peak;
NPOT find[3];
// 均由后处理选择匹配峰
peak.Open(Rxy , mr , mc , TSize, SIGMA);
peak.SavePeakPotToFile( Local , OutFileName);
find[2] = peak.GetPeakPot();
find[1] = peak.GetMaxPot();
find[0] = peak.GetMinPot();
int xx = Local.x;
int yy = Local.y;
float erry[3];
float errx[3];
for(int i=0;i<3;i++)
{
erry[i] = find[i].y - yy;
errx[i] = find[i].x - xx;
rlt.uRow[i] += erry[i];
rlt.uCol[i] += errx[i];
rlt.dRow[i] += erry[i] * erry[i];
rlt.dCol[i] += errx[i] * errx[i];
#if ERROR_RADIUS
// radius <= ErrSize
rlt.nCorrects[i] += ( (erry[i] * erry[i] + errx[i] * errx[i]) <= nErrSize * nErrSize ) ? 1 : 0 ;
#else
rlt.nCorrects[i] += ( abs(errx[i]) <= nErrSize && abs(erry[i]) <= nErrSize ) ? 1 : 0 ;
#endif
}
return find[2];
}
/*****************************************/
/* DBS雷达图象单个匹配 */
/* 相关面数据图象文件:datafile */
/*****************************************/
NPOT CMatch::SingleMatch_Sect(CString reffile , CString relfile , CString corfile,
BOOL bVerL , BOOL bVerR, int nTSize, float fSigma,
BOOL bFlightDir, float Theta)
{
NPOT rightP;
return rightP;
}
/////////////////////////////////////////////////////////
void CMatch::MultiMatch_Circ_DspCode( CString reffile , CString relfile ,
CString datafile , CString resultfile,
CString postfile, int num, int rad0, int rad1 ,int ErrSize ,int TSIZE)
{
}
/*
#define AAA 1
#if AAA
{
//======= 计算相关面 begin ======
int r1 = refR;
int c1 = refC;
int r2 = relR;
int c2 = relC;
int r3 = mr;
int c3 = mc;
long SumX=0;
long SumXY=0;
int RealSize = r2 * c2;
BYTE * pTmpRel = new BYTE[RealSize];
BYTE * pref = pTmpRef;
BYTE * prel = pTmpRel;
BYTE * pApp;
// only suitable for memcopy byte data
for(i=0;i<r2;i++)
{
memcpy(pTmpRel + i*c2 , Relimg + i*c2 , c2 * sizeof(BYTE));
memcpy(pTmpRef + i*c2 , Refimg + i*c1 , c2 * sizeof(BYTE));
}
// 计算实时图灰度值之和
for(int k=0 ; k < r2*c2 ; k++) SumX += pTmpRel[k];
prel = pTmpRel;
pref = pTmpRef;
int Num = 0;
// 计算相关面: Rxy
for(i=0 ; i< c3 ; i+=2 )
{
Num = i;
// 拷入一列数据
for (m=0 ; m< r2 ; m++)
*(pref + (m+1) * c2 -1) = *(Refimg + m*c1 + c2+i-1);
Rxy[Num] = bDot4(prel, pref, RealSize);
pApp = Refimg + (r2-1)*c1 + i ;
// from UP to DOWN for calculate the Rxy
for(j=1 ; j < r3 ; j++) // begin at j = 1
{
pApp += c1;
memcpy(pref + r2*c2 , pApp , c2 * sizeof(BYTE));
pref += c2;
Num += c3 ;
Rxy[Num] = bDot4(prel, pref, RealSize);
}
if( c3 - i ==1 ) break; // the size is odd then end here
// 拷入一列数据
for (m=0 ; m< r2 ; m++)
*(pref + (m+1) * c2) = *(Refimg + (m+r3-1)*c1 + c2+i);
pref ++;
Num ++; // shift right by ONE pixel
Rxy[Num] = bDot4(prel, pref, RealSize);
pApp = (BYTE*) (Refimg + (r3-1)*c1 + i+1 );
// from DOWN to UP for calculate the Rxy
for(j = r3 - 2 ; j >= 0 ; j--) // begin at nMight-2
{
pApp -= c1;
memcpy(pref - c2 , pApp , c2 * sizeof(BYTE));
pref -= c2;
Num -= c3;
Rxy[Num] = bDot4(prel, pref, RealSize);
}
pref ++;
}
delete pTmpRel;
for(i=0;i<r3;i++)
for(j=0;j<c3;j++)
dRxy[i][j] = (float) ( Rxy[i*c3+j] - SumX * avgy[i*r3 + j]) / devy[i*r3 + j] ;
//======= 计算相关面 end ======
}
#else
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -