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>

        實(shí)戰(zhàn):使用 OpenCV 的自動(dòng)駕駛汽車(chē)車(chē)道檢測(cè)(附代碼)

        共 4412字,需瀏覽 9分鐘

         ·

        2021-08-10 18:37

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

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


        一、邊緣檢測(cè)


        我們將使用 Canny 進(jìn)行邊緣檢測(cè)。如果你不確定這是什么,請(qǐng)查閱相關(guān)資料,對(duì)于后文的閱讀會(huì)有幫助。

        def canyEdgeDetector(image):    edged = cv2.Canny(image, 50, 150)    return edged


        二、定義ROI


        駕駛時(shí),為了讓汽車(chē)保持在車(chē)道上,只關(guān)注當(dāng)前道路的下一個(gè)100米。此外,也不關(guān)心分隔線另一側(cè)的道路。這就是我們定義的區(qū)域。我們隱藏圖像中不必要的細(xì)節(jié),只顯示有助于我們找到車(chē)道的區(qū)域。

        def getROI(image):    height = image.shape[0]    width = image.shape[1]    # Defining Triangular ROI: The values will change as per your camera mounts    triangle = np.array([[(100, height), (width, height), (width-500, int(height/1.9))]])    # creating black image same as that of input image    black_image = np.zeros_like(image)    # Put the Triangular shape on top of our Black image to create a mask    mask = cv2.fillPoly(black_image, triangle, 255)    # applying mask on original image    masked_image = cv2.bitwise_and(image, mask)    return masked_image
        1.我們已經(jīng)定義了三角形 ROI,其坐標(biāo)將根據(jù)你們?cè)谄?chē)上安裝攝像頭的位置而變化(盡量只使用圖像中實(shí)際有助于車(chē)道檢測(cè)的那部分)。
        2.我們創(chuàng)建了一個(gè)與原始圖像形狀相同的黑色圖像:

        3.創(chuàng)建一個(gè)蒙版:然后我們使用cv2.fillPoly()將我們的三角形(帶有白色線條)放在我們的黑色圖像之上以創(chuàng)建一個(gè)蒙版。

        4. 在我們的原始圖像上應(yīng)用蒙版以獲得只有我們的 ROI 的裁剪圖像。

        此步驟的輸出:


        三、獲取線


        下一步是通過(guò) ROI 以獲取圖像中的所有直線。cv2.HoughLinesP()可以實(shí)現(xiàn)這一目標(biāo),此函數(shù)返回它可以在輸入圖像中找到的所有直線的列表,每條線由 [x1, y1, x2, y2] 表示。


        def getLines(image):    lines = cv2.HoughLinesP(image, 0.3, np.pi/180, 100, np.array([]), minLineLength=70, maxLineGap=20)    return lines
        cv2.HoughLinesP() 的參數(shù)必須根據(jù)要求進(jìn)行調(diào)整(嘗試更改和調(diào)試最適合方法)。但我們認(rèn)為上面的方法在大多數(shù)情況下都應(yīng)該有效,此步驟的輸出如下所示:


        四、繪制線條


        以下實(shí)用程序函數(shù)獲取圖像和線條列表,并在圖像上繪制線條。(此步驟不接受來(lái)自 Step3 的任何輸入。相反,這只是一個(gè)將從 Step5 調(diào)用的實(shí)用步驟,因此首先查看 Step5,并在需要時(shí)訪問(wèn)此步驟)。

        def displayLines(image, lines):    if lines is not None:        for line in lines:            x1, y1, x2, y2 = line.reshape(4) #converting to 1d array            cv2.line(image, (x1, y1), (x2, y2), (255, 0, 0), 10)    return image

        我們定義了另一個(gè)效用函數(shù)來(lái)從它的參數(shù)(斜率和截距)中獲取線坐標(biāo)。需要注意的是:一條線由y=mx+c表示,其中 m 是斜率,c 是截距。

        def getLineCoordinatesFromParameters(image, line_parameters):    slope = line_parameters[0]    intercept = line_parameters[1]    y1 = image.shape[0]  # since line will always start from bottom of image    y2 = int(y1 * (3.4 / 5))  # some random point at 3/5    x1 = int((y1 - intercept) / slope)    x2 = int((y2 - intercept) / slope)    return np.array([x1, y1, x2, y2])


        五、獲取平滑的線條


        一旦我們從步驟 3 中獲得了線條,在這一步中,我們將這些線條分成 2 組(左和右)。如果你們注意到Step3的輸出圖像,則此步驟會(huì)將Line1和Line 2放入左側(cè)組,將Line3放入右側(cè)組。

        分組后,我們找到該組的平均斜率(m)和截距(c),并嘗試通過(guò)調(diào)用 getLineCoordinatesFromParameters() 并傳遞平均值 m 和平均值 c 為每個(gè)組創(chuàng)建一條線。

        以下是完成所有這些工作的函數(shù):

        def getSmoothLines(image, lines):    left_fit = []  # will hold m,c parameters for left side lines    right_fit = []  # will hold m,c parameters for right side lines
        for line in lines: x1, y1, x2, y2 = line.reshape(4) parameters = np.polyfit((x1, x2), (y1, y2), 1) slope = parameters[0] intercept = parameters[1]
        if slope < 0: left_fit.append((slope, intercept)) else: right_fit.append((slope, intercept))
        left_fit_average = np.average(left_fit, axis=0) right_fit_average = np.average(right_fit, axis=0)
        # now we have got m,c parameters for left and right line, we need to know x1,y1 x2,y2 parameters left_line = getLineCoordinatesFromParameters(image, left_fit_average) right_line = getLineCoordinatesFromParameters(image, right_fit_average) return np.array([left_line, right_line])

        這是線條分組后圖像的外觀:


        六、主要代碼

        一旦我們準(zhǔn)備好了單獨(dú)的函數(shù),我們只需要在我們的主代碼中調(diào)用它們,你就會(huì)在你的圖像中檢測(cè)到車(chē)道。
        image = cv2.imread("3.jpg") #Load Image
        edged_image = canyEdgeDetector(image) # Step 1roi_image = getROI(edged_image) # Step 2
        lines = getLines(roi_image) # Step 3
        smooth_lines = getSmoothLines(image, lines) # Step 5image_with_smooth_lines = displayLines(image, smooth_lines) # Step 4
        cv2.imshow("Output", image_with_smooth_lines)cv2.waitKey(0)

        輸出將如下所示:


        Github代碼鏈接:

        https://github.com/pdhruv93/computer-vision/tree/main/lane-detection-self-driving


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

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

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


        瀏覽 61
        點(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>
            在线观看无码视频 | 国产成人A片 | 小嫩逼视频 | 美女肏逼网站影院 | 91福利在线观看视频 | 日本黄色电影视频 | 欧美激情视频网站 | 青春草视频在线免费观看 | 各种少妇正面着bbw撒尿视频 | 黄色三级片在线看 |