车的换道检测


车的换道检测文章插图
在本教程中 , 我们将学习如何使用计算机视觉和图像处理来检测汽车是否在路上变道 。
你一定听说过使用Opencv haar cascade可以检测人脸、眼睛或汽车、公共汽车等物体?这次让我们用这个简单的检测方法来构建一些很酷的东西 。
1.数据集在本教程中 , 道路上汽车的视频文件被用作数据集 。 此外 , 我们可以使用图像数据集检测图像中的车辆 , 但在这里 , 当车辆变道时 , 我们会用弹出窗口发出警报 , 因此对于这些动态信息 , 视频输入更为可行 。
2.输入【车的换道检测】我们使用OpenCV的haar cascade来检测汽车的坐标 , 输入是道路上汽车的视频文件
cascade_src = 'http://kandian.youth.cn/index/cascade/cars.xml'video_src = 'http://kandian.youth.cn/index/dataset/cars.mp4'cap = cv2.VideoCapture(video_src)car_cascade = cv2.CascadeClassifier(cascade_src)cv2.VideoCapture()方法用于捕获输入的视频 , 一个视频通常是每秒25帧图像(fps) 。 在捕获到输入后 , 循环提取帧 , 并利用haar cascade检测 , 在循环中围绕汽车绘制一个矩形 , 以获得一致性 , 同时对捕获的帧执行其他操作 。
while(1):# 获取每一帧_, frame = cap.read()cars = car_cascade.detectMultiScale(frame, 1.1, 1)for (x,y,w,h) in cars:roi = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)#感兴趣区域在OpenCV中使用BGR而不是RGB , 因此(0,0,255)将在汽车上绘制一个红色矩形 , 而不是蓝色 。
车的换道检测文章插图
3.图像处理我们使用帧 , 但是如果帧的分辨率非常高 , 它将减慢执行的操作 , 此外 , 帧包含噪声 , 可以使用模糊来减少 , 这里使用高斯模糊 。
现在 , 让我们看看一些图像处理的概念
3.1 HSV框架在这篇文章中 , 我们使用从cv2.VideoCapture()捕获的帧中获取HSV帧 , 仅突出显示车辆转弯的点 , 并遮住剩余的道路和在道路上直线行驶的车辆 。 设置上限和下限以定义HSV中的颜色范围 , 以查看汽车变道的点 , 并用作帧的掩码 。 下面是用于获取此信息的代码片段-
# 使用模糊消除视频帧中的噪声frame = cv2.GaussianBlur(frame,(21,21),0)# 转换BGR到HSVhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 在HSV中定义颜色范围 , 以查看车辆改变角度的点lower_limit = np.array([0,150,150])upper_limit = np.array([10,255,255])# HSV图像限制阈值mask = cv2.inRange(hsv, lower_limit, upper_limit)3.2腐蚀和膨胀腐蚀和膨胀是用于图像处理的两种基本形态学操作 。 腐蚀算子对核函数的区域有局部最小值的影响 , 核函数是模板或掩码 。 腐蚀是用来减少图像中的斑点噪声 。 膨胀是图像与核的卷积 , 它具有局部最大算子的作用 。 当像素被添加到图像中平滑物体的边界时 , 应用膨胀来恢复一些丢失的区域 。
从HSV帧的第一步生成的掩码现在用基本的形态学操作(腐蚀和扩张)来处理 。 生成的帧是通过将帧和掩码之间的按位与运算得到ROI(感兴趣区域) 。
kernel = np.ones((3,3),np.uint8)kernel_lg = np.ones((15,15),np.uint8)# 被称为腐蚀的图像处理技术用于降噪mask = cv2.erode(mask,kernel,iterations = 1)# 称为膨胀的图像处理技术 , 用来恢复失去的部分区域mask = cv2.dilate(mask,kernel_lg,iterations = 1)# 除了感兴趣的区域 , 其他地方都变成黑色result = cv2.bitwise_and(frame,frame, mask= mask)3.3车道检测利用canny边缘检测算子结合Hough线变换进行车道检测 。
车的换道检测文章插图
#车道检测def canny(frame):gray=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)blur=cv2.GaussianBlur(gray,(5,5),0)canny=cv2.Canny(blur,50,150)return cannydef region_of_interest(frame):height=frame.shape[0]polygons=np.array([[(0,height),(500,0),(800,0),(1300,550),(1100,height)]])mask=np.zeros_like(frame)cv2.fillPoly(mask,polygons,255)masked_image=cv2.bitwise_and(frame,mask)return masked_imagedef display_lines(frame,lines):line_image=np.zeros_like(frame)if lines is not None:for line in lines:x1,y1,x2,y2=line.reshape(4)cv2.line(line_image, (x1, y1), (x2, y2), (0, 255, 0), 3)return line_imagelane_image=np.copy(frame)canny=canny(lane_image)cropped_image=region_of_interest(canny)lines=cv2.HoughLinesP(cropped_image,2,np.pi/180,100,np.array([]),minLineLength=5,maxLineGap=300)line_image=display_lines(lane_image,lines)frame=cv2.addWeighted(lane_image,0.8,line_image,1,1)cv2.imshow('video', frame)4.等高线canny边缘检测器等算法用于查找边缘像素图像中的边缘分界,但它并没有告诉我们如何找到对象或实体不能结合的点和边,这里我们可以使用OpenCV实现的cv2.findContours()作为轮廓的概念 。