⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2djupipei.txt

📁 影像匹配的方法很多
💻 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 + -