Hough变换
BOOL Hough(HWND hWnd)
{
//定义直线结构
typedef struct{
int topx;
int topy;
int botx;
int boty;
}MYLINE;
//内存
DWORD BufSize;
//文件信息头指针
LPBITMAPINFOHEADER lpImgData;
//数据区指针
LPSTR lpPtr;
HDC hDc;
LONG x,y;
long i,maxd;
int k;
int Dist,Alpha;
//定义了一个全局句柄
HGLOBAL hDistAlpha,hMyLine;
int *lpDistAlpha;
MYLINE *lpMyLine,*TempLine,MaxdLine;
//定义一个逻辑画笔
static LOGPEN rlp={PS_SOLID,1,1,RGB(255,0,0)};
//画笔
HPEN rhp;
//判断是否为256色位图
if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//计算对角线长度
Dist=(int)(sqrt( (double)bi.biWidth*bi.biWidth+(double)bi.biHeight*bi.biHeight)+0.5);
Alpha=180 /2 ;
//分配内存用来处理数据
if((hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist* Alpha * sizeof(int)))==NULL){
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//分配内存来存放直线数据
if((hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha*sizeof(MYLINE)))==NULL){
GlobalFree(hDistAlpha);
return FALSE;
}
//得到文件头到数据区的偏移
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
//锁定内存
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpDistAlpha=(int *)GlobalLock(hDistAlpha);
lpMyLine=(MYLINE *)GlobalLock(hMyLine);
//初始化直线数组
for (i=0;i<(long)Dist*Alpha;i++){
TempLine=(MYLINE*)(lpMyLine+i);
(*TempLine).boty=32767;
}
//扫描整个源图像
for (y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for (x=0;x<bi.biWidth;x++)
//黑色点
if(*(lpPtr++)==0)
for (k=0;k<180;k+=2){
//在各个方向上加上这个点出现的概率(次数)
i=(long)fabs((x*cos(k*PI/180.0)+y*sin(k*PI/180.0)));
*(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1;
TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2);
//修改直线结构调整y值
//当前的y值大于结构中已有的值
if(y> (*TempLine).topy){
(*TempLine).topx=x;
(*TempLine).topy=y;
}
//小于
if(y< (*TempLine).boty){
(*TempLine).botx=x;
(*TempLine).boty=y;
}
}
}
maxd=0;
//寻找概率最大的那条直线
for (i=0;i<(long)Dist*Alpha;i++){
TempLine=(MYLINE*)(lpMyLine+i);
k=*(lpDistAlpha+i);
if( k > maxd){
maxd=k;
//更新概率最大直线的两个端点位置座标
MaxdLine.topx=(*TempLine).topx;
MaxdLine.topy=(*TempLine).topy;
MaxdLine.botx=(*TempLine).botx;
MaxdLine.boty=(*TempLine).boty;
}
}
//得到DC
hDc = GetDC(hWnd);
rhp = CreatePenIndirect(&rlp);
SelectObject(hDc,rhp);
//移动到起始点
MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL);
//画直线
LineTo(hDc,MaxdLine.topx,MaxdLine.topy);
DeleteObject(rhp);
//释放资源
ReleaseDC(hWnd,hDc);
GlobalUnlock(hImgData);
GlobalUnlock(hDistAlpha);
GlobalFree(hDistAlpha);
GlobalUnlock(hMyLine);
GlobalFree(hMyLine);
return TRUE;
}