亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dlgreg.cpp

?? VC++數字圖象獲取,處理
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
		pDbSMatrixT[count*m_nChsFeatureNum + 2] = 1;		
	}

	// 計算pDbSMatrix*pDbSMatrixT,并將結果放入pDbInvMatrix中
	CalMatProduct(pDbSMatrix,pDbSMatrixT,pDbInvMatrix,3,3,m_nChsFeatureNum);

	// 計算pDbInvMatrix的逆矩陣
	CalInvMatrix(pDbInvMatrix, 3);

	// 計算仿射變換系數
	CalMatProduct(pDbBMatrix, pDbSMatrixT, pDbTemp, 2, 3, m_nChsFeatureNum);
	CalMatProduct(pDbTemp, pDbInvMatrix, pDbAffPara, 2, 3, 3);

	// 釋放內存
	delete[]pDbBMatrix;
	delete[]pDbSMatrix;
	delete[]pDbSMatrixT;
	delete[]pDbInvMatrix;
	delete[]pDbTemp;

}

/*************************************************************************
 *
 * \函數名稱:
 *   CalMatProduct()
 *
 * \輸入參數:
 *   double  *pDbSrc1	- 指向相乘矩陣1的內存
 *   double  *pDbSrc2	- 指向相乘矩陣2的內存
 *   double  *pDbDest   - 存放矩陣相乘運行結果的內存指針
 *   int     nX		- 矩陣的尺寸,具體參見函數說明
 *   int     nY		- 矩陣的尺寸,具體參見函數說明
 *   int     nZ		- 矩陣的尺寸,具體參見函數說明
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數計算兩個矩陣的相乘,然后將相乘的結果存放在pDbDest中。其中pDbSrc1
 *的大小為nX*nZ,pDbSrc2的大小為nZ*nY,pDbDest的大小為nX*nY
 *
 *************************************************************************
 */
void CDlgReg::CalMatProduct(double* pDbSrc1, double *pDbSrc2, double *pDbDest, int y, int x, int z)
{
	// 循環變量
	//int i,j,m;
/*
	// 矩陣相乘
	for( i=0;i<nX;i++)
		for( j=0;j<nY;j++)
		{
			pDbDest[i*nY + j] = 0;
			for( m=0; m<nZ; m++)
				pDbDest[i*nY + j] += pDbSrc1[i*nZ + m]*pDbSrc2[m *nY + j];
		}
		*/
	for(int i=0;i<y;i++)
		for(int j=0;j<x;j++)
		{
			pDbDest[i*x + j] = 0;
			for(int m=0;m<z;m++)
				pDbDest[i*x + j] += pDbSrc1[i*z + m]*pDbSrc2[m*x + j];
		}
}

/*************************************************************************
 *
 * \函數名稱:
 *   CalInvMatrix()
 *
 * \輸入參數:
 *   double  *pDbSrc	- 指向矩陣的指針
 *   int     nLen	- 矩陣的尺寸 
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數計算矩陣pDbSrc的逆矩陣,其中pDbSrc的大小為nLen*nLen
 *
 *************************************************************************
 */
