日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

OpenCV中霍夫直线变换

發(fā)布時(shí)間:2025/3/15 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV中霍夫直线变换 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OpenCV中霍夫直線變換

首先要知道,一條直線的通用表達(dá)式為y=ax+b\color{#F00}y=ax+by=ax+b,a為直線的斜率,b為直線的截距,知道這兩個(gè)參數(shù)可以唯一確定一條直線。通常我們往常我們求三個(gè)點(diǎn),是否在一條直線上,我們讓其兩兩組合分別求斜率和截距,如果一樣,我們則說(shuō)三個(gè)點(diǎn)在同一條直線。但是現(xiàn)在在我們的圖像中無(wú)法使用這樣的方法。
y=kx+b\color{#f00}y=kx+by=kx+b在x-y坐標(biāo)系中變換為b=?xk+y\color{#f00}b=-xk+yb=?xk+y,則在k-b坐標(biāo)系中交于一點(diǎn),則有相同的k和b,所以在x-y坐標(biāo)系中處于同一條直線上。同樣的道理在霍夫變換采用將直線變?yōu)闃O坐標(biāo),因?yàn)橹本€坐標(biāo)的話可能會(huì)存在直線不存在的情況。
x=ρcosθandy=ρsinθ\color{#f00}x=\rho cos\theta \quad and \quad y=\rho sin\theta x=ρcosθandy=ρsinθ
y=(?cosθsinθ)x+(rsinθ)\color{#f00}y=(-\frac{cos\theta}{sin\theta})x+(\frac{r}{sin\theta})y=(?sinθcosθ?)x+(sinθr?)
最終我們將原式轉(zhuǎn)化為r=xcosθ+ysinθ\color{#f00}r=xcos\theta+ysin\thetar=xcosθ+ysinθ這樣的形式。
下面就說(shuō)說(shuō)這樣的形式有什么用?
根據(jù)上式:
r0=x0cosθ+y0sinθr_0= x_0cos\theta + y_0sin\thetar0?=x0?cosθ+y0?sinθ
............
ri=xicosθ+yisinθr_i = x_icos\theta + y_isin\thetari?=xi?cosθ+yi?sinθ
選中(x0,y0)(x_0,y_0)(x0?,y0?)在該點(diǎn)計(jì)算θ從1?180的直線到(0,0)的距離,從而繪制出θ?r的圖像\theta{從1-180的直線到(0,0)的距離,從而繪制出}\theta-r的圖像θ1?180(00)θ?r如下圖:
同樣的,我們?cè)龠x取(xi,yi)(x_i,y_i)(xi?,yi?)點(diǎn)執(zhí)行相同的操作,又可以得到一條曲線。這樣我們我們選取i個(gè)點(diǎn)就得到了i條曲線,如下圖:

當(dāng)多條直線有交點(diǎn)時(shí),就證明(xn,yn)和(xm,ym)(x_n,y_n){和}(x_m,y_m)(xn?,yn?)(xm?,ym?)在相同的θ\thetaθ時(shí)擁有相同的r,在上述的式子中可以知道,當(dāng)這兩個(gè)值相同時(shí),這兩個(gè)點(diǎn)在同一條直線上。那么當(dāng)有若干條曲線交于一點(diǎn),那么這若干個(gè)點(diǎn)都在一條直線上。

上述敘述了在數(shù)學(xué)鄰域的計(jì)算推導(dǎo),那么如何應(yīng)用與圖像中呢?
我們知道一幅圖像可以看成一個(gè)大的矩陣,而霍夫直線檢測(cè)一般應(yīng)用于邊緣檢測(cè)之后,所以一般都是灰度圖。從而我們可以將圖像看成下面這個(gè)樣子。
[x00…x0i………xi0…xii]\begin{bmatrix}x_{00}&\ldots&x_{0i}\\ \ldots&\ldots&\ldots \\ x_{i0}&\ldots&x_{ii}\end{bmatrix}???x00?xi0???x0i?xii?????

具體的如何利用圖像像素來(lái)進(jìn)行上述原理的實(shí)現(xiàn),不是很清楚,我搜了一下,也沒(méi)有注意到。但是我有一種猜測(cè),因?yàn)橐M(jìn)行霍夫變換的都是邊緣檢測(cè)后的二值圖像,所以在進(jìn)行霍夫變換時(shí),只對(duì)邊緣信息的像素的進(jìn)行上述的處理。具體內(nèi)部實(shí)現(xiàn),未知。

HoughLinesP(輸入圖像,8位,單通道輸出包含四個(gè)元素的vector,(x1,y1,x2,y2)兩個(gè)直線端點(diǎn)像素最小單位,角度最小單位,極坐標(biāo)中交點(diǎn)個(gè)數(shù),最小長(zhǎng)度,兩個(gè)點(diǎn)之間最大的間距,如果小于,則連接視為同一條直線。 ); #include "opencv2/opencv.hpp" #include <vector>using namespace std; using namespace cv;int main(int argc, char *argv[]) {Mat src,dst;src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/white_black.png",0);Canny(src,dst,50,200,3);cvtColor(dst,src,CV_GRAY2BGR);vector<Vec4i> lines;HoughLinesP(dst,lines,1,CV_PI/180,30,3,5);for (size_t i = 0;i < lines.size();i++){Vec4i l = lines[i];line(src,Point(l[0],l[1]),Point(l[2],l[3]),Scalar(0,0,255),3,CV_AA);}imshow("src",src);waitKey(0);return 0; }

總結(jié)

以上是生活随笔為你收集整理的OpenCV中霍夫直线变换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。