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

📄 match.cpp

📁 图像处理软件,功能比较基础
💻 CPP
📖 第 1 页 / 共 3 页
字号:

// 利用降维法快速计算匹配相关内积
// 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 + -