<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 9728字,需瀏覽 20分鐘

           ·

          2021-09-14 15:22

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

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


          車道線檢測(cè)是自動(dòng)駕駛汽車的重要組成部分之一,有很多方法可以做到這一點(diǎ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使它變得非常簡單。
          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)換為00000000255轉(zhuǎn)換為11111111。對(duì)于位運(yùn)算和運(yùn)算,我們將使用像素的二進(jìn)制值。現(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:最小行長

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


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

          第二部分:霍夫變換


          簡單說明一下,這部分僅僅是理論,如果你們想跳過這一部分,可以繼續(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è)有序排列的無窮長的點(diǎn)組成的。因?yàn)樵诘芽柶矫嫔希覀儺嫷木€是xy的函數(shù),線被顯示為無限長因?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),不是無限長。關(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ì)得到一條無限長的線。

          以點(diǎn)(3,4)為例,可以通過該點(diǎn)的直線有:y= -4x+16, y= -8/3x + 12y= -4/3x + 8(直線有無窮多,但為了簡單起見,我們用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ù)集增長時(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)
          在這里,我們簡單地調(diào)用前面定義的所有函數(shù),然后在第12行輸出結(jié)果,cv2.waitKey函數(shù)用于告訴程序圖像顯示需要多長時(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算法競賽等微信群(以后會(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)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲综合777777 | 青青欧美,青青美女视频 | 日本一级色情片 | 777在线视频 | 狠狠撸视频 |