运动物体的轨迹
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")
【讨论】:
以上是关于运动物体的轨迹的主要内容,如果未能解决你的问题,请参考以下文章