运动物体的轨迹

Posted

技术标签:

【中文标题】运动物体的轨迹【英文标题】:Trajectory of moving object 【发布时间】:2020-07-02 13:15:16 【问题描述】:

我正在研究人体运动预测。我应该预测人手的运动。我使用光流检测真实视频中的运动,并使用 (cv2.line) 连接前一个点 (a,b) 和下一个点 (c,d)。我需要将变量(a,b,c,d)的这些值存储在一个文本文件中(作为移动手的路径的提取)。这些值随时间而变化。当我使用 pickle 保存变量的值时,它只存储变量的最后一个值。我的问题是:

    有没有更好的方法来提取真实视频中运动物体的路径(githib代码或类似代码)? (光流给了我这么多运动物体的路径,我只需要存储然后做出预测) 对于我当前的实现,如何将每个时间步的可变变量(a、b、c、d)的所有值逐行存储在文本文件中(而不仅仅是最后一个值)?李>

谢谢

# draw the tracks
for i,(new,old) in enumerate(zip(good_new,good_old)):
    a,b = new.ravel()
    c,d = old.ravel()
    mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
    frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)
    with open("text.txt", 'wb') as f:
        pickle.dump([a, b, c, d], f)
        f.close()

【问题讨论】:

【参考方案1】:

我不了解视频处理,但关于您的第二个问题,您可以使用 CSV 格式而不是 pickle,并通过以“a”(追加)模式而不是“w”(截断)打开文件来追加新行并覆盖您现有的文件):

    with open("text.txt", "a") as f:
        f.write(",".join(map(str, [a, b, c, d])) + "\n")

顺便说一句,您不需要在with 块的末尾调用f.close() - 这是with 块的目的是关闭文件(即使在出现异常的情况下也会这样做被提出)。

另外,您可能需要重新排列代码,使for 循环位于with 块内,而不是相反。这样您就不会在每次迭代时打开/关闭文件:

with open("text.txt", "a") as f:
    for i,(new,old) in enumerate(zip(good_new,good_old)):
        a,b = new.ravel()
        c,d = old.ravel()
        mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
        frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)
        f.write(",".join(map(str, [a, b, c, d])) + "\n")

【讨论】:

以上是关于运动物体的轨迹的主要内容,如果未能解决你的问题,请参考以下文章

运动物体的轨迹

如何跟踪运动物体的轨迹openCV C++

opencv运动车里检测跟踪轨迹不对

计算椭圆运动轨迹的算法

NVisionXR_iOS教程七 —— 场景中物体运动

宣传片运动画面的拍摄,你也是这样拍的吗?流量雨宣传视频制作