📄 facedetectiondoc.cpp
字号:
}
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 + -