> 文章列表 > OpenCV实例(七)汽车检测

OpenCV实例(七)汽车检测

OpenCV实例(七)汽车检测

OpenCV实例(七)汽车检测

  • 1.概述
  • 2.代码实例
  • 3.代码功能

作者:Xiou

1.概述

对于图像和视频检测中的目标类型并没有具体限制,但是,为了使结果的准确度在可接受范围内,需要一个足够大的数据集,包括训练图像的大小要一样。如果由自己构建这样的数据集(这是完全可能的)将会非常耗时。

可利用现成的数据集,在网上可以免费下载许多这样的数据集:

·The University or Illinois:

http://l2r.cs.uiuc.edu/cogcomp/Data/Car/CarData.tar.gz

·Stanford University:

http://ai.stanford.edu/~jkrause/cars/car_dataset.html

2.代码实例

需要实现功能:
1、识别出图片中的汽车对象
2、对车辆进行统计,并将统计结果展示出来

涉及到的知识点:
图像和视频的加载、展示;
基本图像绘制;
基本图像运算与处理;
形态学处理(比如降噪、腐蚀膨胀);
轮廓查找。

import cv2
import numpy as np# 加载视频
cap = cv2.VideoCapture('../img/video.mp4')# 背景去除
bgsubmog = cv2.createBackgroundSubtractorMOG2()# 创建腐蚀膨胀的卷积核
k = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 设置最小宽高阈值
min_w, min_h = 90, 90
# 创建一个列表存放车辆轮廓中心点
cars = []
car_n = 0  # 车辆的个数
# 检测线的高   视频的尺寸为1280*720
line_height = 550
# 线的偏移
line_offset = 6# 定义函数,计算中心点
def center(x, y, w, h):x1 = int(w / 2)y1 = int(h / 2)cx = x + x1cy = y + y1return cx, cywhile True:ret, frame = cap.read()if ret:# 灰度化cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 由于一些树叶也会动,形成噪点,所以进行去噪blur = cv2.GaussianBlur(frame, (9, 9), 5)  # 9*9可以自己设置 3*3  5*5 7*7.。。mask = bgsubmog.apply(blur)  # 去除背景# 腐蚀erode = cv2.erode(mask, k)# 腐蚀之后变小了,要膨胀dilate = cv2.dilate(erode, k, iterations=2)# 闭操作,去掉物体内部的小块close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, k)close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, k)# 查找轮廓contours, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 每一帧都要画线cv2.line(frame, (0, line_height), (1280, line_height), (0, 255, 0), 2)for (i, c) in enumerate(contours):  # 拿到索引和边界(x, y, w, h) = cv2.boundingRect(c)  # 绘制矩形if w >= min_w and h >= min_h:  # 如果是车辆,绘制轮廓cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255))# 存取车的轮廓的中心点,如果中心点过线,代表有车经过cpoint = center(x, y, w, h)  # 计算中心点cars.append(cpoint)for (x, y) in cars:# 如果车在线的上下偏移量之间,表示有车辆经过if (y > line_height - line_offset) and (y < line_height + line_offset):car_n += 1  # 车的数量+1cars.remove((x, y))print(car_n)else:  # 如果不是车辆,跳过continue# 显示车辆的统计信息cv2.putText(frame, 'Cars Count:' + str(car_n), (500, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 5)cv2.imshow('video', frame)key = cv2.waitKey(33)if key == 113:  # 按‘q'退出breakcap.release()
cv2.destroyAllWindows()

输出结果:

OpenCV实例(七)汽车检测

3.代码功能

这段代码涉及相当多的知识,下面来解释这段代码的具体功能:

1)首先,在导入模块后声明了训练图像的基础路径。定义这样的路径很有用,因为不同计算机上训练数据所在的文件夹不一样,这样做就可避免在每个地方都要修改这个路径。

OpenCV实例(七)汽车检测

2)去除背景

OpenCV实例(七)汽车检测

3)形态处理
去除背景后通过腐蚀去掉小的噪点。

OpenCV实例(七)汽车检测

4)查找轮廓
根据上面处理完的视频,可以找到一些(车和噪点的)轮廓 ,并且在原视频绘制出来,可以看到还是有一些其他的轮廓会显示出来。

OpenCV实例(七)汽车检测
5)车辆统计
查找到有效车辆后,需要将统计的个数显示在屏幕上。