使用OpenCV编写16位视频

zi8p0yeb  于 2023-10-24  发布在  其他
关注(0)|答案(5)|浏览(160)

也许这是显而易见的,但我仍然是一个新手...... ^^”
我使用OpenCV将一些图像保存到视频文件中。我有16位灰度图像,我发现cvWriteFrame只能处理8位图像。由于我需要在另一个上下文中处理视频,为此我不能承受信息丢失,我正在试图找到一种方法将16位图像保存到视频中。
我尝试了this文档中的每个CV_FOURCC。但我不确定这是否真的是编解码器的问题。
附言:我知道这是可能的保存他们作为单独的16位图像文件,但我发现视频解决方案清洁。

b4lqfgs4

b4lqfgs41#

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

rlcwz9us

rlcwz9us2#

使用简单的文件I/O操作写入原始图像数据而不进行压缩或格式化如何?我相信这将给予您想要的任何位图像文件:)

9gm1akwq

9gm1akwq3#

OpenCV应该支持16位FFMPEG作为#12284的一部分。
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();

希望这有帮助

93ze6v8z

93ze6v8z4#

一个解决方案是同时录制两个8位灰度视频。第一个可以使用16位数字的前8位作为像素,另一个使用最后8位。
另一种选择是记录彩色图像,并以类似的方式将蓝色通道设置为前8位,将绿色通道设置为后8位。您可以忽略红色通道,也可以将其设置为0。
然后,您可以同步播放双色或单色视频,并将其操作回原始的16位视频。

xienkqul

xienkqul5#

从OpenCV 4.7.0开始,VideoWriter支持16位灰度视频。
带有一些典型参数的VideoWriter定义的简短C++示例:

VideoWriter video;
Size frameSize = Size(1920, 1080);
double fps = 25.0;
video.open("video.mkv", cv::CAP_FFMPEG, VideoWriter::fourcc('F', 'F', 'V', '1'), fps, frameSize, {VIDEOWRITER_PROP_DEPTH, CV_16UC1, VIDEOWRITER_PROP_IS_COLOR, false});

如果你正在寻找一个有更多解释的Python替代方案,请参阅这个答案。

相关问题