無人駕駛 OpenCV (F) 識別車道線

接下來進(jìn)入代碼環(huán)節(jié)充包,這里詳細(xì)給大家解釋一下 HoughLinesP 參數(shù)的含義以及如何使用翔试。

lines = cv2.HoughLinesP(cropped_image,2,np.pi/180,100,np.array([]),minLineLength=40,maxLineGap=5)

第一參數(shù)是我們要檢查的圖片
Hough accumulator 數(shù)組
第二個和第三個參數(shù)用于定義我們 Hough 坐標(biāo)如何劃分 bin蜘澜,也就是小格的精度瓣距。我們通過曲線穿過 bin 格子來進(jìn)行投票箕戳,我們根據(jù)投票數(shù)量來決定 p 和 theta 的值某残。2 表示我們小格寬度以像素為單位 。


我們可以通過下圖劃分小格陵吸,只要曲線穿過就會對小格進(jìn)行投票玻墅,我們記錄投票數(shù)量,記錄最多的作為參數(shù)

如果定義尺寸過大也就失去精度壮虫,如果定義格子尺寸過小雖然精度上來了澳厢,這樣也會打來增長計算時間。

接下來參數(shù) 100 表示我們投票為 100 以上的線才是符合要求是我們要找的線旨指。也就是在 bin 小格子需要有 100 以上線相交于此才是我們要找的參數(shù)赏酥。

minLineLength 給 40 表示我們檢查線長度不能小于 40 pixel
maxLineGap=5 作為線間斷不能大于 5 pixel

定義顯示車道線方法

def disply_lines(image,lines):
    pass

通過定義函數(shù)將找到的車道線顯示出來。

line_image = disply_lines(lane_image,lines)

查看探測車道線數(shù)據(jù)結(jié)構(gòu)

def disply_lines(image,lines):
    line_image = np.zeros_like(image)
    if lines is not None:
        for line in lines:
            print(line)

先定義一個尺寸大小和原圖一樣的矩陣用于繪制查找到車道線谆构,我們先判斷一下是否已經(jīng)找到車道線裸扶,lines 返回值應(yīng)該不為 None 是一個矩陣,我們可以簡單地打印一下看一下效果

[[704 418 927 641]]
[[704 426 791 516]]
[[320 703 445 494]]
[[585 301 663 381]]
[[630 341 670 383]]

探測車道線

看數(shù)據(jù)結(jié)構(gòu)[[x1,y1,x2,y2]] 的二維數(shù)組搬素,這就需要我們轉(zhuǎn)換一下為一維數(shù)據(jù)[x1,y1,x2,y2]

def disply_lines(image,lines):
    line_image = np.zeros_like(image)
    if lines is not None:
        for line in lines:
            x1,y1,x2,y2 = line.reshape(4)
            cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),10)
    return line_image
line_image = disply_lines(lane_image,lines)
cv2.imshow('result',line_image)
探測線

合成影響

combo_image = cv2.addWeighted(lane_image,0.8, line_image, 1, 1,1)

有關(guān)合成圖片我們是將兩張圖片通過給一定權(quán)重進(jìn)行疊加合成呵晨。


優(yōu)化

我們通過學(xué)習(xí)霍夫變換探測到的車道線還是不夠平滑魏保,我們需要優(yōu)化,基本思路就是對這些直線的斜率和截距取平均值然后將所有探測出點(diǎn)繪制到一條直線上摸屠。

averaged_lines = average_slope_intercept(lane_image,lines);

首先定義我們的函數(shù)谓罗,接收道路圖片和探測點(diǎn)做為參數(shù)。

def average_slope_intercept(image,lines):
    left_fit = []
    right_fit = []
    for line in lines:
        x1, y1, x2, y2 = line.reshape(4)
        parameters = np.polyfit((x1,x2),(y1,y2),1)
        print(parameters)

這里定義兩個數(shù)組 left_fit 和 right_fit 分別用于存放左右兩側(cè)車道線的點(diǎn)季二,我們打印一下 lines 的斜率和截距檩咱,通過 numpy 提供 polyfit 方法輸入兩個點(diǎn)我們就可以得到通過這些點(diǎn)的直線的斜率和截距。

