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

📄 facedetectiondoc.cpp

📁 人脸识别,希望对大家有所帮助!它的应用将扩展到教育、培训和娱乐等新的领域。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
}

void CFaceDetectionDoc::Dilation()
{
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) m_hDIB);//读取头文件
	lLineBytesMulspec = WIDTHBYTES((lpbi->biWidth)*24);
	::GlobalUnlock((HGLOBAL) m_hDIB);
	int width,height;
	LPBYTE lpData;
	long wBytesPerLine;
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);	
	// 获取DIB宽度
	width= (int) ::DIBWidth(lpDIB);		
	// 获取DIB高度
	height= (int) ::DIBHeight(lpDIB);
	lpData = (unsigned char*)::FindDIBBits(lpDIB);
	//得到图片每行的象素所占字节个数
	wBytesPerLine = lLineBytesMulspec;
	//申请一块和数据区大小相同的内存
	LPBYTE lpTemp;
	lpTemp = (LPBYTE) new BYTE[wBytesPerLine * height];	
	long lOffsetJudge;
	long lOffset;
	for (int i=1; i<height-1; i++)
		for (int j=1; j<width-1; j++)
		{	
			lOffset = i*wBytesPerLine + j*3;
			//如果当前点为白色,接着循环
			if(*(lpData + lOffset) == 255)
			{
				*(lpTemp + lOffset++) = 255;
				*(lpTemp + lOffset++) = 255;
				*(lpTemp + lOffset++) = 255;
				continue;
			}
			//否则考察上下左右四个点
			else
			{	
				lOffsetJudge = (i-1)*wBytesPerLine + j*3;
				//如果上面的点为白色
				if(*(lpData + lOffsetJudge) == 255)
				{	//设置为白色,并继续循环
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}

				//考察下面的点
				lOffsetJudge = (i+1)*wBytesPerLine + j*3;
				if(*(lpData + lOffsetJudge) == 255)
				{
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}
				
				//考察左边的点
				lOffsetJudge = i*wBytesPerLine + (j-1)*3;
				if(*(lpData + lOffsetJudge) == 255)
				{
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}
				//考察右边的点
				lOffsetJudge = i*wBytesPerLine + (j+1)*3;
				if(*(lpData + lOffsetJudge) == 255)
				{
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					*(lpTemp + lOffset++) = 255;
					continue;
				}
				//如果上下左右都是黑色点,则把暂时区域的点设置为黑色
				lOffset = i*wBytesPerLine + j*3;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;

			}
				
		}
		//处理图象四周的点,设置为黑色
		for(i=0; i<height; i++)
		{
			lOffset = i*wBytesPerLine;
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}

		for(i=0; i<height; i++)
		{
			lOffset = i*wBytesPerLine + (width-1)*3;
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}

		for(i=0; i<width; i++)
		{
			lOffset = i*3;
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}

		for(i=0; i<width; i++)
		{
			lOffset = (height-1)*wBytesPerLine + i*3;
			{
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
				*(lpTemp + lOffset++) = 0;
			}
		}
		//把暂时区域的点拷贝到原句柄区域下面
		memcpy(lpData, lpTemp, wBytesPerLine*height);
		delete [] lpTemp;
		::GlobalUnlock((HGLOBAL) m_hDIB);
}

