实现质心跟踪车辆计数代码
时间: 2023-10-26 20:10:19 浏览: 69
质心跟踪车辆计数是计算机视觉中的一个基本问题,主要分为两个步骤:第一步是通过图像处理找到车辆的质心;第二步是对车辆进行计数。以下是一个基本的实现代码:
```python
import cv2
import numpy as np
# 定义车辆的颜色范围(在这里我们只考虑红色车辆)
boundaries = [
([17, 15, 100], [50, 56, 200])
]
# 定义视频文件路径
cap = cv2.VideoCapture('video.mp4')
# 初始化变量
counter = 0
previous_count = 0
center_list = []
while True:
ret, frame = cap.read()
if not ret:
break
# 缩小图像尺寸以提高处理速度
frame = cv2.resize(frame, (640, 360))
# 预处理图像
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 遍历颜色范围
for (lower, upper) in boundaries:
# 创建 NumPy 数组以存储颜色范围的上下限
lower = np.array(lower, dtype="uint8")
upper = np.array(upper, dtype="uint8")
# 根据颜色范围创建掩码
mask = cv2.inRange(hsv, lower, upper)
# 对掩码进行形态学操作以去除噪声
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
# 查找轮廓
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓并计算车辆质心
for contour in contours:
# 计算轮廓的外接圆
(x, y), radius = cv2.minEnclosingCircle(contour)
center = (int(x), int(y))
# 如果外接圆的半径小于 10,则跳过该圆
if radius < 10:
continue
# 将车辆质心添加到列表中
center_list.append(center)
# 在图像上绘制外接圆和质心
cv2.circle(frame, center, int(radius), (0, 255, 255), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)
# 计算车辆数量
if len(center_list) > previous_count:
counter += len(center_list) - previous_count
previous_count = len(center_list)
# 在图像上绘制车辆数量
cv2.putText(frame, "Vehicle count: {}".format(counter), (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
该代码使用 OpenCV 库实现,首先定义了车辆的颜色范围(在这里我们只考虑红色车辆),然后打开视频文件并初始化变量。在每个视频帧上,代码首先缩小图像尺寸以提高处理速度,然后预处理图像并查找轮廓。对于每个轮廓,代码计算外接圆和质心,并将质心添加到列表中。最后,代码计算车辆数量并在图像上绘制车辆数量。