利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解
為了更好地看懂本文,大家可以先看下我寫的另一篇博文,鏈接如下:
https://blog.csdn.net/wenhao_ir/article/details/51774444
OpenCV的霍夫變換線檢測函數(shù)HoughLines()是利用極坐標(biāo)下的參數(shù)ρ和θ值來表示直線的,我們在實(shí)際應(yīng)用中往往要根據(jù)直線的參數(shù)ρ和θ值來繪制出直線,那么怎么繪制呢?
在OpenCV中繪制直線的函數(shù)為函數(shù)line(),它的原型如下:
從這個原型中,我們可以看出,如果要使用這個函數(shù)繪制線條,那么需要知道線條的兩個端點(diǎn),即參數(shù)中的pt1和pt2,所以問題就轉(zhuǎn)化為根據(jù)參數(shù)ρ和θ值計(jì)算要繪制直線的兩個端點(diǎn)。
在進(jìn)行計(jì)算前,我們先要搞清楚利用函數(shù)HoughLines()得到的θ到底是哪個角的度數(shù)。
當(dāng)直線為水平或垂直時θ的值分別為π/2(即90度)和0(即0度),這個在官方文檔中已經(jīng)說得很清楚了。如下面的截圖所示:
至于其它的情況,我們用兩幅圖來試驗(yàn)證一下就知道了。
情況一的圖片如下:
情況二的圖片如下:
檢測圖中兩條直線的代碼如下:
兩幅圖的檢測結(jié)果如下:
這里說明一下為什么檢測到多條直線,這是因?yàn)槲覀兊闹本€是有寬度的,所以檢測到了多條。
從這個運(yùn)行結(jié)果我們可以看出兩種情況下哪個角是θ。如下面兩幅圖所示:
情況二:
知道了哪個角是θ,我們再把其它已知量和待求點(diǎn)及一些輔助線標(biāo)注在圖上,如下面兩幅圖所示:
圖中的r就是
由以上幾何關(guān)系并結(jié)合三角函數(shù)的和差公式:
不難得到在兩種情況下都有pt1的坐標(biāo)為:
p t 1. x = x 0 ? L s i n ( θ ) = x 0 + ( ? L s i n ( θ ) ) pt1.x = x0-Lsin(θ)=x0+(-Lsin(θ)) pt1.x=x0?Lsin(θ)=x0+(?Lsin(θ))
p t 1. y = y 0 + L c o s ( θ ) pt1.y = y0+Lcos(θ) pt1.y=y0+Lcos(θ)
兩種情況下都有pt2的坐標(biāo)為:
p t 2. x = x 0 + L s i n ( θ ) = x 0 ? ( ? L s i n ( θ ) ) pt2.x = x0+Lsin(θ)=x0-(-Lsin(θ)) pt2.x=x0+Lsin(θ)=x0?(?Lsin(θ))
p t 2. y = y 0 ? L c o s ( θ ) pt2.y = y0-Lcos(θ) pt2.y=y0?Lcos(θ)
其中
x 0 = ρ c o s ( θ ) x0=ρcos(θ) x0=ρcos(θ)
y 0 = ρ s i n ( θ ) y0=ρsin(θ) y0=ρsin(θ)
有了以上計(jì)算公式后,我們便可以根據(jù)得到的ρ和θ值計(jì)算出pt1和pt2的坐標(biāo),進(jìn)而繪制出直線。
相關(guān)代碼如下:
很明顯,上面的代碼中,L值是需要我們根據(jù)圖像的大小和直線的大小來確定,并不是每一幅圖像或每一條直線都取1000。L是什么的長度,博主在上面的手繪圖中應(yīng)該是已經(jīng)標(biāo)注得很清楚了。
最后,對這篇博文有不明白的可以加博主的微信/QQ 2487872782交流。
總結(jié)
以上是生活随笔為你收集整理的利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业申请外观专利的优势
- 下一篇: Cannot find class in