void CFaceDetectionDoc::Erasion()
{
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) m_hDIB);//读取头文件
	lLineBytesMulspec = WIDTHBYTES((lpbi->biWidth)*24);
	::GlobalUnlock((HGLOBAL) m_hDIB);
	int width,height;
	LPBYTE lpData;
	long wBytesPerLine;
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);	
	// 获取DIB宽度
	width= (int) ::DIBWidth(lpDIB);		
	// 获取DIB高度
	height= (int) ::DIBHeight(lpDIB);
	lpData = (unsigned char*)::FindDIBBits(lpDIB);
	//得到图片每行的象素所占字节个数
	wBytesPerLine = lLineBytesMulspec;
	//申请一块和数据区大小相同的内存
	LPBYTE lpTemp;
	lpTemp = (LPBYTE) new BYTE[wBytesPerLine * height];	
	long lOffsetJudge;
	long lOffset;
	//下面的循环实现腐蚀功能
	for (int i=1; i<height-1; i++)
		for (int j=1; j<width-1; j++)
		{
			lOffset = i*wBytesPerLine + j*3;
			//如果为白色点
			if (*(lpData+lOffset) == 255)
			{	
				//考察上面的点
				lOffsetJudge = (i-1)*wBytesPerLine + j*3;
				//如果是黑色就把原来的点设置为黑色,并接着循环
				if (*(lpData + lOffsetJudge) ==0)
				{
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					continue;
				}
				//考察下面的点
				lOffsetJudge =  (i+1)*wBytesPerLine + j*3;
				if (*(lpData + lOffsetJudge) ==0)
				{
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					continue;
				}
				//左面的点
				lOffsetJudge = i*wBytesPerLine + (j-1)*3;
				if (*(lpData + lOffsetJudge) ==0)
				{
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					continue;
				}
				//右面的点
				lOffsetJudge = i*wBytesPerLine + (j+1)*3;
				if (*(lpData + lOffsetJudge) ==0)
				{
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					continue;
				}
				//如果上下左右四个点都是白色,则设置为白色
				lOffset = i*wBytesPerLine + j*3;
				*(lpTemp + lOffset)   = 255;
				*(lpTemp + lOffset+1) = 255;
				*(lpTemp + lOffset+2) = 255;
				
			}
			//如果当前点为黑色,则在暂时的目标区域中设置为黑色
			else
			{
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;
			}
		}
		
		//把图象周边的点全部设置为黑色
		for(i=0; i<height; i++)
		{
			lOffset = i*wBytesPerLine;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}
		
		for(i=0; i<height; i++)
		{
			lOffset = i*wBytesPerLine + (width-1)*3;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}

	for (i=0; i<width; i++)
		{
			lOffset =i*3;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}
	
	for (i=0; i<width; i++)
		{
			lOffset = (height-1)*wBytesPerLine + i*3;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}
	//把暂时区域的点拷贝到原句柄区域下面
	memcpy(lpData, lpTemp, wBytesPerLine*height);
	delete [] lpTemp;
	::GlobalUnlock((HGLOBAL) m_hDIB);
}
void CFaceDetectionDoc::ErasionMouse()
{
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) m_hDIB);//读取头文件
	lLineBytesMulspec = WIDTHBYTES((lpbi->biWidth)*24);
	::GlobalUnlock((HGLOBAL) m_hDIB);
	int width,height;
	LPBYTE lpData;
	long wBytesPerLine;
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);	
	// 获取DIB宽度
	width= (int) ::DIBWidth(lpDIB);		
	// 获取DIB高度
	height= (int) ::DIBHeight(lpDIB);
	lpData = (unsigned char*)::FindDIBBits(lpDIB);
	//得到图片每行的象素所占字节个数
	wBytesPerLine = lLineBytesMulspec;
	//申请一块和数据区大小相同的内存
	LPBYTE lpTemp;
	lpTemp = (LPBYTE) new BYTE[wBytesPerLine * height];	
	long lOffsetJudge;
	long lOffset;
	//下面的代码实现腐蚀功能
	for (int i=1; i<height-1; i++)
		for (int j=1; j<width-1; j++)
		{	
			//如果当前点为白色
			lOffset = i*wBytesPerLine + j*3;
			if (*(lpData+lOffset) == 255)
			{
				
				//判断左边的点,如果是黑色的就把暂时区域中的对应点设置为黑色
				lOffsetJudge = i*wBytesPerLine + (j-1)*3;
				if (*(lpData + lOffsetJudge) ==0)
				{
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					continue;
				}
				//考察右边的点
				lOffsetJudge =i*wBytesPerLine + (j+1)*3;
				if (*(lpData + lOffsetJudge) ==0)
				{
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					*(lpTemp + lOffset++) = 0;
					continue;
				}

				//如果左右两边的点都是白色把点设置为白色
				lOffset = i*wBytesPerLine + j*3;
				*(lpTemp + lOffset)   = 255;
				*(lpTemp + lOffset+1) = 255;
				*(lpTemp + lOffset+2) = 255;
				
			}
			//如果当前点为黑色,则把暂时区域中对应点设置为黑色
			else
			{
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;
			}
		}
		//把图象四周的点设置为黑色
		for(i=0; i<height; i++)
		{
			lOffset = i*wBytesPerLine;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}
		
		for(i=0; i<height; i++)
		{
			lOffset = i*wBytesPerLine + (width-1)*3;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}

	for (i=0; i<width; i++)
		{
			lOffset = i*3;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}
	
	for (i=0; i<width; i++)
		{
			lOffset = (height-1)*wBytesPerLine + i*3;
				*(lpTemp + lOffset)   = 0;
				*(lpTemp + lOffset+1) = 0;
				*(lpTemp + lOffset+2) = 0;

		}
	//把暂时区域的点拷贝到原句柄下
	memcpy(lpData,lpTemp,wBytesPerLine*height);
	delete [] lpTemp;
	::GlobalUnlock((HGLOBAL) m_hDIB);

}

