📄 2djupipei.txt
字号:
//二维图像不变矩匹配
BOOL CBMPView::TwoDJuMatchDIB(LPSTR lpDIBBits,LPSTR lpTempDIBBits,LONG lWidth,LONG lHeight,
LONG lTempWidth,LONG lTempHeight)
{
LONG lLineBytes;
LONG lTempLineBytes;
LONG i;
LONG j;
LONG m;
LONG n;
lLineBytes = WIDTHBYTES(lWidth*8);
lTempLineBytes = WIDTHBYTES(lTempWidth*8);
BYTE *pBTempData;
BYTE *pBData;
//*********************
float uTemp00r;
float u00r;
float uTemp20 = 0.0f;
float uTemp02 = 0.0f;
float uTemp11 = 0.0f;
float uTemp30 = 0.0f;
float uTemp12 = 0.0f;
float uTemp21 = 0.0f;
float uTemp03 = 0.0f;
float yitaTemp20 = 0.0f;
float yitaTemp02 = 0.0f;
float yitaTemp11 = 0.0f;
float yitaTemp30 = 0.0f;
float yitaTemp12 = 0.0f;
float yitaTemp21 = 0.0f;
float yitaTemp03 = 0.0f;
float faiTemp1 = 0.0f;
float faiTemp2 = 0.0f;
float faiTemp3 = 0.0f;
float faiTemp4 = 0.0f;
float faiTemp5 = 0.0f;
float faiTemp6 = 0.0f;
float faiTemp7 = 0.0f;
float ITemp[6];
float u20 = 0.0f;
float u02 = 0.0f;
float u11 = 0.0f;
float u30 = 0.0f;
float u12 = 0.0f;
float u21 = 0.0f;
float u03 = 0.0f;
float yita20 = 0.0f;
float yita02 = 0.0f;
float yita11 = 0.0f;
float yita30 = 0.0f;
float yita12 = 0.0f;
float yita21 = 0.0f;
float yita03 = 0.0f;
float fai1 = 0.0f;
float fai2 = 0.0f;
float fai3 = 0.0f;
float fai4 = 0.0f;
float fai5 = 0.0f;
float fai6 = 0.0f;
float fai7 = 0.0f;
float *psData;
float I[6];
//*********************
psData = new float[lLineBytes*lHeight];
//初始化
for(i=0; i<lHeight; i++)
{
for(j=0; j<lLineBytes; j++)
{
*(psData+lLineBytes*i+j) = 1.0f;
}
}
pBTempData = new BYTE[lTempLineBytes*lTempHeight];
pBData = new BYTE[lTempLineBytes*lTempHeight];
for(i=0; i<lTempHeight; i++)
{
for(j=0; j<lTempLineBytes; j++)
{
*(pBTempData + lTempLineBytes*i + j) = *(lpTempDIBBits + lTempLineBytes*i + j);
}
}
TwoJuFunc(pBTempData, 0, lTempLineBytes, 0, lTempHeight, uTemp20, uTemp00r, 2, 0);
yitaTemp20 = uTemp20/uTemp00r;
TwoJuFunc(pBTempData, 0, lTempLineBytes, 0, lTempHeight, uTemp02, uTemp00r, 0, 2);
yitaTemp02 = uTemp02/uTemp00r;
TwoJuFunc(pBTempData, 0, lTempLineBytes, 0, lTempHeight, uTemp11, uTemp00r, 1, 1);
yitaTemp11 = uTemp11/uTemp00r;
TwoJuFunc(pBTempData, 0, lTempLineBytes, 0, lTempHeight, uTemp30, uTemp00r, 3, 0);
yitaTemp30 = uTemp30/uTemp00r;
TwoJuFunc(pBTempData, 0, lTempLineBytes, 0, lTempHeight, uTemp12, uTemp00r, 1, 2);
yitaTemp12 = uTemp12/uTemp00r;
TwoJuFunc(pBTempData, 0, lTempLineBytes, 0, lTempHeight, uTemp21, uTemp00r, 2, 1);
yitaTemp21 = uTemp21/uTemp00r;
TwoJuFunc(pBTempData, 0, lTempLineBytes, 0, lTempHeight, uTemp03, uTemp00r, 0, 3);
yitaTemp03 = uTemp03/uTemp00r;
//计算fai
faiTemp1 = yitaTemp20 + yitaTemp02;
faiTemp2 = pow(yitaTemp20-yitaTemp02, 2)+4*yitaTemp11*yitaTemp11;
faiTemp3 = pow(yitaTemp30-3*yitaTemp12, 2) + pow(3*yitaTemp21-yitaTemp03, 2);
faiTemp4 = pow(yitaTemp30+yitaTemp12, 2) + pow(yitaTemp21+yitaTemp03, 2);
faiTemp5 = (yitaTemp30-3*yitaTemp12)*(yitaTemp30+yitaTemp12)
*(pow(yitaTemp30+yitaTemp12, 2) - 3*pow(yitaTemp21+yitaTemp03, 2))
+(3*yitaTemp21-yitaTemp03)*(yitaTemp21+yitaTemp03)
*(3*pow(yitaTemp30+yitaTemp12, 2) - pow(yitaTemp21+yitaTemp03, 2));
faiTemp6 = (yitaTemp20-yitaTemp02)
*(pow(yitaTemp30+yitaTemp12, 2) - pow(yitaTemp21+yitaTemp03, 2))
+4*yitaTemp11*(yitaTemp30+yitaTemp12)*(yitaTemp21+yitaTemp03);
faiTemp7 = (3*yitaTemp12-yitaTemp30)*(yitaTemp30+yitaTemp12)
*(pow(yitaTemp30+yitaTemp12, 2) - 3*pow(yitaTemp21+yitaTemp03, 2))
+(3*yitaTemp21-yitaTemp03)*(yitaTemp21+yitaTemp03)
*(3*pow(yitaTemp30+yitaTemp12, 2) - pow(yitaTemp21+yitaTemp03, 2));
ITemp[0] = sqrt(faiTemp2)/faiTemp1;
ITemp[1] = faiTemp3/faiTemp2/faiTemp1;
ITemp[2] = faiTemp4/faiTemp3;
ITemp[3] = sqrt(fabs(faiTemp5))/faiTemp4;
ITemp[4] = faiTemp6/faiTemp4/faiTemp1;
ITemp[5] = faiTemp7/faiTemp5;
//在影像上移动窗口进行计算
for(i=0; i<lHeight-lTempHeight+1; i++)
{
for(j=0; j<lWidth-lTempWidth+1; j++)
{
for(m=0; m<lTempHeight; m++)//赋值
{
for(n=0; n<lTempLineBytes; n++)
{
*(pBData+lTempLineBytes*m+n) =
(BYTE)*(lpDIBBits+lLineBytes*(lHeight-1-m-i)+j+n);
}
}
TwoJuFunc(pBData, 0, lTempLineBytes, 0, lTempHeight, u20, u00r, 2, 0);
yita20 = u20/u00r;
TwoJuFunc(pBData, 0, lTempLineBytes, 0, lTempHeight, u02, u00r, 0, 2);
yita02 = u02/u00r;
TwoJuFunc(pBData, 0, lTempLineBytes, 0, lTempHeight, u11, u00r, 1, 1);
yita11 = u11/u00r;
TwoJuFunc(pBData, 0, lTempLineBytes, 0, lTempHeight, u30, u00r, 3, 0);
yita30 = u30/u00r;
TwoJuFunc(pBData, 0, lTempLineBytes, 0, lTempHeight, u12, u00r, 1, 2);
yita12 = u12/u00r;
TwoJuFunc(pBData, 0, lTempLineBytes, 0, lTempHeight, u21, u00r, 2, 1);
yita21 = u21/u00r;
TwoJuFunc(pBData, 0, lTempLineBytes, 0, lTempHeight, u03, u00r, 0, 3);
yita03 = u03/u00r;
//计算fai
fai1 = yita20 + yita02;
fai2 = pow(yita20-yita02, 2)+4*yita11*yita11;
fai3 = pow(yita30-3*yita12, 2) + pow(3*yita21-yita03, 2);
fai4 = pow(yita30+yita12, 2) + pow(yita21+yita03, 2);
fai5 = (yita30-3*yita12)*(yita30+yita12)
*(pow(yita30+yita12, 2) - 3*pow(yita21+yita03, 2))
+(3*yita21-yita03)*(yita21+yita03)
*(3*pow(yita30+yita12, 2) - pow(yita21+yita03, 2));
fai6 = (yita20-yita02)*(pow(yita30+yita12, 2) - pow(yita21+yita03, 2))
+4*yita11*(yita30+yita12)*(yita21+yita03);
fai7 = (3*yita12-yita30)*(yita30+yita12)
*(pow(yita30+yita12, 2) - 3*pow(yita21+yita03, 2))
+(3*yita21-yita03)*(yita21+yita03)
*(3*pow(yita30+yita12, 2) - pow(yita21+yita03, 2));
I[0] = sqrt(fai2)/fai1;
I[1] = fai3/fai2/fai1;
I[2] = fai4/fai3;
I[3] = sqrt(fabs(fai5))/fai4;
I[4] = fai6/fai4/fai1;
I[5] = fai7/fai5;
//*(psData+lLineBytes*i+j)=0;
float temp = 0.0f;
float temp1 = 0.0f;
for(int l=0; l<6; l++)
{
temp += fabs(I[l] - ITemp[l]);
temp1 += max(I[l], ITemp[l]);
}
*(psData+lLineBytes*i+j) = 1 - temp/temp1;
}
}
float MinData = 1;
LONG ResultX;
LONG ResultY;
for(i=0; i<lHeight; i++)
{
for(j=0; j<lLineBytes; j++)
{
if(MinData > *(psData+lLineBytes*i+j))
{
MinData = *(psData+lLineBytes*i+j);
ResultX = j;
ResultY = i;
}
}
}
//
FILE *f;
try
{
f = fopen("D:\\MyData.txt", "w+");
for(i=0; i<lHeight; i++)
{
for(j=0; j<lLineBytes; j++)
{
float tt = *(psData+lLineBytes*i+j);
fprintf(f, "%10.9f\n", tt);
}
}
fclose(f);
}
catch(CException *pe)
{
AfxMessageBox("Write file Mydata.txt failed!!");
pe->Delete();
fclose(f);
return FALSE;
}
//
CClientDC dc(this);
CPen RedPen(PS_SOLID, 1, RGB(255, 0, 0));
CPen *pOldPen = dc.SelectObject(&RedPen);
dc.MoveTo(ResultX,ResultY);
dc.LineTo(ResultX+lTempWidth,ResultY);
dc.LineTo(ResultX+lTempWidth,ResultY+lTempHeight);
dc.LineTo(ResultX,ResultY+lTempHeight);
dc.LineTo(ResultX,ResultY);
dc.SelectObject(pOldPen);
//the last
delete [] psData;
delete [] pBTempData;
delete [] pBData;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -