如何在车道检测算法中自动检测道路边界?

时间:2017-10-09 08:06:06

标签: python matlab opencv image-processing computer-vision

因此,使用计算机视觉进行车道检测的流行方法是执行以下5个步骤:

  1. 将图像转换为灰度,通过高斯平滑图像 功能
  2. 使用canny edge函数检测边缘(显然是对的?)
  3. 标记感兴趣区域ROI
  4. 使用hough transform fucntion检测直线并使用线条函数绘制它们。
  5. 这就是我的方法。 但这里的重点是我们通常需要手动选择ROI。在大多数情况下,当应用于汽车上的仪表摄像头时,它是可以的,因为视图没有太大变化。

    但我的情况不同,我想检测基于交通监控摄像头的道路车道,当然还有很多道路车道。每个摄像头都有自己的视野,所以我认为必须有一种方法来自动分离道路和非道路区域。

    我的问题是如何自动检测投资回报率?

    我的想法是道路区域将有很多像素运动,而非道路区域则不会。根据这个想法,我们可以自动检测投资回报率。

    我已设法使用opencv从此视频(background subtracted)中使用openCV和subtractBackgroundMOG2函数提取背景(https://youtu.be/bv3NEzjb5sU)。

    关于canny edge和hough变换的代码在我们获得ROI后基本上没问题。以下是训练和提取背景的代码。我虽然可以修改它以给出区域掩码或可以用作后续步骤的ROI的东西。

    谢谢。

    import cv2
    from pathlib import Path
    
    
    
    def bg_train(video_source, number_of_run, number_of_frames):
        cap = cv2.VideoCapture(video_source)
        fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
        frame_number = -1
        default_background = Path("default_background.png")
    
        # the number of loop that will run to create a better background
        i = 0
    
        # check the file if it's already exist
        if default_background.is_file():
            i = 1
            default_background = "default_background.png"
        else:
            default_background = None
            i = 0
    
        while i < number_of_run:
            # Capture next frame and show in window
            ret, frame = cap.read()
            if not ret:
                print("frame capture failed or not :)")
                break
    
            cv2.imshow("training_original", frame)
    
            # subtract foreground and show in new window
            background_read = cv2.imread(default_background)
            fg = fgbg.apply(frame, background_read, -1)
            fg_mask = filter_mask(fg)
            cv2.imshow('Training_FG', fg_mask)
    
            # subtract background and show in new window
            bg = fgbg.getBackgroundImage(fg_mask)
            cv2.imshow('Training_background', bg)
            print(i, frame_number, bg.shape[0], bg.shape[1], bg.shape[2])
    
            # Counting frame and save the final background after training
            frame_number += 1
            if frame_number == number_of_frames and i < number_of_run - 1:
                i += 1
                cv2.imwrite("default_background.png", bg)
                cap.release()
                cv2.destroyAllWindows()
                cap = cv2.VideoCapture(video_source)
                frame_number = -1
            elif frame_number == number_of_frames and i == number_of_run - 1:
                i += 1
                cv2.imwrite("background_final.png", bg)
                cv2.imshow("final background", bg)
                return 1, bg
    
            k = cv2.waitKey(1) & 0xff
            if k == 27:
                print("exit by user...")
                return 0, None
    
        cap.release()
        cv2.destroyAllWindows()
    
    
    def main():
        video_source = "highway-30s.mp4"
        check, background_after = bg_train(video_source, 2, 500)
        if check == 0:
            return 0
        elif check == 1:
            cv2.imshow("the background, press ESC to close window", background_after)
            c = cv2.waitKey(0)
            if c == 27:
                cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
        main()
    

1 个答案:

答案 0 :(得分:0)

您可以通过在一系列帧中跟踪视口中的移动来训练算法在初始时间内选择ROI。

过滤出移动并创建表示方向的线条/向量。一旦你有足够的这些样本,你可以通过使用封装这些向量的边界框来找出最佳的ROI。