使用OpenCV写入16位视频

时间:2012-02-16 15:45:28

标签: opencv

也许这有点显而易见,但我还是新手... ^^“

我使用OpenCV将一些图像保存到视频文件中。我有16位灰度图像,我发现cvWriteFrame只能处理8位图像。由于我需要稍后在另一个环境中处理视频,为此我无法承受信息丢失,我正试图找到一种方法将我的16位图像保存到视频中。

我尝试了this文档中的每个CV_FOURCC。但我不确定它是否真的是一个编解码器问题。

PS:我知道可以将它们保存为单独的16位图像文件,但我发现视频解决方案更清洁。

4 个答案:

答案 0 :(得分:1)

我不知道支持16位灰度图像的编解码器,但我只使用OpenCV ffmpeg支持,所以我可能错了。 This thread似乎支持我的理论ffmpeg不做16位视频(有一条消息说它确实存在,但无法访问)。

答案 1 :(得分:1)

如何使用简单的文件I / O操作在不压缩或格式化的情况下编写原始图像数据?我相信这会给你想要的任何位图像文件:)

答案 2 :(得分:0)

OPencv应该在#12284中支持16位FFMPEG。

https://github.com/opencv/opencv/pull/12284

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();

希望这会有所帮助

答案 3 :(得分:0)

一种解决方法是同时录制两个8位灰度视频。第一个可以使用16位数字的前8位作为像素,另一个可以使用后8位。

另一个选择是记录彩色图像,并以类似的方式将蓝色通道设置为前8位,将绿色通道设置为后8位。您可以忽略红色通道,也可以将其设置为0。

然后,您可以同步播放两个或单个彩色视频,并将它们处理回原始16位视频。