霍夫直線檢測的原理 略
直接上**:
一、首先匯入,並進行高斯濾波降噪
我用的是這幅圖:
二、獲取影象的輪廓
#獲取邊緣
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...