void CFaceDetectionDoc::DeleteFalseArea()
{
	int PixelNum[255];
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) m_hDIB);//读取头文件
	lLineBytesMulspec = WIDTHBYTES((lpbi->biWidth)*24);
	::GlobalUnlock((HGLOBAL) m_hDIB);
	int width,height;
	LPBYTE lpData;
	long wBytesPerLine;
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);	
	// 获取DIB宽度
	width= (int) ::DIBWidth(lpDIB);		
	// 获取DIB高度
	height= (int) ::DIBHeight(lpDIB);
	lpData = (unsigned char*)::FindDIBBits(lpDIB);
	//得到图片每行的象素所占字节个数
	wBytesPerLine = lLineBytesMulspec;
	long lOffset;	
	//初始化象素累计数组
	for (int i=0; i<255; i++)
	{
		PixelNum[i] = 0;
	}	
	int calNum =1;
	for (i=0; i<height; i++)
		for (int j=0; j<width; j++)
		{
			lOffset = i*wBytesPerLine + j*3;
			//如果象素为白色
			if (*(lpData + lOffset)==255)
			{	
				//递归统计该区域连续的白色点象素点个数
				RecursiveCal(lpData, i,j,wBytesPerLine, PixelNum[calNum],calNum);
				calNum++;
			}
		}
		
		for (i=0; i<calNum; i++)
		{	
			//如果象素点个数小于一定数目则把这个标志设置为0
			if (PixelNum[i] < AREAPIXEL)
			{
				PixelNum[i] = 0;
			}
		}
		//下面的循环根据标志数组来最终设定图象的颜色
		for(i=0; i<height; i++)
			for (int j=0; j<width; j++)
			{
				lOffset = i*wBytesPerLine + j*3;
				int num = *(lpData + lOffset);
				//如果当前点不是黑色点
				if(num != 0)
				{	
					//如果标志数组为0,则设置为黑色
					if(PixelNum[num] == 0)
					{
						*(lpData+lOffset++) =0;
						*(lpData+lOffset++) =0;
						*(lpData+lOffset++) =0;
					}
					//否则设置为白色
					else
					{
						*(lpData+lOffset++) =255;
						*(lpData+lOffset++) =255;
						*(lpData+lOffset++) =255;
					}
				}
			}
}
void CFaceDetectionDoc::RecursiveCal(LPBYTE lpData, int y, int x, WORD wBytesPerLine, int &pixelNum, int num)
{	
	long lOffset;
	
	lOffset = y*wBytesPerLine + x*3;
	//如果当前点为白色点
	if(*(lpData+lOffset) == 255)
	{	
		//把当前点大小设置成为序号值
		*(lpData+lOffset++) = num;
		*(lpData+lOffset++) = num;
		*(lpData+lOffset++) = num;
		//象素个数加一
		pixelNum++;
	
	int tempx;
	int tempy;
	
	//递归当前点上面的点
	tempy = y-1;
	tempx = x;
	RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);
	
	//下面的点
	tempy = y+1;
	tempx = x;
	RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -