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

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

?? dib.cpp

?? 人臉檢測系統---可以較好的實現人臉定位
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
	GlobalFree(hTempDIB);

}
void DIB::Dilation(HANDLE hDIB)
{
	LPBITMAPINFOHEADER lpbi;
	int height;
	int width;
	WORD wBytesPerLine;
	LPBYTE lpData;
	LPBYTE lpTemp;
	long lOffset;
	//得到圖象的基本信息
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	height = lpbi->biHeight;
	width = lpbi->biWidth;
	wBytesPerLine = this->BytePerLine(hDIB);
	lpData = this->FindDIBBits(hDIB);
	//申請一塊和數據區大小相同的內存
	lpTemp = (LPBYTE) new BYTE[wBytesPerLine * height];
	
	
	long lOffsetJudge;
	for (int i=1; i<height-1; i++)
		for (int j=1; j<width-1; j++)
		{	
			lOffset = this->PixelOffset(i, j, wBytesPerLine);
			//如果當前點為白色,接著循環
			if(*(lpData + lOffset) == 255)
			{
				*(lpTemp + lOffset++) = 255;
				*(lpTemp + lOffset++) = 255;
				*(lpTemp + lOffset++) = 255;
				continue;
			}
			//否則考察上下左右四個點
			else
			{	
				lOffsetJudge = this->PixelOffset(i-1, j, wBytesPerLine);
				//如果上面的點為白色
				if(*(lpData + lOffsetJudge) == 255)
				{	//設置為白色,并繼續循環
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}

				//考察下面的點
				lOffsetJudge = this->PixelOffset(i+1,j, wBytesPerLine);
				if(*(lpData + lOffsetJudge) == 255)
				{
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}
				
				//考察左邊的點
				lOffsetJudge = this->PixelOffset(i,j-1, wBytesPerLine);
				if(*(lpData + lOffsetJudge) == 255)
				{
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}
				//考察右邊的點
				lOffsetJudge = this->PixelOffset(i,j+1, wBytesPerLine);
				if(*(lpData + lOffsetJudge) == 255)
				{
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}
				//如果上下左右都是黑色點,則把暫時區域的點設置為黑色
				lOffset = this->PixelOffset(i,j,wBytesPerLine);
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;

			}
				
		}
		//處理圖象四周的點,設置為黑色
		for(i=0; i<height; i++)
		{
			lOffset = this->PixelOffset(i, 0, wBytesPerLine);
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}

		for(i=0; i<height; i++)
		{
			lOffset = this->PixelOffset(i, width-1, wBytesPerLine);
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}

		for(i=0; i<width; i++)
		{
			lOffset = this->PixelOffset(0, i, wBytesPerLine);
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}

		for(i=0; i<width; i++)
		{
			lOffset = this->PixelOffset(height-1, i, wBytesPerLine);
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}
		//把暫時區域的點拷貝到原句柄區域下面
		memcpy(lpData, lpTemp, wBytesPerLine*height);
		delete [] lpTemp;
		GlobalUnlock(hDIB);

}

void DIB::DeleteFasleEye(HANDLE hDIB, CRect facelocation)
{
	LPBYTE lpData;
	LPBITMAPINFOHEADER lpbi;
	int height;
	int width;
	long lOffset;
	WORD wBytesPerLine;

	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	height = lpbi->biHeight;
	width = lpbi->biWidth;
	lpData = this->FindDIBBits(hDIB);
	wBytesPerLine = this->BytePerLine(hDIB);
	for (int i=0; i<height; i++)
		for (int j=0; j<width; j++)
		{
			lOffset = this->PixelOffset(i, j, wBytesPerLine);
			if(*(lpData + lOffset) == 255)
			{
				if(i<(facelocation.bottom+facelocation.top)/2)
				{
					*(lpData + lOffset++) = 0;
					*(lpData + lOffset++) = 0;
					*(lpData + lOffset++) = 0;
				}
			}
		}
		GlobalUnlock(hDIB);
}

