打字真难 2024-04-22 08:44 采纳率: 50%
浏览 24

opencv单物体运动轨迹跟踪绘制出现多余的轨迹路线该如何解决?

opencv单物体运动轨迹跟踪绘制出现多余的轨迹路线该如何解决?

代码预期的主要功能:
1.输入指定视频文件
2.弹出窗口播放视频文件的同时,将视频文件中最大的运动物体识别并标记为A1
3.识别并标记A1的运动轨迹为线条
4.输入轨迹数据文件与处理后的视频文件

当前遇到的问题:
代码运行后的处理结果中,不仅标记了视频文件中最大的运动物体A1的运动轨迹线条,还额外标记了一些无关的线条。

img

需要解决的问题:
避免出现额外标记的无关的线条

代码如下:

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)

代码与视频文件已经打包,下载链接在此(蓝奏云):


img

  • 写回答

6条回答 默认 最新

  • lxr0708taehyun 2024-04-22 10:08
    关注

    我认为应该 好吧 不会

    评论

报告相同问题?

问题事件

  • 创建了问题 4月22日

悬赏问题

  • ¥20 c语言写的8051单片机存储器mt29的模块程序
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大