vc调试时出现“stack overflow"与”Access Violation"异常
int CMainFrame::ErasionFalseArea()
{
int PixelNum[255];//记录连续区域的白色像素点个数
int i,j;
long Offset;
unsigned char * lpb;
lpb=m_ycc_buffer;
LPBITMAPINFOHEADER lpbi;
lpbi=&m_bitmapheader;
//lpbi_ycc是指向"存放'以YCrCb色彩空间表达的数据信息'的信息头信息"的指针;
DWORD wBytesPerLine=BytePerLine(lpbi);//得到每行像素所占用的字节数;
for(i=0;i<255;i++)
{ PixelNum[i]=0; }
int calNum=0;//连续区域的个数;
for(i=0;i<(lpbi->biHeight);i++)
for(j=0;j<(lpbi->biWidth);j++)
{
Offset=PixelOffset(i,j,wBytesPerLine);
if((*(lpb+Offset)==255)&&(*(lpb+Offset+1)==255)&&(*(lpb+Offset+2)==255))//如果当前点的像素颜色是白色,则递归统计该区域内连续白色像素点的个数;
{
calNum++;
RecursiveCal(lpb,i,j,wBytesPerLine,&(PixelNum[calNum]),calNum);
//采集到的人脸面积过大,
//程序在递归的过程中会造成系统stack溢出,
//应如何解决???
}
}}
void CMainFrame::RecursiveCal(unsigned char * lpData,int y,int x,DWORD wBytesPerLine,int * pixelNum,int num)
{ LPBITMAPINFOHEADER lpbi;
lpbi=&m_bitmapheader;
long Offset=PixelOffset(y,x,wBytesPerLine);
//如果当前点为白色点;
if((*(lpData+Offset)==255)&&(*(lpData+Offset+1)==255)&&(*(lpData+Offset+2)==255))
{
//把当前点大小设置为序号值;
*(lpData+Offset++)=num;
*(lpData+Offset++)=num;
*(lpData+Offset++)=num;
//像素个数加1
(*pixelNum)++;
int tempx;
int tempy;
//递归当前点下面的点;
tempy=y-1;
tempx=x;
if((y-1)>=0)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);
//递归当前点上面的点;
tempy=y+1;
tempx=x;
if((y+1)<=lpbi->biHeight)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);
//递归当前点左边的点;
tempy=y;
tempx=x-1;
if((x-1)>=0)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);
//递归当前点右边的点;
tempy=y;
tempx=x+1;
if((x+1)<=lpbi->biWidth)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);
}
}