void DIB::DeleteScatePoint(HANDLE hDIB)
{	
	LPBITMAPINFOHEADER lpbi;
	int height;
	int width;
	LPBYTE lpData;
	WORD wBytesPerLine;
	long lOffset;
	
	//得到圖象的基本信息
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	height = lpbi->biHeight;
	width  = lpbi->biWidth;
	wBytesPerLine = this->BytePerLine(hDIB);
	lpData = this->FindDIBBits(hDIB);
	
	for (int i=0; i<height; i++)
		for(int j=0; j<width; j++)
		{	
			//得到偏移
			lOffset = this->PixelOffset(i, j, wBytesPerLine);
			//如果當前點為白色點
			if(*(lpData + lOffset) == 255)
			{	
				//設定判斷數組
				for(int ii = 0;ii<ImgRange;ii++)
					for (int jj=0; jj<ImgRange; jj++)
						this->lab[ii][jj] = false;
					//設定判斷長度
					this->lenth=0;
					//判斷是否為離散點
				bool judge = this->IsScaterPoint(j, i, width,height,lpData,wBytesPerLine,3,this->lab);
				if(!judge)
				{	
					//是離散點則把該點設置為黑色
					*(lpData + lOffset++) = 0;
					*(lpData + lOffset++) = 0;
					*(lpData + lOffset++) = 0;
				}
			}
		}
	GlobalUnlock(hDIB);
}

void  DIB::  MouseMap(LPBYTE lpRgb, const LPBYTE lpYcc,  WORD wBytesPerLine, CRect faceLocation)
{	
	//下面的循環在人臉的區域內實現嘴巴的匹配
	for (int i=faceLocation.top; i<faceLocation.bottom; i++)
		for (int j=faceLocation.left; j<faceLocation.right; j++)
		{	
			//得到偏移
			long lOffset = this->PixelOffset(i, j, wBytesPerLine);
			//得到cr,cb的數值
			int cr = *(lpYcc+lOffset+1);
			int cb = *(lpYcc+lOffset+2);
			//標志
			bool lab;
			int mapm;
			//根據cr的數值設定標志
			cr = cr-143;
			if(cr <-5 || cr>5)
			{
				cr = 0;
				
			}
		
			cr *=cr;
			
			if(cr>16)
				 lab = true;
			else
				lab = false;
			//根據cb的時值設定標志
			cb= cb-120;
			if(cb<-5 || cb >5)
				
			{
				cb = 0;
				if(lab = true)
					lab = false;
			}
			//如果cr,cb兩項數值都在設定的范圍之內,則設定顏色位白色,否則黑色
			if(lab)
				mapm = 255;
			else
				mapm = 0;
			 
			*(lpRgb + lOffset++) = mapm;
			*(lpRgb + lOffset++) = mapm;
			*(lpRgb + lOffset++) = mapm;

			
		}
}

void DIB::MouthCenter(HANDLE hDIB, CRect faceLocation, CPoint &mouthLocation)
{
	LPBITMAPINFOHEADER lpbi;
	int height;
	int width;
	long lOffset;
	WORD wBytesPerLine;
	LPBYTE lpData;
	
	//得到圖象的基本信息
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	height = lpbi->biHeight;
	width  = lpbi->biWidth;
	wBytesPerLine = this->BytePerLine(hDIB);
	lpData = this->FindDIBBits(hDIB);
	
	//下面的三個變量用來累計嘴巴區域的象素的x,y和象素點數
	int xnum = 0 ;
	int ynum = 0 ;
	int count = 0;
	for (int i=faceLocation.top; i<faceLocation.bottom; i++)
		for (int j=faceLocation.left; j<faceLocation.right; j++)
		{
			lOffset = this->PixelOffset(i, j, wBytesPerLine);
			//白色點
			if(*(lpData + lOffset) == 255)
			{	
				//x值加
				xnum +=j;
				//y值加
				ynum +=i;
				//點數加
				count++;
			}
		}
		//得到中心點位置
	mouthLocation.x = xnum/count;
	mouthLocation.y = ynum/count;
	
	//把中心點設置位綠色
	lOffset = this->PixelOffset(mouthLocation.y, mouthLocation.x, wBytesPerLine);
	*(lpData + lOffset++) =0;
	*(lpData + lOffset++) =255;
	*(lpData + lOffset++) =0;

	GlobalUnlock(hDIB);
}

