【问题标题】:How to debayer bmp image with FFMpeg? (.exe file)如何使用 FFMpeg 去拜耳 bmp 图像? (.exe 文件)
【发布时间】:2021-08-07 18:53:48
【问题描述】:

我有一张拜耳图像 .bmp 我想用 FFMpeg 去拜耳,我认为 FFMpeg 可能知道默认去拜耳,所以我尝试使用这样一个非常简单的查询

ffmpeg -i input.bmp output.png

output.png 看起来是灰色的,所以 ffmpeg 不会自动应用 debayer。我试图弄清楚是否可以使用 ffmpeg,但在 google 上几乎没有。

图片示例(这里上传太大):https://drive.google.com/file/d/1V8HwOuIo9PBX3ix0eKFQFGimskU_H0mN/view?usp=sharing

怎么做?

UPD

这就是我尝试做的事情

ffmpeg -y -i D:\Buffer\Bayer\Time0000000_img.bmp -pix_fmt gray D:\Buffer\Bayer\bmp\test11.y -hide_banner
ffmpeg -y -pixel_format bayer_rggb8 -video_size 4104x3006 -i D:\Buffer\Bayer\bmp\test11.y D:\Buffer\Bayer\bmp\result1.png -hide_banner

我得到一个错误

Input #0, image2, from 'D:\Buffer\Bayer\bmp\test11.y':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 1013196 kb/s
    Stream #0:0: Video: rawvideo ([186]RG[8] / 0x84752BA), bayer_rggb8, 4104x3006, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> png (native))
Press [q] to stop, [?] for help
[rawvideo @ 0000027da39d3f80] Invalid buffer size, packet size 5065984 < expected frame_size 12336624
Error while decoding stream #0:0: Invalid argument
Output #0, image2, to 'D:\Buffer\Bayer\bmp\result1.png':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Video: png, rgb24, 4104x3006, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.54.100 png
frame=    0 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed=   0x
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)
Conversion failed!

如果我像这样将分辨率更改为1920x1080

ffmpeg -y -pixel_format bayer_rggb8 -video_size 1920x1080 -i D:\Buffer\Bayer\bmp\test11.y D:\Buffer\Bayer\bmp\result1.png -hide_banner

我没有收到错误,但输出错误

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    FFmpeg 似乎没有 Debayer 过滤器。
    唯一记录在案的选项是选择 Bayer 作为输入像素格式。

    我找到了执行FFmpeg两次的解决方案:

    • 从 BMP 转换为原始拜耳:

       ffmpeg -y -i Time0000005_img.bmp -pix_fmt gray tmp.y
      
    • 从原始拜耳转换为 RGB(德拜耳):

       ffmpeg -y -pixel_format bayer_rggb8 -video_size 4104x3006 -i tmp.y rgb.png
      

    单线解决方案(使用管道):

    ffmpeg -y -i Time0000005_img.bmp -vf format=gray -f rawvideo pipe: | ffmpeg -y -f rawvideo -pixel_format bayer_rggb8 -video_size 4104x3006 -i pipe: rgb.png
    

    您也可以尝试伽玛校正:

    ffmpeg -y -i Time0000005_img.bmp -vf format=gray -f rawvideo pipe: | ffmpeg -y -f rawvideo -pixel_format bayer_rggb8 -video_size 4104x3006 -i pipe: -vf eq=gamma=2.2 rgb.png
    

    注意:
    我手动将video_size 设置为4104x3006
    使用FFprobe 可以自动设置video_size,但这会使解决方案更加复杂。


    结果(伽马校正后)大小调整了 1/10:

    【讨论】:

    • 我在发布之前验证了我的解决方案,它有效。 1. 从您的链接下载 BMP 图像(在某些情况下,图像在上传时会被修改)。 2. 下载最新版本的FFmpeg(我使用的是n4.3.1-221-gd08bcbffff版本)。 3.确保BMP图像的分辨率为4104x3006
    • 我还发现这个查询工作得更快ffmpeg -i D:\Buffer\Bayer\ddd\Time0000005_img.bmp -f rawvideo pipe: | ffmpeg -y -f rawvideo -s 4104x3006 -pix_fmt bayer_rggb8 -i pipe: -pix_fmt rgb24 -frames 1 D:\Buffer\Bayer\bmp\result3.bmp -hide_banner - 你知道什么是差异吗?
    • 我猜(不确定)-frames 1 更快,因为它告诉第二个ffmpeg 只期待一帧。第二个ffmpeg 接收一帧,刷新管道并终止。我想如果没有-frames 1,就有缓冲机制。第二个ffmpeg 等待第一个ffmpeg 终止,然后才刷新管道。
    • 我在图片的工作台上检查了它,它显示给我speed=0.265x,而在第二个实现speed=1.16x但是在我更改了扩展名(在你的实现上)之后.png.bmp 的速度也一样
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2022-01-27
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多