我试图用OpenCV将提取出来的帧从深流管道保存到视频,但我最终得到的只是一个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()
不幸的是,生成的文件不是有效的视频文件。在这个过程中,我做错了什么吗?任何帮助都将不胜感激。
如果我试图将帧保存为while循环中的图像,只需测试帧是否已正确地存储在队列中:
cv2.imwrite(dest_folder + '/' + f'tmp{total_frames}.png', frame)
我得到了正确的保存和有效的png图像。
当被缓冲时,P.S. 2帧具有output_width, output_height
的分辨率。而且,在保存cv2.resize
之前尝试执行这些操作并不会改变任何事情。
发布于 2022-06-03 17:37:59
我不能测试它,但是常见的错误是人们思考而不是代码
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 ]
https://stackoverflow.com/questions/72493007
复制相似问题