opencv单物体运动轨迹跟踪绘制出现多余的轨迹路线该如何解决?
代码预期的主要功能:
1.输入指定视频文件
2.弹出窗口播放视频文件的同时,将视频文件中最大的运动物体识别并标记为A1
3.识别并标记A1的运动轨迹为线条
4.输入轨迹数据文件与处理后的视频文件
当前遇到的问题:
代码运行后的处理结果中,不仅标记了视频文件中最大的运动物体A1的运动轨迹线条,还额外标记了一些无关的线条。
需要解决的问题:
避免出现额外标记的无关的线条
代码如下:
import cv2
import numpy as np
# 读取视频文件
cap = cv2.VideoCapture('test_video1.mp4')
# 设置视频帧的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建视频输出
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (frame_width, frame_height))
# 初始化背景减除器
fgbg = cv2.createBackgroundSubtractorMOG2()
# 用于保存A1的运动轨迹数据
A1_trajectory = []
# 用于标记是否开始记录轨迹数据
record_trajectory = False
while True:
ret, frame = cap.read()
if not ret:
break
# 对每一帧进行背景减除
fgmask = fgbg.apply(frame)
# 膨胀图像以填充小孔
fgmask = cv2.dilate(fgmask, None, iterations=2)
# 查找轮廓
contours, _ = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
max_contour = None
max_contour_area = 0
# 找到最大的轮廓
for contour in contours:
area = cv2.contourArea(contour)
if area > max_contour_area:
max_contour = contour
max_contour_area = area
# 如果找到了最大的轮廓
if max_contour is not None and max_contour_area > 1000:
x, y, w, h = cv2.boundingRect(max_contour)
# 绘制A1的边界框
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.putText(frame, 'A1', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2, cv2.LINE_AA)
# 标记开始记录轨迹数据
record_trajectory = True
# 当开始记录轨迹数据时,才绘制轨迹路线
if record_trajectory:
# 记录A1的运动轨迹数据
A1_trajectory.append((x + w / 2, frame_height - y - h / 2)) # 将中心点坐标添加到轨迹数据中
# 在视频帧左下角绘制A1的二维运动轨迹
if len(A1_trajectory) > 1:
for i in range(1, len(A1_trajectory)):
cv2.line(frame, (int(A1_trajectory[i - 1][0]), int(frame_height - A1_trajectory[i - 1][1])),
(int(A1_trajectory[i][0]), int(frame_height - A1_trajectory[i][1])), (0, 0, 255), 2)
# 将帧写入输出视频
out.write(frame)
# 显示视频
cv2.imshow('frame', frame)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
# 保存A1的二维运动轨迹数据
np.savetxt('A1_trajectory.txt', A1_trajectory)
代码与视频文件已经打包,下载链接在此(蓝奏云):
轨迹识别.zip - 蓝奏云
文件大小:1.5 M|
https://www.lanzouw.com/iVZOW1w2zrjc