我在用圆模板检测算子检测虹膜外边缘时,程序一运行就死掉,并且CPU占用100%。
算法不复杂,描述如下:已知圆心的位置(x0,y0),半径在R1到R2的范围内,求出每个圆周上像素灰度的平均值,然后比较相邻的平均灰度值,变化率最大的为所要求虹膜外圆的半径。
程序模块如下:
float load_bmp_file::circletest(HWND hWnd,point Eye_Center,float R) //圆心,初始半径R
{ extern snake Global_Snake;
DWORD OffBits,BufSize,LineBytes;//大小为BITMAPINFOHEADER+Palette的大小;BITMAPINFOHEADER+Palette+实际图像的大小;一行的字节数
LPBITMAPINFOHEADER lpImgData;//指向BITMAPINFOHEADER结构的指针
LPSTR lpPtr;//指向图像数据,等同于lpImgData,就是类型不一样
int x,y;//行数和列数变量
int x1,y1;
float r1;//图象上每一个点到内圆圆心的距离
int r11;
HGLOBAL ha,hb,hc;//用于统计各半径r上的总的点的个数;用于统计各半径r上的总的灰度
int *lpa;
int *lpb;
float *lpc;//;外圆半径
BYTE curColor;//
int i,j;
float maxr;
int dist=(Global_Snake.Img_Height)/2;//外圆半径的搜索范围(最大值)
if((ha=GlobalAlloc(GHND,(DWORD)(dist)*sizeof(int)))==NULL)
{
MessageBox(hWnd,"Error alloc memorya!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if((hb=GlobalAlloc(GHND,(DWORD)(dist)*sizeof(int)))==NULL)
{
MessageBox(hWnd,"Error alloc memoryb!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if((hc=GlobalAlloc(GHND,(DWORD)(dist)*sizeof(float)))==NULL)
{
MessageBox(hWnd,"Error alloc memoryc!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
lpa=(int *)GlobalLock(ha);
lpb=(int *)GlobalLock(hb);
lpc=(float *)GlobalLock(hc);
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);//大小为BITMAPINFOHEADER+Palette的大小
//也就是BITMAPINFOHEADER到位图数据的偏移量
LineBytes =(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);//一行占几个字节
BufSize=OffBits+bi.biHeight*LineBytes;//BITMAPINFOHEADER+Palette+实际图像的大小
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);//锁定全局内存区域,并返回指向它首地址的指针
lpPtr=(char *)lpImgData;//
for(y=1;y<bi.biHeight-1;y++) //注意y的范围是从1到bi.biHeight-2
for(x=1;x<bi.biWidth-1;x++)
{//注意x的范围是从1到bi.biWidth-2
x1= x+(float)(Global_Snake.Window_Width/2-Global_Snake.Img_Width/2);//相对坐标转为绝对坐标
y1= y+(float)(Global_Snake.Window_Height/2-Global_Snake.Img_Height/2);
r1=sqrt((x1-Eye_Center.x)*(x1-Eye_Center.x)+(y1-Eye_Center.y)*(y1-Eye_Center.y));
if(r1>R)
{
r11=int(r1);
*(lpa+r11)=(*(lpa+r11)+1);//数组中存储半径r1的元素加1
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
curColor = *lpPtr;//表示一个像素的一个BYTE数据
*(lpb+r11)=(*(lpb+r11)+curColor);//累加灰度值
}
}
for(i=int(R)+1;i<=dist;i++)
{
*(lpc+i)=(*(lpb+i))/(*(lpa+i));//灰度平均值
}
for(j=int(R)+1;j<=dist;i++)
{
float temp,max=0;
temp=(*(lpc+j+1))-(*(lpc+j));
if(temp>max)
{
max=temp;
maxr=j;
}
}
GlobalUnlock(hImgData);
GlobalUnlock(ha);
GlobalUnlock(hb);
GlobalUnlock(hc);
return maxr;
}
算法不复杂,描述如下:已知圆心的位置(x0,y0),半径在R1到R2的范围内,求出每个圆周上像素灰度的平均值,然后比较相邻的平均灰度值,变化率最大的为所要求虹膜外圆的半径。
程序模块如下:
float load_bmp_file::circletest(HWND hWnd,point Eye_Center,float R) //圆心,初始半径R
{ extern snake Global_Snake;
DWORD OffBits,BufSize,LineBytes;//大小为BITMAPINFOHEADER+Palette的大小;BITMAPINFOHEADER+Palette+实际图像的大小;一行的字节数
LPBITMAPINFOHEADER lpImgData;//指向BITMAPINFOHEADER结构的指针
LPSTR lpPtr;//指向图像数据,等同于lpImgData,就是类型不一样
int x,y;//行数和列数变量
int x1,y1;
float r1;//图象上每一个点到内圆圆心的距离
int r11;
HGLOBAL ha,hb,hc;//用于统计各半径r上的总的点的个数;用于统计各半径r上的总的灰度
int *lpa;
int *lpb;
float *lpc;//;外圆半径
BYTE curColor;//
int i,j;
float maxr;
int dist=(Global_Snake.Img_Height)/2;//外圆半径的搜索范围(最大值)
if((ha=GlobalAlloc(GHND,(DWORD)(dist)*sizeof(int)))==NULL)
{
MessageBox(hWnd,"Error alloc memorya!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if((hb=GlobalAlloc(GHND,(DWORD)(dist)*sizeof(int)))==NULL)
{
MessageBox(hWnd,"Error alloc memoryb!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if((hc=GlobalAlloc(GHND,(DWORD)(dist)*sizeof(float)))==NULL)
{
MessageBox(hWnd,"Error alloc memoryc!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
lpa=(int *)GlobalLock(ha);
lpb=(int *)GlobalLock(hb);
lpc=(float *)GlobalLock(hc);
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);//大小为BITMAPINFOHEADER+Palette的大小
//也就是BITMAPINFOHEADER到位图数据的偏移量
LineBytes =(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);//一行占几个字节
BufSize=OffBits+bi.biHeight*LineBytes;//BITMAPINFOHEADER+Palette+实际图像的大小
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);//锁定全局内存区域,并返回指向它首地址的指针
lpPtr=(char *)lpImgData;//
for(y=1;y<bi.biHeight-1;y++) //注意y的范围是从1到bi.biHeight-2
for(x=1;x<bi.biWidth-1;x++)
{//注意x的范围是从1到bi.biWidth-2
x1= x+(float)(Global_Snake.Window_Width/2-Global_Snake.Img_Width/2);//相对坐标转为绝对坐标
y1= y+(float)(Global_Snake.Window_Height/2-Global_Snake.Img_Height/2);
r1=sqrt((x1-Eye_Center.x)*(x1-Eye_Center.x)+(y1-Eye_Center.y)*(y1-Eye_Center.y));
if(r1>R)
{
r11=int(r1);
*(lpa+r11)=(*(lpa+r11)+1);//数组中存储半径r1的元素加1
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x;
curColor = *lpPtr;//表示一个像素的一个BYTE数据
*(lpb+r11)=(*(lpb+r11)+curColor);//累加灰度值
}
}
for(i=int(R)+1;i<=dist;i++)
{
*(lpc+i)=(*(lpb+i))/(*(lpa+i));//灰度平均值
}
for(j=int(R)+1;j<=dist;i++)
{
float temp,max=0;
temp=(*(lpc+j+1))-(*(lpc+j));
if(temp>max)
{
max=temp;
maxr=j;
}
}
GlobalUnlock(hImgData);
GlobalUnlock(ha);
GlobalUnlock(hb);
GlobalUnlock(hc);
return maxr;
}
{
float temp,max=0;
temp=(*(lpc+j+1))-(*(lpc+j));
if(temp>max)
{
max=temp;
maxr=j;
}
}