1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        使用霍夫變換檢測(cè)車道線

        共 9728字,需瀏覽 20分鐘

         ·

        2021-09-14 15:22

        點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)


        車道線檢測(cè)是自動(dòng)駕駛汽車的重要組成部分之一,有很多方法可以做到這一點(diǎn)。本文,我們將使用最簡(jiǎn)單的霍夫變換方法。

        本文分為三個(gè)部分:
        • 第一部分:高斯模糊+ Canny邊緣檢測(cè)

        • 第二部分:霍夫變換

        • 第三部分:優(yōu)化+顯示線條


        1部分和第3部分的重點(diǎn)是編碼,第2部分更面向理論。接下來,讓我們開始第一部分。

        第一部分:高斯模糊+Canny邊緣檢測(cè)


        導(dǎo)入必需的庫:
        import numpy as np import cv2 import matplotlib.pyplot as plt
        • 1:Numpy用于執(zhí)行數(shù)學(xué)計(jì)算,我們要用它來創(chuàng)建和操作數(shù)組。

        • 3:使用Matplotlib可視化圖像。


        接下來,讓我們從集合中加載一張圖片來測(cè)試算法
        image_path = r"D:\users\new owner\Desktop\TKS\Article Lane Detection\udacity\solidWhiteCurve.jpg" image1 = cv2.imread(image_path) plt.imshow(image1)

        在這里,我們?cè)诘?/span>4行將圖像加載到筆記本中,然后我們將在第5行和第6行讀取圖像并將其可視化。現(xiàn)在是處理圖像的時(shí)候了,主要分為以下三步:
        def grey(image):     return cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)def gauss(image):     return cv2.GaussianBlur(image, (5, 5), 0)def canny(image):     edges = cv2.Canny(image,50,150) return edges 
        在最后一個(gè)代碼塊中,我們定義了3個(gè)函數(shù):
        Greyscale the image:這有助于增加顏色的對(duì)比度,使它更容易識(shí)別像素強(qiáng)度的變化。

        Gaussian Filter:高斯濾波器的目的是減少圖像中的噪聲。我們這樣做是因?yàn)?/span>Canny中的梯度對(duì)噪聲非常敏感,所以我們想盡可能地消除噪聲。cv2.高斯模糊函數(shù)有三個(gè)參數(shù):
        • img參數(shù)定義了我們要進(jìn)行歸一化(減少噪聲)的圖像。這個(gè)函數(shù)使用一個(gè)稱為高斯核的核函數(shù),用于對(duì)圖像進(jìn)行歸一化。

        • sigma參數(shù)定義沿x軸的標(biāo)準(zhǔn)偏差。標(biāo)準(zhǔn)偏差衡量圖像中像素的分布,我們希望像素?cái)U(kuò)散是一致的,因此標(biāo)準(zhǔn)偏差為0


        Canny:這是我們檢測(cè)圖像邊緣的地方,它所做的是計(jì)算像素強(qiáng)度的變化(亮度的變化)在一個(gè)圖像的特定部分。幸運(yùn)的是,OpenCV使它變得非常簡(jiǎn)單。
        cv2.Canny函數(shù)有3個(gè)參數(shù),(img, threshold-1, threshold-2)。
        • img參數(shù)定義了我們要檢測(cè)邊緣的圖像。

        • threshold-1參數(shù)過濾所有低于這個(gè)數(shù)字的梯度(它們不被認(rèn)為是邊緣)。

        • threshold-2參數(shù)決定了邊緣的有效值。

        • 如果兩個(gè)閾值之間的任何梯度連接到另一個(gè)高于閾值2的梯度,則將考慮該梯度。

         

        現(xiàn)在我們已經(jīng)定義了圖像中的所有邊緣,我們需要分割與車道線相對(duì)應(yīng)的邊緣,操作步驟如下:
        def region(image):     height, width = image.shape     triangle = np.array([                        [(100, height), (475, 325), (width, height)]                        ])     mask = np.zeros_like(image)     mask = cv2.fillPoly(mask, triangle, 255)     mask = cv2.bitwise_and(image, mask) return mask
        這個(gè)函數(shù)將分割圖像中車道線所在的某個(gè)硬編碼區(qū)域,它以Canny圖像為參數(shù),輸出孤立區(qū)域。

        在第1行中,我們將使用numpy.shape函數(shù)提取圖像的維數(shù)。
        在第2-4行中,我們要定義一個(gè)三角形的尺寸,也就是我們要隔離的區(qū)域。
        在第5和第6中,我們要?jiǎng)?chuàng)建一個(gè)黑色的平面,然后我們要定義一個(gè)白色的三角形,它的尺寸和第2行中定義的一樣。
        在第7行中,我們將執(zhí)行位運(yùn)算和運(yùn)算,使我們能夠隔離與車道線對(duì)應(yīng)的邊緣。

        更深入的解釋位運(yùn)算
        在我們的圖像中,有兩種像素強(qiáng)度:黑色和白色。黑色像素的值為0,白色像素的值為255。在8位二進(jìn)制中,0轉(zhuǎn)換為00000000,255轉(zhuǎn)換為11111111。對(duì)于位運(yùn)算和運(yùn)算,我們將使用像素的二進(jìn)制值?,F(xiàn)在,我們將在img1img2相同的位置上乘以兩個(gè)像素(我們將img1定義為帶有邊緣檢測(cè)的平面,img2定義為我們創(chuàng)建的掩碼)。

        :Img1,右圖:Img2。(實(shí)際上,它是白色的,但我們把它改成了黃色)

        例如,img1(0,0)處的像素將與img2(0,0)處的像素相乘(同樣地,圖像上其他位置的每一個(gè)像素也是如此)。

        如果img1中的(0,0)像素是白色的(意味著它是一條邊),img2中的(0,0)像素是黑色的(意味著這個(gè)點(diǎn)不是我們的車道線所在的孤立區(qū)域的一部分),操作看起來像11111111* 0000000,等于0000000(一個(gè)黑色像素)。

        我們將對(duì)圖像上的每個(gè)像素重復(fù)這個(gè)操作,導(dǎo)致只輸出掩碼中的邊緣。

        其他一切都被忽略了,僅輸出隔離區(qū)域中的邊。

        現(xiàn)在我們已經(jīng)定義了我們想要的邊,接著讓我們定義一個(gè)函數(shù)把這些邊變成線:
        lines = cv2.HoughLinesP(isolated, rho=2, theta=np.pi/180, threshold=100, np.array([]), minLineLength=40, maxLineGap=5)
        這一行代碼是整個(gè)算法的核心,它被稱為霍夫變換(Hough Transform),將孤立區(qū)域的白色像素簇轉(zhuǎn)換為實(shí)際的線條。

        • 參數(shù)1:孤立梯度

        • 參數(shù)5:占位符數(shù)組

        • 參數(shù)6:最小行長(zhǎng)

        • 參數(shù)7:最大行間距


        下面的部分將深入到算法背后的具體細(xì)節(jié),所以在你們讀完第二部分后,你們可以回到這部分,希望這部分會(huì)更有意義。

        第二部分:霍夫變換


        簡(jiǎn)單說明一下,這部分僅僅是理論,如果你們想跳過這一部分,可以繼續(xù)閱讀第3部分,但鼓勵(lì)小伙伴們通讀一遍。

        來談?wù)劵舴蜃儞Q。在笛卡爾平面(xy)中,直線由公式y=mx+b定義,其中xy對(duì)應(yīng)于直線上的一個(gè)特定點(diǎn),mb分別對(duì)應(yīng)于斜率和y軸截距。

        笛卡爾坐標(biāo)空間中的直線

        平面被繪制成xy值的函數(shù),這意味著我們顯示的是這條直線有多少(x, y)對(duì)組成(有無窮多的x, y對(duì)組成任何一條線,這就是為什么線延伸到無窮遠(yuǎn)的原因)。

        但是,可以用它的mb值繪制直線,這是在一個(gè)叫做霍夫空間的平面上完成的。為了理解Hough變換算法,我們需要了解Hough空間是如何工作的。

        霍夫空間的解釋
        在我們的用例中,我們可以將霍夫空間總結(jié)為兩行:
        • 笛卡爾平面上的點(diǎn)在霍夫空間中變成直線

        • 笛卡爾平面上的直線在霍夫空間上變成點(diǎn)


        想想線的概念,一條線基本上是由一個(gè)接一個(gè)有序排列的無窮長(zhǎng)的點(diǎn)組成的。因?yàn)樵诘芽柶矫嫔?,我們畫的線是xy的函數(shù),線被顯示為無限長(zhǎng)因?yàn)橛袩o限多的(x, y)對(duì)組成了這條線。

        現(xiàn)在在霍夫空間中,我們畫出直線作為mb值的函數(shù)。因?yàn)槊織l笛卡爾直線上只有一個(gè)mb值,所以這條直線可以表示為一個(gè)點(diǎn)。

        例如,方程y=2x+1表示笛卡爾平面上的一條直線。它的mb值分別是' 2 '' 1 ',這是這個(gè)方程唯一可能的mb值。另一方面,這個(gè)方程可以有很多xy的值,使得這個(gè)方程成立(左邊=右邊)。


        如果我們要用mb的值來畫這個(gè)方程,我們只會(huì)用點(diǎn)(2,1);如果我們要用xy的值來畫這個(gè)方程,我們將會(huì)有無窮多的選擇因?yàn)橛袩o窮多的(x, y)對(duì)。

        把θ看成b, r看成m。稍后我們會(huì)在文章中解釋?duì)群?/span>r的相關(guān)性。

        那么為什么霍夫空間中的線在笛卡爾平面上被表示為點(diǎn)(如果你們從之前的解釋中很好地理解了這個(gè)理論,我們希望小伙伴們?cè)跊]有閱讀解釋的情況下就能解決這個(gè)問題)。

        現(xiàn)在我們考慮笛卡爾平面上的一點(diǎn)。笛卡爾平面上的一個(gè)點(diǎn)只有一個(gè)可能的(x, y)對(duì)可以表示它,因此它是一個(gè)點(diǎn),不是無限長(zhǎng)。關(guān)于一個(gè)點(diǎn),還有一個(gè)事實(shí)就是有無限多的可能的線可以通過這個(gè)點(diǎn),換句話說,這個(gè)點(diǎn)可以滿足無窮多個(gè)方程(y=mx + b)(LS=RS)。


        目前,在笛卡爾平面中,我們根據(jù)xy值繪制這個(gè)點(diǎn)。但是在霍夫空間中,我們根據(jù)它的mb值來畫這個(gè)點(diǎn),因?yàn)橛袩o限條線穿過這個(gè)點(diǎn),所以在霍夫空間中會(huì)得到一條無限長(zhǎng)的線。

        以點(diǎn)(3,4)為例,可以通過該點(diǎn)的直線有:y= -4x+16, y= -8/3x + 12y= -4/3x + 8(直線有無窮多,但為了簡(jiǎn)單起見,我們用3條直線)

        如果你們?cè)诨舴蚩臻g中繪制每一條直線([- 4,16],[-8/ 3,12][-4/ 3,8]),在笛卡爾空間中代表每條直線的點(diǎn)將在霍夫空間中形成一條直線(這條直線對(duì)應(yīng)于點(diǎn)(3,4))

        每個(gè)點(diǎn)代表前面顯示的線(匹配顏色)

        現(xiàn)在如果我們?cè)趥€(gè)笛卡爾平面上放置另一個(gè)點(diǎn)呢?這在霍夫空間會(huì)有什么結(jié)果呢?通過霍夫空間,我們可以找到笛卡爾平面上最適合這兩點(diǎn)的直線。

        我們可以通過在霍夫空間中繪制與笛卡爾空間中兩點(diǎn)相對(duì)應(yīng)的直線,并找到這兩條直線在霍夫空間中相交的點(diǎn)(a.k.a它們的POI,交叉點(diǎn))。

        總結(jié)上述內(nèi)容:
        • 笛卡爾平面上的直線在霍夫空間中表示為點(diǎn)

        • 笛卡兒平面上的點(diǎn)在霍夫空間中表示為直線

        • 通過求霍夫空間中與這兩個(gè)點(diǎn)對(duì)應(yīng)的兩條直線的POImb坐標(biāo),可以找到笛卡爾空間中兩點(diǎn)的最佳擬合直線,然后根據(jù)這些mb的值組成一條直線。??


        回到解釋:
        雖然這些概念比較好,但它們?yōu)槭裁粗匾?/span>?還記得我們之前提到過的Canny邊緣檢測(cè)嗎?它使用梯度來測(cè)量圖像中的像素強(qiáng)度并輸出邊緣。

        在其核心,梯度只是圖像上的點(diǎn)。所以我們能做的就是找到最適合每一組點(diǎn)的直線(圖像左邊的梯度和圖像右邊的梯度),這些最合適的線是我們的車道線。為了更好地理解它是如何工作的,讓我們?cè)偕钊肓私庖幌?/span>!

        我們只是解釋了如何通過查看mb值來找到最合適的線對(duì)應(yīng)于霍夫空間中的點(diǎn)的兩條線的POI。然而,當(dāng)我們的數(shù)據(jù)集增長(zhǎng)時(shí),并不總是有一條線完全適合我們數(shù)據(jù)。

        這就是我們不得不使用容器的原因。當(dāng)合并容器時(shí),我們將霍夫平面劃分為等距部分。每個(gè)部分都稱為容器,通過關(guān)注容器中POI的數(shù)量,使我們能夠確定一條與我們的數(shù)據(jù)具有良好相關(guān)性的線。一旦找到有最多交集的容器,我們就可以使用mb值,它們與該容器相對(duì)應(yīng),并在笛卡爾空間中形成一條直線,這條線就是最適合我們的數(shù)據(jù)的線。


        但是在垂直線上,斜率是無窮大的,我們不能在霍夫空間中表示無窮,這將導(dǎo)致程序崩潰。所以我們不用y=mx+b來表示直線方程,我們用P()和θ()來定義直線,這也被稱為極坐標(biāo)系統(tǒng)。

        在極坐標(biāo)下,直線用方程P=xsinθ + ysinθ表示。在我們深入研究之前,讓我們定義一下這些變量的含義:

        • P表示從原點(diǎn)垂直于直線的距離。

        • θ表示從正x軸到直線的俯角。

        • xcosθ表示x方向上的距離。

        • ysinθ表示y方向上的距離。

        這是對(duì)極坐標(biāo)含義的直觀解釋

        用極坐標(biāo)系統(tǒng),即使有一條垂直線,也不會(huì)有任何誤差。例如,取點(diǎn)(6,4)代入方程  P=xcosθ+ ysinθ。現(xiàn)在,我們?nèi)〗?jīng)過這個(gè)點(diǎn)x=6的垂直線,把它代入極坐標(biāo)方程,P = 6cos(90) + 4sin(90)

        • θ是一條垂直線的90度,因?yàn)樗鼜恼?/span>x軸到直線本身的俯角是90度。θ的另一種表示方法是π/2(弧度)。如果你們想了解更多關(guān)于弧度的知識(shí),以及我們?yōu)槭裁匆褂盟鼈儯@里有一個(gè)很好的視頻。然而,沒有必要知道弧度是什么。

        • XY取點(diǎn)(6,4)的值因?yàn)檫@是我們?cè)谶@個(gè)例子中使用的點(diǎn)。


        現(xiàn)在我們把這個(gè)方程解出來:

        P = 6cos(90) + 4sin(90)

        P = 6(1) + 4(0)

        P = 6



        如我們所見,我們不會(huì)以錯(cuò)誤結(jié)束。事實(shí)上,我們甚至不需要做這個(gè)計(jì)算,因?yàn)槲覀冊(cè)陂_始之前就已經(jīng)知道P是多少了。注意,這和從原點(diǎn)到x軸的距離是一樣的。

        我們想解釋的東西的圖像。

        那么現(xiàn)在這已經(jīng)解決了問題,我們準(zhǔn)備好回去編碼了嗎?不是現(xiàn)在。還記得之前我們?cè)诘芽柶矫嫔袭孅c(diǎn)的時(shí)候嗎?我們最終會(huì)得到霍夫空間中的直線?當(dāng)我們使用極坐標(biāo)時(shí),我們會(huì)得到一條曲線而不是一條直線。然而,概念是一樣的,我們將找到具有大多數(shù)交叉點(diǎn)并使用那些mb值來確定最佳擬合線。

        第三部分:優(yōu)化+顯示


        這一節(jié)是為了優(yōu)化算法,如果我們不平均這些線,它們看起來很不穩(wěn)定,因?yàn)?/span>cv2.HoughLinesP輸出一串小線段,而不是一條大線。

        為了平均這些線,我們將定義一個(gè)“average”函數(shù)。
        def average(image, lines):     left = []     right = [] for line in lines:    slope = parameters[0]         y_int = parameters[1]         if slope < 0:             left.append((slope, y_int))         else:             right.append((slope, y_int))
        這個(gè)函數(shù)對(duì)cv2.HoughLinesP函數(shù)中生成的行進(jìn)行平均,它會(huì)找到左右兩個(gè)線段的平均斜率和y軸截距,并輸出兩條實(shí)線(一條在左邊,另一條在右邊)cv2.HoughLinesP函數(shù)的輸出中,每個(gè)線段有兩個(gè)坐標(biāo):一個(gè)表示直線的開始,另一個(gè)表示直線的結(jié)束。利用這些坐標(biāo),我們要計(jì)算每條線段的斜率和y軸截距。


        然后,我們將收集所有線段的斜率,并將每個(gè)線段分為與左線或右線對(duì)應(yīng)的列表(負(fù)斜率=左線,正斜率=右線)。

        • 4:通過直線數(shù)組進(jìn)行循環(huán)。

        • 5:從每個(gè)線段中提取兩個(gè)點(diǎn)的(x, y)值。

        • 6-9:確定每個(gè)線段的斜率和y軸截距。

        • 10-13:將負(fù)斜率添加到左行列表中,將正斜率添加到右行列表中。


        注意:通常情況下,正斜率=左直線,負(fù)斜率=右直線,但在我們的例子中,圖像的y軸是反的,這就是為什么斜率是反的(OpenCV中的所有圖像都是反的y)。

        接下來,我們要從兩個(gè)表中求斜率和y軸截距的平均值。
        right_avg = np.average(right, axis=0)     left_avg = np.average(left, axis=0)     left_line = make_points(image, left_avg)     right_line = make_points(image, right_avg) return np.array([left_line, right_line])
        • 1-2:對(duì)兩個(gè)列表(左邊和右邊)的所有線段取平均值。

        • 3-4:計(jì)算每一行的起始點(diǎn)和端點(diǎn)。(我們將在下一節(jié)定義make_points函數(shù))

        • 5:輸出每一行的2個(gè)坐標(biāo)。


        現(xiàn)在我們有了兩個(gè)列表的平均斜率和y軸截距,讓我們定義兩個(gè)列表的起點(diǎn)和終點(diǎn)。
        def make_points(image, average):   slope, y_int = average   y1 = image.shape[0]  y2 = int(y1 * (3/5))  x1 = int((y1 — y_int) // slope)  x2 = int((y2 — y_int) // slope)  return np.array([x1, y1, x2, y2])
        這個(gè)函數(shù)有兩個(gè)參數(shù),一個(gè)是帶有車道線的圖像,另一個(gè)是有平均斜率和y_int的列表,輸出每條線的起點(diǎn)和終點(diǎn)。

        • 1:定義函數(shù)

        • 2:得到平均斜率和y截距

        • 3 - 4:定義的高度線(左右兩邊都一樣)

        • 5 - 6:通過重新排列一條線的方程計(jì)算x坐標(biāo),y=mx+b to x = (y-b) / m

        • 7:輸出坐標(biāo)集


        為了進(jìn)一步說明,在第一行,我們用y1值作為圖像的高度。這是因?yàn)樵?/span>OpenCV中,y軸是倒轉(zhuǎn)的,所以0在頂部,而圖像的高度在原點(diǎn)(參考下圖)。同樣,在第二行,y1乘以3/5,這是因?yàn)槲覀兿胱屩本€從原點(diǎn)y1開始,以圖像的2/5結(jié)束。


        應(yīng)用于左線的make_points函數(shù)的可視化示例

        但是,這個(gè)函數(shù)并不顯示這些線,它只計(jì)算顯示這些線所需的點(diǎn)。接下來,我們要?jiǎng)?chuàng)建一個(gè)函數(shù),它取這些點(diǎn),并用它們來畫線。

        def display_lines(image, lines):  lines_image = np.zeros_like(image)  if lines is not None:    for line in lines:      x1, y1, x2, y2 = line      cv2.line(lines_image, (x1, y1), (x2, y2), (255, 0, 0), 10)  return lines_image
        這個(gè)函數(shù)有兩個(gè)參數(shù):我們想要顯示線條的圖像以及從平均函數(shù)輸出的車道線。

        • 2:創(chuàng)建一個(gè)與原始圖像相同尺寸的黑色圖像

        • 3:確保包含線點(diǎn)的列表不是空的

        • 4-5:循環(huán)遍歷列表,并提取兩對(duì)(x, y)坐標(biāo)


        我們可能會(huì)想,為什么我們不把這些線添加到真實(shí)圖像上,而是黑色圖像上。因?yàn)樵紙D像有點(diǎn)太亮了,所以如果我們把它調(diào)暗一點(diǎn),讓車道線看得更清楚一點(diǎn)就好了(是的,我們知道,這不是大不了的,但找到改進(jìn)算法的方法總是很好的)。

        :直接添加線條到圖像。右:使用cv2.addddled函數(shù)

        所以我們要做的就是調(diào)用cv2.addWeighted函數(shù):
        lanes =cv2.addWeighted(copy, 0.8, black_lines, 1, 1)

        這個(gè)函數(shù)為實(shí)際圖像中的每個(gè)像素賦予0.8的權(quán)重,使它們稍微暗一些(每個(gè)像素乘以0.8)。同樣地,我們給所有車道線的黑色圖像賦予1的權(quán)重,這樣所有像素都保持相同的強(qiáng)度,使其突出。接下來我們要做的就是調(diào)用這些函數(shù):

        copy = np.copy(image1) grey = grey(copy) gaus = gauss(grey) edges = canny(gaus,50,150) isolated = region(edges)lines = cv2.HoughLinesP(isolated, 2, np.pi/180, 100, np.array([]), minLineLength=40, maxLineGap=5) averaged_lines = average(copy, lines) black_lines = display_lines(copy, averaged_lines)
        在這里,我們簡(jiǎn)單地調(diào)用前面定義的所有函數(shù),然后在第12行輸出結(jié)果,cv2.waitKey函數(shù)用于告訴程序圖像顯示需要多長(zhǎng)時(shí)間。我們將“0”傳遞給函數(shù),這意味著它將等待,直到按下一個(gè)鍵關(guān)閉輸出窗口。

        輸出結(jié)果:

        我們也可以把這個(gè)算法應(yīng)用到視頻上。
        video = r”D:\users\new owner\Desktop\TKS\Article Lane Detection\test2_v2_Trim.mp4" cap = cv2.VideoCapture(video) while(cap.isOpened()):    ret, frame = cap.read()   if ret == True:#----THE PREVIOUS ALGORITHM----#     gaus = gauss(frame)     edges = cv2.Canny(gaus,50,150)     isolated = region(edges) lines = cv2.HoughLinesP(isolated, 2, np.pi/180, 50,)  lanes = cv2.ad1dWeighted(frame, 0.8, black_lines, 1, 1)     cv2.imshow(“frame”, lanes) #----THE PREVIOUS ALGORITHM----#     if cv2.waitKey(10) & 0xFF == ord(‘q’):        break   else:     break cap.release()  cv2.destroyAllWindows()
        這段代碼將我們?yōu)閳D像創(chuàng)建的算法應(yīng)用到視頻中。記住,一個(gè)視頻就是一串快速出現(xiàn)的圖片。

        • 1-2:定義視頻的路徑。

        • 3-4:捕獲視頻(使用cv2. videcapture),并循環(huán)遍歷所有幀。

        • 5-6:讀取幀,如果有幀,繼續(xù)。

        • 10-18:從前面的算法復(fù)制代碼,并將所有使用Copy的地方替換為frame,因?yàn)槲覀兿氪_保我們操作的是視頻的幀,而不是前面函數(shù)中的圖像。

        • 22-23:顯示每一幀10秒,如果按下“q”按鈕,退出循環(huán)。

        • 24-25:它是第5-6if語句的延續(xù),但它所做的只是如果沒有任何幀,就退出循環(huán)。

        • 26-27:關(guān)閉視頻


        我們剛剛建立了一個(gè)可以檢測(cè)車道線的算法,希望小伙伴們喜歡構(gòu)建這個(gè)算法,但不要止步于此,這只是一個(gè)關(guān)于計(jì)算機(jī)視覺世界的入門項(xiàng)目。

         

        關(guān)鍵點(diǎn):

        • 使用高斯模糊去除圖像中的所有噪聲

        • 使用canny邊緣檢測(cè)來分離圖像中的邊緣

         

        關(guān)鍵字:

        如果小伙伴們好奇,這里有一些與這個(gè)算法相關(guān)的關(guān)鍵術(shù)語,小伙伴們可以更深入地研究。
        • 高斯模糊

        • 位和二進(jìn)制

        • 精明的邊緣檢測(cè)

        • 霍夫變換

        • 梯度

        • 極坐標(biāo)

        • OpenCV車道線檢測(cè)

        其他需要考慮的資源:

        • youtube視頻。


        Github代碼連接:
        https://github.com/Nushaine/lane-detection/blob/master/Untitled33.ipynb

        好消息,小白學(xué)視覺團(tuán)隊(duì)的知識(shí)星球開通啦,為了感謝大家的支持與厚愛,團(tuán)隊(duì)決定將價(jià)值149元的知識(shí)星球現(xiàn)時(shí)免費(fèi)加入。各位小伙伴們要抓住機(jī)會(huì)哦!


        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


        瀏覽 55
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            性生交生活影碟片 | 西西444WWW无码大胆 | 久久国语对白 | 亚洲插B 女人黄色一级毛片 | 日本无码加勒比一区二区 | 毛片免费播放 | 熟女乱3p| 97超惹人人| 国精产品一品二品三品久久黄色 | 过度纵欲的少妇 |