我在用圆模板检测算子检测虹膜外边缘时,程序一运行就死掉,并且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;
}