opencv视频检测车辆基本原理分析

该文介绍了一个使用Python进行车辆检测的流程,包括获取摄像头视频、图像尺寸调整、多边形区域检测、灰度化、去噪、背景去除、腐蚀、膨胀、闭运算、轮廓查找以及轮廓中心点计算。通过对轮廓中心点的分析,设定检测范围和阈值来识别和计数车辆。
摘要由CSDN通过智能技术生成

检车步骤:
(python代码)

一、获取摄像头视频

cap = cv.VideoCapture("d:/Download/cars.mp4")

二、改变图像尺寸

frame=cv.resize(frame,(702,576))

三、按多边形生成局部的检测图片

 def img_paste(image, roi_t):
         im = np.zeros(image.shape[:3], dtype="uint8")
         #把所有的点画出来
         cv.polylines(im, roi_t, True, (255, 0, 255))  # 画任意多边形
         # 把所有点连接起来,形成封闭区域
         cv.fillPoly(im, roi_t, (255, 255, 255))
         mask = im
         #将连接起来的区域对应的数组和原图对应位置按位相与
         masked = cv.bitwise_and(image, mask)
         #cv2中的图片是按照bgr顺序生成的,我们需要按照rgb格式生成
         b, g, r = cv.split(masked)
         masked = cv.merge([r, g, b])
         return masked
roi_as.append(np.array([[371,389], [452, 387], [480, 572], [344, 570]],dtype=np.int32))
   img=img_paste(frame, roi_as)
   cropped = img [377:576,319:499]

四、灰度化

 gray=cv.cvtColor(cropped,cv.COLOR_BGR2GRAY)

五、去噪

blur=cv.GaussianBlur(gray,(3,3),5)

六、去背景

mask=bgsubmog.apply(blur)

七、腐蚀

 erode=cv.erode(mask,kernel)

八、膨胀

dilate=cv.dilate(erode,kernel,iterations=5)

九、闭操作

 close=cv.morphologyEx(dilate,cv.MORPH_CLOSE,kernel)

十、查找轮廓

cnts, h = cv.findContours(close,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) #cv.RETR_EXTERNAL只检测外轮廓

十一、画检测线并根据检测线设置检测范围

 cv.line(cropped,(leftpoint,line_heigh),(rightpoint,line_heigh),(255,255,0),2)

十二、计算轮廓中心点

  def center(x,y,w,h):
          x1=int(w/2)
          y1=int(h/2)
          cx=x+x1
          cy=y+y1
          return cx,cy
 cnts, h = cv.findContours(close,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) #cv.RETR_EXTERNAL只检测外轮廓
    for(i,c) in enumerate(cnts):
         (x,y,w,h) = cv.boundingRect(c)
         cpoint=center(x,y,w,h)
         cars.append(cpoint)

十三、检测:1、根据轮廓中心点是否包含在检测范围内,因为检测线范围太窄,中心点正好在检测线的机率很小,必须设置一个检测范围,比如:line_height=200为检测线的y坐标,检测范围就是:(y>line_heigh-offset) and (y<line_heigh+offset),其中offset就是偏移量,检测区是一个带状区,检测区不宜过大,也不宜过小,适当即可。
2、大于等于轮廓阈值:isValid=(w>=min_w) and (h>=min_h)

十四、计数:因为每帧都会产生不同的多个轮廓,应设置判断条件避免重复检出车辆。

   for(x,y) in cars:
             if((y>line_heigh-offset) and (y<line_heigh+offset)):
                 if(historyFrameNo==0):
                     carno+=1
                     historyFrameNo=frameno
                     outtime=time.time()
                     out_y=calcActualDistance(371+y)
             if(carno>=1):
                 if(frameno-historyFrameNo>30):
                     carno+=1
                     historyFrameNo=frameno
                     outtime=time.time()
                     out_y=calcActualDistance(371+y)
             cars.clear()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值