Mat frame, frame_split[3];
VideoWriter 8_bit_vid,16_bit_vid;
//for lossless, use 'F''F''V''1', for lossy with good compression, //'X''2''6''4'
//For 8bit writing
8_bit_vid.open("8_bit_video.avi",('F','F','V','1'),30,[rows,cols],true);
frame_split[0]= Mat Red_channel([rows,cols],CV8_UC1);
frame_split[1]= Mat Green_channel([rows,cols],CV8_UC1);
frame_split[2]= Mat Blue_channel([rows,cols],CV8_UC1);
merge(frame_split,3,frame);
8_bit_vid.write(frame);
8_bit_vid.release();
//For 16bit writing
16_bit_vid.open("16_bit_video.avi",('F','F','V','1'),30,[rows,cols],true);
frame_split[0]= Mat Red_channel([rows,cols],CV16_UC1);
frame_split[1]= Mat Green_channel([rows,cols],CV16_UC1);
frame_split[2]= Mat Blue_channel([rows,cols],CV16_UC1);
merge(frame_split,3,frame);
16_bit_vid.write(frame);
16_bit_vid.release();
5条答案
按热度按时间b4lqfgs41#
我不知道一个支持16位灰度图像的编解码器,但我只使用OpenCV
ffmpeg
支持,所以我可能是错的。This thread似乎支持我的理论,ffmpeg
不做16位视频(有一个消息说它做,但无法访问)。rlcwz9us2#
使用简单的文件I/O操作写入原始图像数据而不进行压缩或格式化如何?我相信这将给予您想要的任何位图像文件:)
9gm1akwq3#
OpenCV应该支持16位FFMPEG作为#12284的一部分。
https://github.com/opencv/opencv/pull/12284
希望这有帮助
93ze6v8z4#
一个解决方案是同时录制两个8位灰度视频。第一个可以使用16位数字的前8位作为像素,另一个使用最后8位。
另一种选择是记录彩色图像,并以类似的方式将蓝色通道设置为前8位,将绿色通道设置为后8位。您可以忽略红色通道,也可以将其设置为0。
然后,您可以同步播放双色或单色视频,并将其操作回原始的16位视频。
xienkqul5#
从OpenCV 4.7.0开始,
VideoWriter
支持16位灰度视频。带有一些典型参数的VideoWriter定义的简短C++示例:
如果你正在寻找一个有更多解释的Python替代方案,请参阅这个答案。