[   1. -286.]
[   1.03448276 -302.27586207]
[  -1.672 1238.04 ]
[   1.02564103 -299.
def average_slope_intercept(image,lines):
    left_fit = []
    right_fit = []
    for line in lines:
        x1, y1, x2, y2 = line.reshape(4)
        parameters = np.polyfit((x1,x2),(y1,y2),1)
        # print(parameters)
        slope = parameters[0]
        intercept = parameters[1]
        if slope < 0:
            left_fit.append((slope,intercept))
        else:
            right_fit.append((slope,intercept))
        print(left_fit)
        print(right_fit)

由于左側(cè)和右側(cè)線的斜率不同胯舷,我們根據(jù)斜率可以劃分點(diǎn)到左右兩側(cè)的直線矩陣上刻蚯。

    left_fit_average = np.average(left_fit,axis=0)
    right_fit_average = np.average(right_fit,axis=0)

然后通過取平局值來得到他們平均斜率和截距。

[  -1.61019355 1201.00387097]
[   1.0243751  -298.80648538]
def make_coordinates(image, line_parameters):
    slope, intercept = line_parameters
    print(image.shape)
    return 

我們輸出一下圖片大小桑嘶,我們圖片是以其左上角作為原點(diǎn) 0 炊汹,0 來開始計算的,所以我們直線從圖片底部 700 多向上繪制我們無需繪制全部可以截距一部分即可逃顶。
![圖(https://upload-images.jianshu.io/upload_images/8207483-367e149bfb5a5165.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

(704, 1279, 3)
(704, 1279, 3)
    left_line = make_coordinates(image, left_fit_average)
    right_line = make_coordinates(image, right_fit_average)
def make_coordinates(image, line_parameters):
    slope, intercept = line_parameters
    y1 = image.shape[0]
    y2 = int(y1*(3/5)) 
    x1 = int((y1 - intercept)/slope)
    x2 = int((y2 - intercept)/slope)
    # print(image.shape)
    return np.array([x1,y1,x2,y2])

所以直線開始和終止我們給定 y1,y2 然后通過方程的斜率和截距根據(jù)y 算出 x讨便。

averaged_lines = average_slope_intercept(lane_image,lines);
line_image = disply_lines(lane_image,averaged_lines)
combo_image = cv2.addWeighted(lane_image,0.8, line_image, 1, 1,1)

cv2.imshow('result',combo_image)
result_optimize.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市以政,隨后出現(xiàn)的幾起案子霸褒,更是在濱河造成了極大的恐慌,老刑警劉巖妙蔗,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傲霸,死亡現(xiàn)場離奇詭異,居然都是意外死亡眉反,警方通過查閱死者的電腦和手機(jī)昙啄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寸五,“玉大人梳凛,你說我怎么就攤上這事∈嵝樱” “怎么了韧拒?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長十性。 經(jīng)常有香客問我叛溢,道長,這世上最難降的妖魔是什么劲适? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任楷掉,我火速辦了婚禮,結(jié)果婚禮上霞势,老公的妹妹穿的比我還像新娘烹植。我一直安慰自己斑鸦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布草雕。 她就那樣靜靜地躺著巷屿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墩虹。 梳的紋絲不亂的頭發(fā)上嘱巾,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音败晴,去河邊找鬼浓冒。 笑死栽渴,一個胖子當(dāng)著我的面吹牛尖坤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闲擦,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慢味,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了墅冷?” 一聲冷哼從身側(cè)響起纯路,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寞忿,沒想到半個月后驰唬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腔彰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年叫编,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹抛。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡搓逾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杯拐,到底是詐尸還是另有隱情霞篡,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布端逼,位于F島的核電站朗兵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顶滩。R本人自食惡果不足惜余掖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诲祸。 院中可真熱鬧浊吏,春花似錦而昨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墩衙,卻和暖如春务嫡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漆改。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工心铃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挫剑。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓去扣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親樊破。 傳聞我的和親對象是個殘疾皇子愉棱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容