繁体   English   中英

使用 OpenCV 将从 Deepstream 管道中提取的帧保存到视频中

[英]Save frames extracted from Deepstream pipeline to video using OpenCV

我正在尝试使用 OpenCV 将提取的帧从 Deepstream 管道保存到视频中,但我最终得到的只是一个 9KB 的文件。

这是我的代码(在探测函数中执行):

batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer))
l_frame = batch_meta.frame_meta_list
frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data)
frame = pyds.get_nvds_buf_surface(hash(gst_buffer), frame_meta.batch_id)
frame_copy = np.array(frame, copy=True, order='C')            
frame_copy = cv2.cvtColor(frame_copy, cv2.COLOR_RGBA2BGRA)

每次调用探测函数时都会执行上述代码。 图像保存到队列中:

frame_buffer.put(frame_copy)

在将所需数量的帧推入队列后,我使用以下代码将缓冲的帧保存到视频文件中:

codec = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('out.avi', codec, fps, (output_width, output_height))
out.write(frame_copy)                
total_frames = FRAME_RECORDING_THRESH 

while total_frames > 0:                
   frame = frame_buffer.get() 
   frame = cv2.resize(frame, (output_width, output_height), interpolation = cv2.INTER_LINEAR)  
   out.write(frame)
   total_frames -= 1
                
out.release()

不幸的是,生成的文件不是有效的视频文件。 在上述过程中我做错了吗? 任何帮助将不胜感激。

PS只是为了测试帧是否已正确存储在队列中,如果我尝试将帧保存为while循环中的图像:

cv2.imwrite(dest_folder + '/' + f'tmp{total_frames}.png', frame)

我得到正确保存和有效的 png 图像。

PS 2 帧在缓冲时具有output_width, output_height的分辨率。 此外,在保存之前尝试执行cv2.resize不会改变任何内容。

我无法测试它,但常见的错误是人们认为比代码更重要

out = cv2.VideoWriter('out.avi', codec, fps, (output_width, output_height))

会自动将帧大小调整为大小(output_width, output_height)但事实并非如此。

您必须手动调整框架的大小。

如果你不这样做,那么Writer将跳过帧并且你得到损坏的文件 - 没有帧。

while total_frames > 0:                
   frame = frame_buffer.get() 

   frame = cv2(frame, (output_width, output_height))

   out.write(frame)
   total_frames -= 1

编辑:

似乎问题可以使图像具有透明层A - RGBA - 因为视频不使用A

它需要删除它。

您可以使用cv2.COLOR_RGBA2BGR而不是cv2.COLOR_RGBA2BGRA进行转换

frame_copy = cv2.cvtColor(frame_copy, cv2.COLOR_RGBA2BGR)

或者您可以从numpy.array中删除最后一层

frame_copy = frame_copy[ : , : , :3 ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM