怎樣用hough變換求出直線長度

2022-12-23 02:01:57 字數 3517 閱讀 8838

1樓:匿名使用者

bool hough(hwnd hwnd)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=;

hpen rhp;

//我們處理的實際上是256級灰度圖,不過只用到了0和255兩種顏色。

if( numcolors!=256)

//計算最大距離

dist=(int)(sqrt( (double)bi.biwidth*bi.biwidth+

(double)bi.biheight*bi.biheight)+0.5)

;alpha=180 /2 ; //0 到 to 178 度,步長為2度

//為距離角度陣列分配記憶體

if((hdistalpha=globalalloc(ghnd,(dword)dist* alpha * sizeof(int)))==null)

//為記錄直線端點的陣列分配記憶體

if((hmyline=globalalloc(ghnd,(dword)dist*alpha*sizeof(myline)))==null)

//原圖緩衝區的大小

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++)

for (y=0;y (*templine).topy)

if(y< (*templine).boty)}}

maxd=0;

for (i=0;i<(long)dist*alpha;i++)

}hdc = getdc(hwnd);

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;

}如果θ是給定的,用上述方法,我們可以找到該方向上最長的直線。

2樓:匿名使用者

ms是非常精確計算長度的一種演算法,估計是搞測繪的

你好,hough變換中怎樣求直線的斜率

3樓:護膚達人it宅族

影象中直線的檢測 -- hough變換原理

一、簡單介紹

hough變換是影象處理中從影象中識別幾何形狀的基本方法之一。hough變換的基本原理在於利用點與線的對偶性,將原始影象空間的給定的曲線通過曲線表達形式變為引數空間的一個點。這樣就把原始影象中給定曲線的檢測問題轉化為尋找引數空間中的峰值問題。

也即把檢測整體特性轉化為檢測區域性特性。比如直線、橢圓、圓、弧線等。

二、hough變換的基本思想

設已知一黑白影象上畫了一條直線,要求出這條直線所在的位置。我們知道,直線的方程可以用y=k*x+b 來表示,其中k和b是引數,分別是斜率和截距。過某一點(x0,y0)的所有直線的引數都會滿足方程y0=kx0+b。

即點(x0,y0)確定了一族直線。方程y0=kx0+b在引數k--b平面上是一條直線,(你也可以是方程b=-x0*k+y0對應的直線)。這樣,影象x--y平面上的一個前景畫素點就對應到引數平面上的一條直線。

我們舉個例子說明解決前面那個問題的原理。設影象上的直線是y=x, 我們先取上面的三個點:a(0,0), b(1,1), c(22)。

可以求出,過a點的直線的引數要滿足方程b=0, 過b點的直線的引數要滿足方程1=k+b, 過c點的直線的引數要滿足方程2=2k+b, 這三個方程就對應著引數平面上的三條直線,而這三條直線會相交於一點(k=1,b=0)。 同理,原影象上直線y=x上的其它點(如(3,3),(4,4)等) 對應引數平面上的直線也會通過點(k=1,b=0)。這個性質就為我們解決問題提供了方法,就是把影象平面上的點對應到引數平面上的線,最後通過統計特性來解決問題。

假如影象平面上有兩條直線,那麼最終在引數平面上就會看到兩個峰值點,依此類推。

簡而言之,hough變換思想為:在原始影象座標系下的一個點對應了引數座標系中的一條直線,同樣引數座標系的一條直線對應了原始座標系下的一個點,然後,原始座標系下呈現直線的所有點,它們的斜率和截距是相同的,所以它們在引數座標系下對應於同一個點。這樣在將原始座標系下的各個點投影到引數座標系下之後,看引數座標系下有沒有聚集點,這樣的聚集點就對應了原始座標系下的直線。

在實際應用中,y=k*x+b形式的直線方程沒有辦法表示x=c形式的直線(這時候,直線的斜率為無窮大)。所以實際應用中,是採用引數方程p=x*cos(theta)+y*sin(theta)。這樣,影象平面上的一個點就對應到引數p---theta平面上的一條曲線上,其它的還是一樣。

以下**實現了最簡單的hough變換直線檢測,輸入為width*height的二值圖(背景為0,前景為255),存放在矩陣src中,ithreshold為判斷為直線的域值。輸出pr為原點到直線的距離,pth為直線的角度

void hough(byte *src,int width,int height, int *pr, int *pth, int ithreshold)}}

src++;

} // x

} // y

for(ir = 0; ir < irmax; ir++)}}

if(imax >= ithreshold)

delete parray;

return;

} // end of hough

怎樣用press建站,怎樣用wordpress免費建站

wordpress建站從零基礎開始學起。wordpress可以慢慢的從域名解析,部署環境,安裝程式,使用主題,安裝外掛等開始操作。你可以去搜搜下如何用wp程式建站,學習相關知識。寫過好多這種內容,建站類的,伺服器類的,在你建站過程中都能用得到的。至於伺服器的話,多少花點錢,免費的往往是最貴的。一般回...

怎樣用分解質因數來求出兩個數的最小公倍數

例如bai 用分解質因數的辦法求du60和42的最小公倍zhi數。1 分解質因dao數 60 2 專2 3 5 42 2 3 7 選取其中一個數 屬60,再選42中不同的因數7.連乘所選數和因數積為兩數最小公倍數 60和42的最小公倍數 60 7 420 怎樣求兩個數的最小公倍數 方法一 列舉法。先...

怎樣用設計稿紙,怎樣用word設計稿紙?

如何用word製作稿紙?怎樣用excel做稿紙 word就有稿紙,excel做稿紙列印也會不好排的 將excel列印出來即可!excel沒有這個功能吧,要不用txt?word有稿紙吧?用word怎樣設計發文稿紙首頁 怎麼用word製作文稿紙 如何用word製作稿紙?怎樣用word製作信紙 如何用wo...