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;
}