因此,使用计算机视觉进行车道检测的流行方法是执行以下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()
答案 0 :(得分:0)
您可以通过在一系列帧中跟踪视口中的移动来训练算法在初始时间内选择ROI。
过滤出移动并创建表示方向的线条/向量。一旦你有足够的这些样本,你可以通过使用封装这些向量的边界框来找出最佳的ROI。