BOOL CDlgReg::CalInvMatrix(double *pDbSrc, int nLen)
{
	int *is,*js,i,j,k;
	double d,p;
	is = new int[nLen];
	js = new int[nLen];
	for(k=0;k<nLen;k++)
	{
		d=0.0;
		for(i=k;i<nLen;i++)
			for(j=k;j<nLen;j++)
			{
				p=fabs(pDbSrc[i*nLen + j]);
				if(p>d)
				{
					d     = p; 
					is[k] = i;
					js[k] = j;
				}
			}
		if(d+1.0==1.0)
		{
			delete is;
			delete js;
			return FALSE;
		}
		if(is[k] != k)
			for(j=0;j<nLen;j++)
			{
				p = pDbSrc[k*nLen + j];
				pDbSrc[k*nLen + j] = pDbSrc[(is[k]*nLen) + j];
				pDbSrc[(is[k])*nLen + j] = p;
			}
		if(js[k] != k)
			for(i=0; i<nLen; i++)
			{
				p = pDbSrc[i*nLen + k];
				pDbSrc[i*nLen + k] = pDbSrc[i*nLen + (js[k])];
				pDbSrc[i*nLen + (js[k])] = p;
			}

		pDbSrc[k*nLen + k]=1.0/pDbSrc[k*nLen + k];
		for(j=0; j<nLen; j++)
			if(j != k)
			{
				pDbSrc[k*nLen + j]*=pDbSrc[k*nLen + k];
			}
		for(i=0; i<nLen; i++)
			if(i != k)
				for(j=0; j<nLen; j++)
					if(j!=k)
					{
						pDbSrc[i*nLen + j] -= pDbSrc[i*nLen + k]*pDbSrc[k*nLen + j];
					}
		for(i=0; i<nLen; i++)
			if(i != k)
			{
				pDbSrc[i*nLen + k] *= -pDbSrc[k*nLen + k];
			}
	}
	for(k=nLen-1; k>=0; k--)
	{
		if(js[k] != k)
			for(j=0; j<nLen; j++)
			{
				p = pDbSrc[k*nLen + j];
				pDbSrc[k*nLen + j] = pDbSrc[(js[k])*nLen + j];
				pDbSrc[(js[k])*nLen + j] = p;
			}
		if(is[k] != k)
			for(i=0; i<nLen; i++)
			{
				p = pDbSrc[i*nLen + k];
				pDbSrc[i*nLen + k] = pDbSrc[i*nLen +(is[k])];
				pDbSrc[i*nLen + (is[k])] = p;
			}
	}
	delete is;

	return TRUE;	
}

/*************************************************************************
 *
 * \函數名稱:
 *   CalInvMatrix()
 *
 * \輸入參數:
 *   double  *pDbAffPara	- 仿射變換系數矩陣
 *
 * \返回值:
 *   CRect			- 返回待配準圖象經仿射變換后的區域
 *
 * \說明:
 *   該函數根據仿射變換系數,計算待配準圖象仿射變換后的圖象尺寸大小
 *
 *************************************************************************
 */