void DIB::EyeCenter(HANDLE hDIB, CRect faceLocation, CPoint &eye1, CPoint &eye2)
{
	LPBITMAPINFOHEADER lpbi;
	LPBYTE lpData;
	long lOffset;
	WORD wBytesPerLine;
	int height;
	int width;
	int pixelnum =0;
	int num =0;
	//得到圖象基本信息
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	height = lpbi->biHeight;
	width  = lpbi->biWidth;
	lpData = this->FindDIBBits(hDIB);
	wBytesPerLine  = this->BytePerLine(hDIB);
	//考察人臉區域
	for(int i=faceLocation.top; i<faceLocation.bottom; i++)
		for (int j=faceLocation.left; j<faceLocation.right; j++)
		{
			lOffset = this->PixelOffset(i, j, wBytesPerLine);
			//白色點
			if(*(lpData + lOffset) == 255)
				//遞歸統計象素并修改象素值
				this->RecursiveCal(lpData,i,j,wBytesPerLine,pixelnum,++num);
		}
		//初始化眼睛的坐標
		eye1.x =0;
		eye1.y =0;
		eye2.x =0;
		eye2.y =0;
		//初始化象素點個數
		int eye1count=0;
		int eye2count =0;
		for (i=faceLocation.top; i<faceLocation.bottom; i++)
			for (int j=faceLocation.left; j<faceLocation.right; j++)
			{
				lOffset = this->PixelOffset(i, j, wBytesPerLine);
				//如果象素點的數值為1
				if(*(lpData + lOffset) == 1)
				{	
					//眼睛1的橫坐標和縱坐標加上當前點的坐標值
					eye1.x +=j;
					eye1.y +=i;
					eye1count++;
					//把當前點改成白色
					*(lpData + lOffset++) = 255;
					*(lpData + lOffset++) = 255;
					*(lpData + lOffset++) = 255;

				}
				//如果當前象素的數值為2
				else if(*(lpData + lOffset) == 2)
				{	
					//眼睛2的橫坐標和縱坐標加上當前點的坐標值
					eye2.x +=j;
					eye2.y +=i;
					//象素點個數加一
					eye2count++;
					//把當前點設置為白色
					*(lpData + lOffset++) = 255;
					*(lpData + lOffset++) = 255;
					*(lpData + lOffset++) = 255;
				}
			}
			//計算眼睛的中心點坐標
			eye1.x /=eye1count;
			eye1.y /=eye1count;
			eye2.x /=eye2count;
			eye2.y /=eye2count;
			//把中心點設置為綠色
			lOffset = this->PixelOffset(eye1.y, eye1.x ,wBytesPerLine);
			*(lpData + lOffset++) = 0;
			*(lpData + lOffset++) = 255;
			*(lpData + lOffset++) = 0;

			lOffset = this->PixelOffset(eye2.y, eye2.x ,wBytesPerLine);
			*(lpData + lOffset++) = 0;
			*(lpData + lOffset++) = 255;
			*(lpData + lOffset++) = 0;
	GlobalUnlock(hDIB);
}

void DIB::EllipseFace(HANDLE hDIB, CPoint mouth, CPoint eye1, CPoint eye2)
{
	LPBYTE lpData;
	LPBITMAPINFOHEADER lpbi;
	int width;
	int height;
	WORD wBytesPerLine;
	long lOffset;
	//得到圖象的基本信息
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	height = lpbi->biHeight;
	width  = lpbi->biWidth;
	lpData = this->FindDIBBits(hDIB);
	wBytesPerLine = this->BytePerLine(hDIB);
	
	//用dda算法畫三角形
	this->DdaLine(mouth,eye1,lpData,wBytesPerLine);
	this->DdaLine(mouth,eye2,lpData,wBytesPerLine);
	this->DdaLine(eye1,eye2,lpData,wBytesPerLine);
	
	//橢圓的中心點和兩個焦點坐標
	int ellipsecenter_x;
	int ellipsecenter_y;
	int ellipseFocusTop_x;
	int ellipseFocusTop_y;
	int ellipseFocusBottom_x;
	int ellipseFocusBottom_y;
	
	//根據眼睛和嘴巴的坐標計算橢圓的中心點坐標
	ellipsecenter_x = (eye1.x + eye2.x + mouth.x )/3;
	ellipsecenter_y = (eye1.y + eye2.y)/2 -abs(eye2.x - eye1.x)/2;

	//上面的焦點
	ellipseFocusTop_x = ellipsecenter_x;
	ellipseFocusBottom_x = ellipsecenter_x;

	//下面的焦點
	ellipseFocusTop_y =  ellipsecenter_y + (eye1.y +eye2.y)/2 -mouth.y;
	ellipseFocusBottom_y = ellipsecenter_y - ((eye1.y +eye2.y)/2 -mouth.y)+2;

	//長軸
	int a = (eye1.x-eye2.x)*2-2;
	
	for (int i=0; i<height; i++)
		for (int j=0; j<width; j++)
		{	
			//得到一個點到兩個焦點的距離和
			int lenth = sqrt(pow(j-ellipseFocusTop_x,2)+pow(i-ellipseFocusTop_y,2))
				+sqrt(pow(j-ellipseFocusBottom_x,2)+ pow(i-ellipseFocusBottom_y,2));
			//判斷距離和與長軸的關系
			if(lenth<2*a+2 && lenth >2*a-2)
			{	
				//把點設置為綠色
				lOffset = this->PixelOffset(i, j, wBytesPerLine);
				*(lpData + lOffset++) = 0;
				*(lpData + lOffset++) = 255;
				*(lpData + lOffset++) = 0;
			}
		}


	GlobalUnlock(hDIB);
}


