霍夫直線檢測

2021-10-07 02:10:44 字數 2108 閱讀 7384

霍夫直線檢測的原理  略

直接上**:

一、首先匯入,並進行高斯濾波降噪

我用的是這幅圖:

二、獲取影象的輪廓

#獲取邊緣

edges = cv.canny(src,150,300,aperturesize=3)

cv.imshow("edges",edges)

獲取邊緣後如下:

接下來有兩種方法可以提取直線:

方法一:

lines = cv.houghlines(edges,1,np.pi/180,130,none,0,0)

if lines is not none:

for i in range(0,len(lines)):

rho = lines[i][0][0]

theta = lines[i][0][1]

a = math.cos(theta)

b = math.sin(theta)

x0 = a*rho

y0 = b*rho

pt1 = (int(x0 + 1000*(-b)),int(y0+a*1000))

pt2 = (int(x0 - 1000*(-b)),int(y0-a*1000))

cv.line(src,pt1,pt2,(0,0,255),2,8,0)

cv.imshow("hough-lines",src)

中間這部分的獲取極座標的值並轉化為平面直角座標的過程 略。本菜雞覺得只需要記住變化的**就好了,比如記住pt1和pt2的公式。

重點:cv.houghlines(edges,1,np.pi/180,130,none,0,0) 裡的引數分別是:

(輪廓圖,

步長[通常為1],

角度單位[通常為np.pi/180],

閾值[可以重點調整,相當於需要多少點擬合才算直線],

目標輸出,

0[如果不是多尺度,一般為0],

0[如果不是多尺度,一般為0])

於是得到下圖:

可以看到選出了部分直線,但效果有差距,可以通過調整閾值再做嘗試

方法二:

image = np.copy(src)

lines_p = cv.houghlinesp(edges,1,np.pi/180,130,none,50,10)

if lines_p is not none:

for i in range(0,len(lines_p)):

l = lines_p[i][0]

cv.line(image,(l[0],l[1]),(l[2],l[3]),(0,0,255),2,8,0)

cv.imshow("hough-linesp",image)

重點:cv.houghlinesp(edges,1,np.pi/180,130,none,50,10) 裡的引數含義

(輪廓圖,

步長[通常為1],

角度單位[通常為np.pi/180],

閾值[可以重點調整,相當於需要多少點擬合才算直線],

目標輸出,

擬合直線的點不能小於的閾值[可以重點調整],

間斷的點不能大於的閾值[可以重點調整])

獲得如下圖:

這個是比較理想的車道線擬合了。

霍夫直線檢測

使用python做霍夫直線檢測,直接詳細 注釋清晰 import cv2 import matplotlib.pyplot as plt import numpy as np if name main pic path c users echo desktop python file hough p...

霍夫變換檢測直線

對於結構化道路的檢測,常用的方法是採用霍夫變換檢測道路中的直線段。一條直線可以看做是影象上的若干個畫素點組成,也可以用一條直線方程來表示,如 y kx b,那麼霍夫變換檢測直線段其實是將影象畫素點空間變換到引數空間,對於直線來說就是引數 k,b 也可以用來檢測其他形狀如圓和橢圓,只是引數空間表示不一...

霍夫變換檢測直線

對於線性目標提取時,霍夫變換是個很好的手段,博主在這裡做了 實驗,在乙個影象中畫上圓和矩形,通過霍夫變換提取矩形的邊緣。編譯環境為matlab2014a,如下。霍夫變換,找到矩形影象的邊界,用彩色表示出來,矩形和圓不重疊 clc clear all close all i zeros 256,256...