我试图从Kinect传感器存储多个来源(颜色,深度和红外线)的视频文件。
我使用cv2.imshow命令可视化的This is the image,使用以下代码:
cv2.imshow("ir", ir / 65535.)
cv2.imshow("depth", depth / 4500.)
cv2.imshow("color", color)
IR和depth都是大小为(height, width)
,float32
的数组。Color是大小为(height, width, 3)
的数组,其中3是RGB通道,uint8
的类型为0-255。由于IR和depth的值很大,我们需要使用上面的代码对其进行归一化。此代码给出了上面的数字。
现在我想把一系列图像数组存储为视频文件。我使用以下代码:
ir_video = cv2.VideoWriter('ir.mp4', cv2.VideoWriter_fourcc(*'MP42'), fps, (height, width), False)
depth_video = cv2.VideoWriter('depth.mp4', cv2.VideoWriter_fourcc(*'MP42'), fps, (height, width), False)
color_video = cv2.VideoWriter('color.mp4', cv2.VideoWriter_fourcc(*'MP42'), fps, (height, width), True)
for ir, depth, color in zip(ir_frames, depth_frames, color_frames):
ir_video.write(ir / 65535.)
depth_video.write(depth / 4500.)
color_video.write(color)
ir_video.release()
depth_video.release()
color_video.release()
彩色视频工作得很好,看起来非常类似于cv2.imshow
命令。然而,红外和深度视频被损坏。所有0 kb。我试图将fourcc代码更改为cv2.VideoWriter_fourcc(*'mp4v')
。这次红外保存了一个我可以播放的视频。但它与cv2.imshow
结果非常不同。它显示为here。
我想知道我如何才能正确地保存的结果与cv2.imshow
命令。什么fourcc代码应该使用?谢谢!
3条答案
按热度按时间niknxzdl1#
从OpenCV 4.7.0开始,可以编写16位深度的视频,请参阅pull request which added support for it。
对于
VideoWriter
,您必须:CAP_FFMPEG
,因为目前似乎只支持FFmpegFFV1
编解码器{VIDEOWRITER_PROP_DEPTH, CV_16U, VIDEOWRITER_PROP_IS_COLOR, false}
指定为 params对于
VideoCapture
(阅读),您必须:CAP_FFMPEG
{CAP_PROP_CONVERT_RGB, false}
指定为 params请注意,这将在控制台上打印类似“VIDEOIO/FFMPEG:BGR转换已关闭...”的警告。
不过,这似乎有一些限制,请参阅拉取请求的描述。
该pull请求还添加了一个包含
VideoWriter
和VideoCapture
往返的单元测试。62o28rlo2#
问题注解中提供的解决方案将图像数据从
float32
转换为uint8
,这足以正确保存视频。然而,由于uint8
只能表示256个值,因此丢失了大量信息。这也是源数据(IR和深度)是float32
,而不是彩色图像的uint8
-当保存为uint8
时会丢失大量信息。因此,我提出了一个解决方案,将视频保存为uint16
,并使用问题作者使用的VideoWriter
。首先,需要将值从
float32
转换为uint16
(范围0- 65,535)。根据作者的代码,IR图像似乎已经落在该范围内,因此仅需要转换为uint16
。然而,深度图像必须从其原始范围0-4进行归一化,500到uint16
范围。这段代码应该放在作者提供的for循环中,在write
方法之前。@Marcono1234 provided an idea如何用
OpenCV
VideoWriter保存视频(从4.7.0版开始)但没有提供Python代码。我发现正确编程并不容易,所以我提供了一个从网络摄像头阅读图像的完整工作示例,将其转换为16位深度的单色图像并保存为这样。运行录制视频并使用键盘字母q
停止录制。最重要的部分是显然是VideoWriter的定义。为了使示例完整,您还需要以某种方式读取视频。这里再次显示了一个完整的
OpenCV
VideoCapture示例,其中包含单色16位深度视频。请注意,由于16位深度单声道视频的
FFV1
编码还不太常见,因此制作的视频可能无法在每个视频播放器上播放。VLC media player
有这个discussed,并支持since version 3.0.18,当它发布时,一些改进也可能是come in version 4.0。yshpjwxd3#
我曾在一个类似的项目使用其他深度相机(Orbec,华硕Xtion)和afaik videowriter类的OpenCV不支持16位深度图像,这就是为什么在评论中建议你应该转换为8位.你可以看看这里我是用什么来保存这样的视频(这是关于使用OpenNI 2,但主要概念是存在的).