CRect CDlgReg::GetAftAffDim(double* pDbAffPara)
{
	// 基準圖象的寬度和高度
	int nBaseImgWidth, nBaseImgHeight;
	nBaseImgWidth = m_pDibInit->m_lpBMIH->biWidth;
	nBaseImgHeight= m_pDibInit->m_lpBMIH->biHeight;

	// 待配準圖象的寬度和高度
	int nSamplImgWidth, nSamplImgHeight;
	nSamplImgWidth = m_pDibSamp->m_lpBMIH->biWidth;
	nSamplImgHeight= m_pDibSamp->m_lpBMIH->biHeight;

	// 基準圖象的原始區域
	CRect rectBase(0,0,nBaseImgWidth,nBaseImgHeight);

	// 臨時變量
	CPoint pointTemp;
	double tx,ty;
	
	// 圖象的端點
	pointTemp.x = 0; 
	pointTemp.y = 0;

	// 計算點pointTemp經過仿射變換后的坐標
	tx = pDbAffPara[0*3 +0]*pointTemp.x + 
		pDbAffPara[0*3 + 1]*pointTemp.y + pDbAffPara[0*3 + 2];
	ty = pDbAffPara[1*3 + 0]*pointTemp.x + 
		pDbAffPara[1*3 + 1]*pointTemp.y + pDbAffPara[1*3 + 2];

	// 判斷pointTemp經過仿射變換后是否超出原來的大小
	if(tx<rectBase.left)
		rectBase.left = (int)tx;
	if(tx>rectBase.right)
		rectBase.right = (int)tx+1;
	if(ty<rectBase.top)
		rectBase.top = (int)ty;
	if(ty>rectBase.bottom)
		rectBase.bottom = (int)ty+1;

	// 計算端點(0, nSamplImgHeight)變換后的坐標
	pointTemp.x = 0; pointTemp.y = nSamplImgHeight;
	tx = pDbAffPara[0*3 + 0]*pointTemp.x + 
		pDbAffPara[0*3 + 1]*pointTemp.y + pDbAffPara[0*3 + 2];
	ty = pDbAffPara[1*3 +0]*pointTemp.x +
		pDbAffPara[1*3 + 1]*pointTemp.y + pDbAffPara[1*3 + 2];

	// 判斷是否越界
	if(tx<rectBase.left)
		rectBase.left = (int)tx;
	if(tx>rectBase.right)
		rectBase.right = (int)tx+1;
	if(ty<rectBase.top)
		rectBase.top = (int)ty;
	if(ty>rectBase.bottom)
		rectBase.bottom = (int)ty+1;

	// 計算端點(nSamplImgWidth, nSamplImgHeight)變換后的坐標
	pointTemp.x = nSamplImgWidth; pointTemp.y = nSamplImgHeight;
	tx = pDbAffPara[0*3 + 0]*pointTemp.x +
		pDbAffPara[0*3 + 1]*pointTemp.y + pDbAffPara[0*3 + 2];
	ty = pDbAffPara[1*3 + 0]*pointTemp.x +
		pDbAffPara[1*3 + 1]*pointTemp.y + pDbAffPara[1*3 + 2];

	// 判斷是否越界
	if(tx<rectBase.left)
		rectBase.left = (int)tx;
	if(tx>rectBase.right)
		rectBase.right = (int)tx+1;
	if(ty<rectBase.top)
		rectBase.top = (int)ty;
	if(ty>rectBase.bottom)
		rectBase.bottom = (int)ty+1;

	// 計算端點(nSamplImgWidth, 0)變換后的坐標
	pointTemp.x = nSamplImgWidth; pointTemp.y = 0;
	tx = pDbAffPara[0*3 + 0]*pointTemp.x +
		pDbAffPara[0*3 + 1]*pointTemp.y + pDbAffPara[0*3 + 2];
	ty = pDbAffPara[1*3 + 0]*pointTemp.x +
		pDbAffPara[1*3 + 1]*pointTemp.y + pDbAffPara[1*3 + 2];

	// 判斷是否越界
	if(tx<rectBase.left)
		rectBase.left = (int)tx;
	if(tx>rectBase.right)
		rectBase.right = (int)tx+1;
	if(ty<rectBase.top)
		rectBase.top = (int)ty;
	if(ty>rectBase.bottom)
		rectBase.bottom = (int)ty+1;

	// 返回待配準圖象變換后的區域大小
	return(rectBase);

}

/*************************************************************************
 *
 * \函數名稱:
 *   SetSampImgAftAff()
 *
 * \輸入參數:
 *   double  *pDbAffPara	- 仿射變換系數矩陣
 *   CRect   rectNewImg		- 變換后圖象的大小尺寸
 *
 * \返回值:
 *   LPBYTE			- 返回變換后的圖象
 *
 * \說明:
 *   該函數根據仿射變換系數,計算待配準圖象仿射變換后的圖象。并返回此圖象指針
 *此圖象的大小為rectNewImg
 *
 *************************************************************************
 */
LPBYTE CDlgReg::SetSampImgAftAff(double* pDbAffPara, CRect rectNewImg)
{
	// pUnchSect是4*4大小的矩陣數組
	unsigned char *pUnchSect;
	pUnchSect = new unsigned char[4*4];

	// 新的圖象寬度和高度
	int nNewImgWidth, nNewImgHeight;
	nNewImgWidth  = rectNewImg.right - rectNewImg.left;
	nNewImgHeight = rectNewImg.bottom- rectNewImg.top;

	// 待配準圖象的寬度和高度
	int nSamplImgWidth, nSamplImgHeight;
	nSamplImgWidth = m_pDibSamp->m_lpBMIH->biWidth;
	nSamplImgHeight= m_pDibSamp->m_lpBMIH->biHeight;

	// 待配準圖象的存儲寬度
	int nSampSaveWidth;
	nSampSaveWidth = m_pDibSamp->GetDibSaveDim().cx;
	
	// pUnchAftAffSamp是一個大小為rectNewImg大小的圖象,
	// 其中rectNewImg表示變換后的圖象大小
	unsigned char *pUnchAftAffSamp;
	pUnchAftAffSamp = new unsigned char[nNewImgWidth * nNewImgHeight];
	
	double tx,ty;

	// 計算在變換后的圖象的數據
	for(int i=0;i<rectNewImg.bottom-rectNewImg.top;i++)
		for(int j=0;j<rectNewImg.right-rectNewImg.left;j++)
		{
			tx = pDbAffPara[0*3 + 0]*(j+rectNewImg.left) +
				pDbAffPara[0*3 + 1]*(i+rectNewImg.top) + pDbAffPara[0*3 + 2];
			ty = pDbAffPara[1*3 + 0]*(j+rectNewImg.left) + 
				pDbAffPara[1*3 + 1]*(i+rectNewImg.top) + pDbAffPara[1*3 + 2];

			for(int m=(int)ty-1;m<=(int)ty+2;m++)
				for(int n=(int)tx-1;n<=(int)tx+2;n++)
				{
					if(m<0||m>=nSamplImgHeight||n<0||n>=nSamplImgWidth)
						pUnchSect[(m-(int)ty+1)*4 + (n-(int)tx+1)] = 0;
					else
						pUnchSect[(m-(int)ty+1)*4 + (n-(int)tx+1)] = 
							m_pDibSamp->m_lpImage[(nSamplImgHeight-m-1)*nSampSaveWidth + n];
				}

			// 確定變換的坐標
			ty = ty - (int)ty + 1;
			tx = tx - (int)tx + 1;

			// 確定變換后此坐標的數值
			pUnchAftAffSamp[i*nNewImgWidth + j] = CalSpline(pUnchSect,tx,ty);
		}
	
	
	// 是否內存
	delete[]pUnchSect;

	// 返回指針
	return (LPBYTE)pUnchAftAffSamp;
	
	
}

/*************************************************************************
 *
 * \函數名稱:
 *   CalSpline()
 *
 * \輸入參數:
 *   unsigned char	*pUnchCorr	- 插值的點
 *   double		dX		- X坐標
 *   double		dY		- Y坐標
 *
 * \返回值:
 *   unsigned char			- 插值后的值
 *
 * \說明:
 *   該函數根據鄰近位置的數值進行插值。
 *此圖象的大小為rectNewImg
 *
 *************************************************************************
 */
unsigned char CDlgReg::CalSpline(unsigned char *pUnchCorr, double x, double y)
{
	double ret=0, Cx, Cy;
	double Temp;

	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
		{
			Temp = pUnchCorr[i*4 + j];
			if(fabs(y-i)<1)
				Cy = 1-2*fabs(y-i)*fabs(y-i)+fabs(y-i)*fabs(y-i)*fabs(y-i);
			if(fabs(y-i)>=1)
				Cy = 4-8*fabs(y-i)+5*fabs(y-i)*fabs(y-i)-fabs(y-i)*fabs(y-i)*fabs(y-i);
			if(fabs(x-j)<1)
				Cx = 1-2*fabs(x-j)*fabs(x-j)+fabs(x-j)*fabs(x-j)*fabs(x-j);
			if(fabs(x-j)>=1)
				Cx = 4-8*fabs(x-j)+5*fabs(x-j)*fabs(x-j)-fabs(x-j)*fabs(x-j)*fabs(x-j);
			ret += Temp*Cy*Cx;
		}
	if(ret<0)
		ret=0;
	if(ret>255)
		ret=255;

	return (unsigned char)ret;

}

/*************************************************************************
 *
 * \函數名稱:
 *   SetBaseImgAftAff()
 *
 * \輸入參數:
 *   double  *pDbAffPara	- 仿射變換系數矩陣
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數根據仿射變換系數,計算基準圖象仿射變換后的圖象,并返回存放此
 *數據的指針
 *
 *************************************************************************
 */
