首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用OpenCV将从深流管道提取的帧保存到视频

使用OpenCV将从深流管道提取的帧保存到视频
EN

Stack Overflow用户
提问于 2022-06-03 17:08:44
回答 1查看 869关注 0票数 1

我试图用OpenCV将提取出来的帧从深流管道保存到视频,但我最终得到的只是一个9KB的文件。

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

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
frame_buffer.put(frame_copy)

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

代码语言:javascript
运行
复制
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()

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

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

代码语言:javascript
运行
复制
cv2.imwrite(dest_folder + '/' + f'tmp{total_frames}.png', frame)

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

当被缓冲时,P.S. 2帧具有output_width, output_height的分辨率。而且,在保存cv2.resize之前尝试执行这些操作并不会改变任何事情。

EN

Stack Overflow用户

回答已采纳

发布于 2022-06-03 17:37:59

我不能测试它,但是常见的错误是人们思考而不是代码

代码语言:javascript
运行
复制
out = cv2.VideoWriter('out.avi', codec, fps, (output_width, output_height))

将自动将帧大小调整为(output_width, output_height)大小,但不正确。

你必须手动调整帧的大小。

如果您不这样做,那么Writer将跳过框架,您将得到破碎的文件-没有帧。

代码语言:javascript
运行
复制
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进行转换。

代码语言:javascript
运行
复制
frame_copy = cv2.cvtColor(frame_copy, cv2.COLOR_RGBA2BGR)

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

代码语言:javascript
运行
复制
frame_copy = frame_copy[ : , : , :3 ]
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72493007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档