【问题标题】:Save frames of live video with timestamps使用时间戳保存实时视频帧
【发布时间】:2019-10-10 00:09:59
【问题描述】:

我想使用 Raspberry pi 实时捕获带有时间戳的视频帧。该视频是由 USB 网络摄像头使用 Python 代码中的 ffmpeg() 函数制作的。如何在树莓派中保存 USB 网络摄像头当前制作的视频帧?

我尝试使用opencv的三个函数。 cv2.VideoCapture 检测视频,video.read() 捕获帧,cv2.imwrite() 保存帧。这里是代码,为了简洁,没有提到包含的库。

  os.system('ffmpeg -f v4l2 -r 25 -s 640x480 -i /dev/video0 out.avi')
  video=cv2.VideoCapture('out.avi')
  ret, frame=video.read()
  cv2.imwrite('image'+str(i)+'.jpg',frame)     
  i+=1

代码保存了之前由网络摄像头制作的视频帧。它不保存网络摄像头当前正在录制的视频帧。

【问题讨论】:

  • currently being recorded 是什么意思?您的意思是视频仍在录制中且尚未刷新到文件中吗?

标签: python opencv raspberry-pi


【解决方案1】:

您可以阅读here,您可以使用camera=cv2.VideoCapture(0) 访问相机。 0 是已连接相机的索引。您可能需要尝试不同的索引,但 0 通常有效。
与视频文件类似,您可以使用ret, frame = camera.read() 抓取一帧。在继续处理帧之前,请始终检查 ret 值。
接下来,您可以按照here 的描述将文本添加到框架中。 您可以使用timedatetime 获取时间戳。 最后保存框架。

注意:如果您使用imwrite,您将很快获得大量图像。根据您的项目,您还可以考虑将帧保存为视频文件。解释here

评论后编辑:

这就是您可以使用time.time() 的方式。首先在代码顶部导入时间模块。 time.time() 返回自 January 1, 1970, 00:00:00 以来的秒数。 因此,要获得时间戳,您必须存储开始时间 - 程序/视频开始运行的时间。
然后,在每一帧上,您调用 time.time() 并减去开始时间。结果是您的程序/视频运行的时间。您可以将该值用作时间戳。

import time

starttime = time.time()

# get frame
timestamp = time.time() - starttime
cv2.putText(frame,timestamp,(10,500), font, 4,(255,255,255),2,cv2.CV_AA)

【讨论】:

  • 我想保存框架以便在其上写入时间戳,或者以时间戳作为名称保存图像。我试图在 cv2.putText() 函数中通过 time.time() 函数添加时间戳,它只是在每一帧上写入 time.time() 而不是时间戳。字体 = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame,'time.time()',(10,500), 字体, 4,(255,255,255),2,cv2.CV_AA)。我还尝试使用 time.time() 代替 cv2.imwrite() 函数的图像名称,并且它也没有添加时间戳。 cv2.imwrite('time.time()'+str(i)+'.jpg',frame)
  • 你不应该把它放在引号里。它是一个函数,而不是一个字符串。我修改了答案,向您展示如何使用 time.time()
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 2018-05-24
  • 2020-03-17
  • 1970-01-01
  • 2019-02-09
  • 2021-08-25
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多