LPBYTE CDlgReg::SetBaseImgAftAff(CRect rectNewImg)
{
	// 新圖象的大小
	int nNewImgWidth, nNewImgHeight;
	nNewImgWidth  = rectNewImg.right  - rectNewImg.left;
	nNewImgHeight = rectNewImg.bottom - rectNewImg.top;	

	// 變換后圖象
	unsigned char *pUnchAftAffBase;
	pUnchAftAffBase = new unsigned char[nNewImgWidth*nNewImgHeight];

	// 基準圖象的高度和寬度
	int nBaseWidth, nBaseHeight;
	nBaseWidth  = m_pDibInit->m_lpBMIH->biWidth;
	nBaseHeight = m_pDibInit->m_lpBMIH->biHeight;

	// 基準圖象的存儲寬度
	int nBaseSaveWidth;
	nBaseSaveWidth = m_pDibInit->GetDibSaveDim().cx;
	
	for(int i=0;i<rectNewImg.bottom-rectNewImg.top;i++)
		for(int j=0;j<rectNewImg.right-rectNewImg.left;j++)
		{
			if(i<-rectNewImg.top||i>=-rectNewImg.top+nBaseHeight||j<-rectNewImg.left||j>=-rectNewImg.left+nBaseWidth)
				pUnchAftAffBase[i*nNewImgWidth + j] = 0;
			else
				pUnchAftAffBase[i*nNewImgWidth + j] = m_pDibInit->m_lpImage[(nBaseHeight - (i+rectNewImg.top) - 1)*nBaseSaveWidth + (j+rectNewImg.left)];
		}

	// 返回
	return (LPBYTE)pUnchAftAffBase;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品热久久久久夜色精品三区 | 欧美精品123区| 国产精品无码永久免费888| 国产真实乱对白精彩久久| 69久久99精品久久久久婷婷| 午夜电影网一区| 欧美性受xxxx黑人xyx性爽| 一区二区三区在线视频免费观看| 91视频com| 亚洲综合在线免费观看| 91国产丝袜在线播放| 图片区日韩欧美亚洲| 日韩女优av电影在线观看| 国产精品白丝av| 亚洲人妖av一区二区| 91成人国产精品| 男人的天堂久久精品| 亚洲精品一区二区三区福利| 国产精品影视在线观看| ...中文天堂在线一区| 欧美日韩日日骚| 韩国一区二区三区| 亚洲视频免费在线| 欧美高清激情brazzers| 久久99日本精品| 国产精品久久久久天堂| 色婷婷精品久久二区二区蜜臂av| 午夜亚洲福利老司机| 久久综合久色欧美综合狠狠| 成+人+亚洲+综合天堂| 婷婷中文字幕综合| 欧美韩国日本不卡| 欧美二区乱c少妇| 99精品一区二区三区| 麻豆国产精品视频| 亚洲色图制服诱惑| 日韩一级欧美一级| 91视频在线观看| 韩国精品主播一区二区在线观看| 亚洲欧美另类小说| 精品国产一区二区亚洲人成毛片| 色综合久久99| 国产乱码字幕精品高清av| 欧美精品aⅴ在线视频| 国产在线视频精品一区| 欧美三级三级三级爽爽爽| 丁香亚洲综合激情啪啪综合| 69av一区二区三区| 中文字幕免费观看一区| 欧美视频在线播放| 日韩国产精品大片| 日韩欧美国产不卡| 欧美日韩在线直播| 久久疯狂做爰流白浆xx| 国产精品久久久久四虎| 久久se这里有精品| 婷婷开心激情综合| 欧美韩日一区二区三区四区| 一本一道波多野结衣一区二区 | 在线播放91灌醉迷j高跟美女| 久久丁香综合五月国产三级网站| 久久久99久久| 美腿丝袜亚洲三区| 亚洲国产乱码最新视频| 精品久久久久久久久久久久久久久久久| 国模娜娜一区二区三区| 国产女主播视频一区二区| eeuss鲁片一区二区三区| 久久久精品中文字幕麻豆发布| 国产精品色哟哟| 国产欧美一区二区精品忘忧草| 欧美四级电影在线观看| av电影在线观看一区| 日本三级亚洲精品| 日韩av高清在线观看| 亚洲视频网在线直播| www国产成人| 欧美精品一二三四| 欧美日韩国产综合一区二区| 国产精品一区在线| 日韩精品欧美精品| 亚洲精品免费一二三区| 欧美日韩免费不卡视频一区二区三区| 国产一区二区三区在线看麻豆| 亚洲欧美激情在线| 国产网红主播福利一区二区| 欧美主播一区二区三区美女| 国产乱码一区二区三区| 免费精品视频最新在线| 亚洲激情图片一区| 91精品国产全国免费观看| 91蜜桃视频在线| 午夜一区二区三区在线观看| 678五月天丁香亚洲综合网| 国产东北露脸精品视频| 日本va欧美va精品发布| 亚洲免费在线播放| 欧美一级免费大片| 欧美一区二区三区婷婷月色| 成人av先锋影音| 粉嫩一区二区三区性色av| 日产国产欧美视频一区精品| 日韩欧美国产一二三区| 欧美午夜精品久久久久久超碰| 国产一区二区导航在线播放| 蜜臀91精品一区二区三区| 欧美精彩视频一区二区三区| 日韩欧美国产系列| 国产在线麻豆精品观看| 韩国av一区二区三区四区| 精品影视av免费| 亚洲美女免费在线| 青青草成人在线观看| 午夜伦欧美伦电影理论片| 亚洲精选一二三| 午夜精品福利一区二区三区av| 精品国产一区久久| 日韩视频国产视频| 欧美在线视频全部完| 色综合天天综合网国产成人综合天| 国产九色精品成人porny| 亚洲一区二区免费视频| 午夜精品成人在线视频| 日韩高清不卡一区| 日本人妖一区二区| 国产精品久久看| 蜜臀国产一区二区三区在线播放| 日韩国产成人精品| 亚洲自拍偷拍av| 韩国视频一区二区| 久久综合九色综合97婷婷 | 国产在线视频精品一区| 欧美日韩在线播放一区| 欧美影视一区二区三区| 欧美日韩一区二区三区不卡| 不卡的av电影| 久久夜色精品一区| 国产a级毛片一区| 91视频com| 色综合久久66| 91精品国产综合久久久蜜臀图片| 国产一区二区三区不卡在线观看| 中文字幕成人在线观看| 亚洲日本一区二区| 国产精品久久三| 亚洲一区二区视频在线| 久久精品欧美一区二区三区麻豆 | 成人黄色av网站在线| 国产欧美精品一区二区色综合| 亚洲成人免费影院| 成人午夜在线免费| 日本一区免费视频| 爽好久久久欧美精品| 亚洲一区二区三区四区在线| 99久久夜色精品国产网站| 欧美综合亚洲图片综合区| av中文字幕在线不卡| 国产精品亲子乱子伦xxxx裸| 久久精品久久久精品美女| 欧美成人在线直播| 午夜电影一区二区三区| 亚洲精品免费一二三区| 亚洲sss视频在线视频| 蜜乳av一区二区三区| 91精品国产综合久久香蕉麻豆| 国产欧美日韩视频在线观看| 亚洲综合一二区| 男人的天堂亚洲一区| 极品美女销魂一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 日韩欧美国产麻豆| 久久国产夜色精品鲁鲁99| 日韩精品一区在线| 久久精品国产久精国产爱| 欧美蜜桃一区二区三区| 91精品福利在线| 欧美日韩激情一区二区| 一区二区三区欧美亚洲| 国产1区2区3区精品美女| 日本精品裸体写真集在线观看| 在线观看国产日韩| 亚洲精品一卡二卡| 精品少妇一区二区三区在线播放| 午夜精品免费在线| 制服丝袜亚洲播放| 国产成a人亚洲精品| 欧美一级日韩免费不卡| 欧美变态口味重另类| 亚洲一区视频在线观看视频| 91丝袜高跟美女视频| 免费观看一级特黄欧美大片| 日韩丝袜美女视频| 精品一区二区三区在线观看| 国产成人综合视频| 国产麻豆精品theporn| 免费国产亚洲视频| 亚洲精品乱码久久久久久| 欧美国产日韩亚洲一区| 免费看欧美女人艹b| 成人一区二区三区视频在线观看 |