void DIB::DdaLine(CPoint from, CPoint end, LPBYTE lpData, WORD wBytesPerLine)
{	
	//x,y的增量
	float delta_x;
	float delta_y;
	//x,y的坐標
	float x;
	float y;
	//x,y上的差值
	int dx;
	int dy;
	//總的步長
	int steps;
	int k;
	//得到x,y的差值
	dx = end.x - from.x;
	dy = end.y - from.y;
	//判斷x,y上的差值大小,確定步長
	if(abs(dx) > abs(dy))
	{
		steps = abs(dx);
	}
	else
	{
		steps = abs(dy);
	}

	//得到每次增量的大小
	delta_x = (float)dx / (float)steps;
	delta_y = (float)dy / (float)steps;
	//設定x,y的起點
	x = (float)from.x;
	y = (float)from.y;

	//設定初始點的顏色為綠色
	long lOffset = this->PixelOffset(y, x, wBytesPerLine);
	*(lpData + lOffset++) = 0;
	*(lpData + lOffset++) = 255;
	*(lpData + lOffset++) = 0;

	//根據計算得到的步長,把直線上的點填充成綠色
	for (k=1;k<=steps; k++)
	{	
		//x,y分別加上各自的增量
		x+=delta_x;
		y+=delta_y;
		//設置點的顏色
		lOffset = this->PixelOffset(y, x, wBytesPerLine);
		*(lpData + lOffset++) = 0;
		*(lpData + lOffset++) = 255;
		*(lpData + lOffset++) = 0;

	}
	

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国免费一区二区三区| 亚洲乱码国产乱码精品精的特点 | 欧美性猛片aaaaaaa做受| 欧美日韩日日骚| 欧美国产亚洲另类动漫| 午夜精品在线视频一区| av电影一区二区| 精品久久久久久最新网址| 亚洲综合丝袜美腿| av电影在线不卡| 久久亚洲二区三区| 美女视频网站黄色亚洲| 欧美色图天堂网| 亚洲女爱视频在线| 不卡av电影在线播放| 久久这里都是精品| 久久精品国内一区二区三区| 91国偷自产一区二区三区观看| 亚洲国产精品二十页| 久久99精品久久久久久动态图| 欧美日韩精品综合在线| 一区二区三区鲁丝不卡| 在线日韩一区二区| 悠悠色在线精品| 日本道在线观看一区二区| 亚洲欧美怡红院| 91麻豆6部合集magnet| 日韩一区在线免费观看| 成人aa视频在线观看| 亚洲欧美在线另类| 色香蕉成人二区免费| 一区二区三区国产豹纹内裤在线| 91碰在线视频| 一区二区激情视频| 欧美日韩一卡二卡三卡 | 91九色最新地址| 亚洲一区二三区| 欧美日韩免费电影| 午夜久久久久久电影| 制服丝袜亚洲播放| 精品一区二区在线观看| 久久久久久日产精品| 26uuu国产电影一区二区| 麻豆91在线播放| 久久久亚洲精华液精华液精华液| 国产一区二区三区免费观看| 国产欧美日产一区| 色嗨嗨av一区二区三区| 五月婷婷激情综合网| 精品国产一二三| heyzo一本久久综合| 亚洲综合一区二区精品导航| 欧美精品黑人性xxxx| 国内成人免费视频| 国产精品久久久久久久久免费丝袜 | 欧美精品自拍偷拍动漫精品| 人人狠狠综合久久亚洲| 欧美激情中文字幕一区二区| 色就色 综合激情| 日韩高清不卡在线| 国产人妖乱国产精品人妖| 一本色道久久综合亚洲精品按摩| 日韩精品成人一区二区在线| 久久蜜桃一区二区| 欧美性色aⅴ视频一区日韩精品| 麻豆成人91精品二区三区| 亚洲欧洲精品一区二区精品久久久 | 欧美精品一区二区三区很污很色的 | 国产成人免费高清| 亚洲一线二线三线视频| 欧美大片一区二区| 91在线视频播放| 美女一区二区视频| 中文字幕一区二区5566日韩| 91麻豆精品久久久久蜜臀| 不卡影院免费观看| 久久国产精品99久久久久久老狼 | 99视频精品在线| 久久精品99国产精品| 亚洲丝袜另类动漫二区| 日韩一区二区三区四区| 91亚洲国产成人精品一区二区三 | 99国产精品久久久| 麻豆精品视频在线观看免费| 国产99久久久久久免费看农村| 亚洲一区在线观看视频| 亚洲国产成人在线| 日韩精品一区二区三区四区| 欧洲精品视频在线观看| 成人爱爱电影网址| 国产精品一区二区不卡| 日本伊人午夜精品| 亚洲欧美偷拍卡通变态| 久久精品视频一区| 日韩欧美成人一区二区| 欧美日韩一区二区在线观看视频| 不卡电影一区二区三区| 狠狠色狠狠色综合| 日本中文字幕一区二区有限公司| 洋洋av久久久久久久一区| 中文字幕在线视频一区| 中文字幕免费不卡在线| 久久久亚洲欧洲日产国码αv| 欧美一区二区日韩一区二区| 欧美日韩成人综合| 欧美人妖巨大在线| 欧美色精品在线视频| 欧美三级在线播放| 欧洲亚洲精品在线| 欧美日韩一区在线| 欧美久久一二区| 91麻豆精品国产| 欧美一区二区三区啪啪| 日韩一区二区视频| 欧美大片免费久久精品三p| 日韩精品一区二区三区蜜臀| 日韩欧美一二三区| 精品国产乱子伦一区| 久久久久久久久久久久久女国产乱| 精品国产123| 国产精品三级电影| 亚洲人成人一区二区在线观看| 成人欧美一区二区三区视频网页| 日韩美女精品在线| 伊人色综合久久天天人手人婷| 亚洲精品菠萝久久久久久久| 亚洲高清三级视频| 日韩中文字幕亚洲一区二区va在线 | 亚洲综合小说图片| 丝袜亚洲另类欧美| 久久精品国产99| 成人综合在线网站| 日本韩国一区二区三区视频| 欧美日韩小视频| 欧美精品一区二区不卡| 日本一区二区久久| 亚洲一区在线电影| 精品一区二区三区免费视频| 成人性生交大片| 精品视频999| 久久免费美女视频| 亚洲欧美日韩综合aⅴ视频| 亚洲一区二区3| 国产自产高清不卡| 欧美午夜一区二区三区免费大片| 日韩欧美电影一区| 国产精品888| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | www国产精品av| 国产精品久久免费看| 亚洲成人动漫精品| 国产白丝网站精品污在线入口| 色综合欧美在线视频区| 日韩欧美二区三区| 一区二区三区视频在线观看| 久草精品在线观看| 欧美在线观看视频在线| 久久久噜噜噜久久中文字幕色伊伊| 亚洲精品一二三| 国产乱码精品1区2区3区| 一本色道久久综合亚洲精品按摩 | 美女国产一区二区三区| 99久久99久久精品国产片果冻 | 日本不卡视频在线| 色综合天天综合网天天看片| 欧美一二三区在线| 亚洲国产精品久久人人爱| 粉嫩蜜臀av国产精品网站| 欧美久久久久久蜜桃| 亚洲欧洲一区二区三区| 久久精品国产久精国产| 欧美日韩国产首页| 亚洲欧美在线aaa| 国产精品一区二区三区乱码| 日韩一区二区在线播放| 洋洋成人永久网站入口| youjizz国产精品| 久久九九影视网| 精品一区二区在线观看| 91精品视频网| 亚洲国产日韩一区二区| 色综合中文字幕| 国产精品丝袜黑色高跟| 国产精品亚洲一区二区三区在线| 69堂成人精品免费视频| 亚洲永久免费视频| 欧美色涩在线第一页| 一区二区在线观看视频 | 国产精品成人在线观看| 国产一区二区三区蝌蚪| 精品日韩成人av| 韩国v欧美v日本v亚洲v| 91精品国产一区二区人妖| 一区二区三区在线免费视频| 99久久国产综合色|国产精品| 中文字幕乱码亚洲精品一区| 国产一区二区久久| 久久久不卡影院| 国产精品996| 中文字幕在线不卡一区|