HDR(High Dynamic Range)视频指的是具有高动态范围的视频,与普通的SDR(Standard Dynamic Range)视频相比,画面具有更高的亮度,并能保留更多的细节。HDR视频目前主要有三种标准,分别是HDR10 HDR10+和Dolby Vision(杜比视界),这三种标准的对比如下图所示
可以看到HDR10和HDR10+都采用了10bit的位深,而杜比视界采用了12bit的位深。一般来讲,位深越大,色彩表现越细腻。
从视频的数据格式上来讲,除了HLG格式的HDR视频以外,其他三个视频标准都包含了元数据(如视频的色域、平均亮度、最大亮度等信息)。简单来说,这两个数据都是用来在视频播放的过程中告诉播放器应该如何对画面进行渲染的,但是在抽帧时无法保留,这也是抽出的视频帧和视频渲染后的效果不一致的主要原因。
一般使用 ffmpeg 直接进行抽帧的话会导致画面发灰,如下图所示
抽帧使用的命令是
ffmpeg -i input.mp4 -f image2 -vf fps=fps=1/1 -qscale:v 2 ./data/output-%05d.png
那么为了避免这种抽帧造成的显示效果的损失,我们就需要在抽帧后对帧进行Tone mapping操作。
OpenEXR,或简称为exr格式,是一种开放标准的高动态范围图像格式,在计算机图形学里被广泛用于存储图像数据,但也可以存储一些后期合成处理所需的数据。OpenEXR最早由工业光魔开发,并在一个类似BSD许可证的自由软件许可证下发布,其发布的软件包里带有一些处理exr图像格式的工具。
这种格式最大的好处是可以通过Tone mapping使得通过配套软件显示的视频帧比直接用默认图片显示软件显示的视频帧更贴近视频播放时的渲染效果。但这种效果某种意义上是一种滤镜。
若想对HDR视频进行抽帧,首先要将mkv格式的视频转成yuv格式,yuv除了是一种视频的格式外,还是一种表示视频色彩的方式,与RGB是同类概念,感兴趣的读者可以自己研究下,常见的有444 422 420等制式,大部分视频使用的是yuv420,以获得一个相对较小的体积。
扯远了,说回来,将mkv转成yuv格式可以使用 ffmpeg 进行转换,命令如下
ffmpeg -i 10bit.mkv -c:v rawvideo -pix_fmt yuv420p10le 10bit.yuv
在获得了yuv格式的视频后,使用 HDRTools 中的 HDRConvert 工具抽帧。HDRConvert是一个exe文件,需要对仓库中的源代码进行编译得到,编译的方法在仓库的readme文件中有。
这里推荐一个在Windows系统下使用Linux命令的工具:Cygwin。安装教程在这里。需要注意的是,在安装好以后,可能还需要安装微软的Visual Studio来获得compiler,另外如果想使用cmake和make命令,除了他们本身以外还有一些依赖的包,下面的截图是我安装的包,除此以外,我还安装了VS2019,选的是C++桌面应用开发。
完成这些准备工作后,就可以按照仓库中的tutorial进行编译安装了。
git clone https://gitlab.com/standards/HDRTools.git
cd HDRTools
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
安装好以后,可以在你安装 cygwin 的目录下找到编译好的 exe 程序。
在Cygwin中进入对应的目录,使用命令./HDRConvert.exe -H
可以查看帮助信息(记得尽量把窗口全屏,否则会有反人类的换行)
帮助信息中给出了使用示例,我们注意到有个配置文件要放在同一目录下。这个配置文件在上上级目录的cfg文件夹下。
提供了许多配置文件,配置文件的内容可以根据自己的任务进行修改(使用记事本软件打开)。
修改完成后,和exe程序放在统一目录下,用 HDRConvert.exe -f HDRConvertToEXR.cfg -p params=value
启动任务,得到exr文件。
在 Windows 系统下没有默认的打开exr文件的软件(mac用户可以直接打开,但效果比较差),因此要安装一个可以查看exr文件的软件。可以用Picturenaut查看.exr文件,此软件支持Tone Mapping(即将HDR图像映射为8bitSDR图像),可以提供HDR2SDR的预览结果。
这个软件就跟普通的应用一样有安装向导了(舒服的一匹)。
用软件打开文件后效果大概是这样,有点过曝
莫慌,按住 ctrl+t 进行一下tone mapping
就好起来了。
HDR视频抽帧真是个不小的挑战,百度谷歌了一大圈没有找到合适的方案,最后给一篇论文的作者发邮件,作者非常耐心地解决了我一个研零小白的很多问题,让我对HDR视频的处理有了新的认识,真的是非常感谢他。这里把我学到的方案分享出来,希望能帮后来的大家节省一些时间。(编者按:这篇文章写于2021年9月,在22年4月看来主要是解决了HDR视频抽帧后如何在电脑上尽量正常的显示的问题,对一些问题的理解也非常浅,对于数据集的制备其实帮助有限。对于数据集制备的问题先挖个坑,后期研究好相关问题后另写一篇)