FFMPEG:用于图像/视频的色度键/绿屏滤镜

时间:2011-11-28 16:48:16

标签: image-processing filter ffmpeg video-processing chromakey

我需要一个视频使用色度键过滤器/绿屏过滤器并将其覆盖在另一个视频上并将其作为新视频输出。

是否有用于此目的的现有库,脚本,过滤器或解决方案?

5 个答案:

答案 0 :(得分:29)

我意识到这是一个老问题,但当我搜索ffmpeg chromakey时它仍然会出现在顶部附近。

答案(现在)是肯定的,有一个过滤器用于生成色度键并覆盖它们。过滤器名称为“color key”。网站上有一些例子,这是命令:

ffmpeg -i <base-video> -i <overlay-video> -filter_complex '[1:v]colorkey=0x<color>:<similarity>:<blend>[ckout];[0:v][ckout]overlay[out]' -map '[out]' <output-file>

其中<color>是要以十六进制匹配的rgb颜色(例如:黑色为0x000000),<similarity>是颜色匹配的容差(例如:0.3)和<blend> (例如:0.2)控制不透明度是开 - 关还是渐进。 (有关详细信息,请参阅文档。)

答案 1 :(得分:5)

带有测试数据的最小可运行示例

https://stackoverflow.com/a/32291842/895245 处的答案是正确的,这里只是一个最小的具体示例。

下载输入媒体:

wget https://github.com/cirosantilli/media/raw/master/Ciro_Santilli_with_a_stone_carved_Budai_in_the_Feilai_Feng_caves_near_the_Lingyin_Temple_in_Hangzhou_in_2012.jpg
wget https://github.com/cirosantilli/media/raw/master/opengl-rotating-triangle.mp4

使图像大小与 1024x1024 的视频大小匹配。视频大小可以be determined with ffprobe

convert Ciro_Santilli_with_a_stone_carved_Budai_in_the_Feilai_Feng_caves_near_the_Lingyin_Temple_in_Hangzhou_in_2012.jpg -resize 1024x1024! background.jpg

进行实际转换:

ffmpeg -i background.jpg -i opengl-rotating-triangle.mp4 \
  -filter_complex '[1:v]colorkey=0x000000:0.1:[ckout];[0:v][ckout]overlay[out]' \
  -map '[out]' out.mp4

转换为 gif 只是为了预览这个答案:

ffmpeg -i out.mp4 -r 5 -vf "scale=300:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif

所以在我的例子中,我有一个黑色背景,它被转换成一个固定的图像。

结果预览(可怕的 FPS,适合 2MB 大小的 GIF 供在此处上传):

enter image description here

实际视频输出:https://www.youtube.com/watch?v=3aY6x7u86QQ

原始输入文件供参考:

opengl-rotating-triangle.mp4

enter image description here

Ciro_Santilli_with_a_stone_carved_Budai_in_the_Feilai_Feng_caves_near_the_Lingyin_Temple_in_Hangzhou_in_2012.jpg

enter image description here

它也只适用于视频背景。

wget https://upload.wikimedia.org/wikipedia/commons/f/f9/STS-132_Liftoff_Space_Shuttle_Atlantis.ogv
ffmpeg -i STS-132_Liftoff_Space_Shuttle_Atlantis.ogv -i opengl-rotating-triangle.mp4 -filter_complex '[1:v]colorkey=0x000000:0.1:[ckout];[0:v]trim=start=0:end=8[cut0];[cut0][ckout]overlay[out]' -map '[out]' out.mp4

这里我在 shortest=1 过滤器中添加了另一个参数 overlay

overlay=shortest=1

在三角形视频停止后立即停止叠加,否则在更长的亚特兰蒂斯视频结束时默认停止。

您可能还想改用 trim 过滤器来选择任意段。

亚特兰蒂斯视频是 1920x1080,最终输出也有这个尺寸。预览:

enter image description here

实际视频:https://www.youtube.com/watch?v=HI8XniA2Bk8

在 Ubuntu 20.10、FFmpeg 4.3.1 上测试。

答案 2 :(得分:1)

我并不是特别知道

Opencv包含阅读视频,转换为RGB,分割颜色平面,替换像素基色,合并帧和写视频所需的所有功能。

研究很好,但它不会创建插件directshow过滤器来自动执行此操作

答案 3 :(得分:0)

Mathematica中的函数ChanVeseBinarize可能有所帮助,请在此处查看第一个“应用程序”: http://reference.wolfram.com/mathematica/ref/ChanVeseBinarize.html

对于离线处理,您可以按顺序导入每个图像,处理它,导出叠加层。最后,您将从所有叠加图像中创建新视频。

答案 4 :(得分:0)

This answer对超级用户的类似问题建议使用MLT

来自MLT网站:

  

MLT是一个开源多媒体框架,专为电视广播而设计和开发。它为广播公司,视频编辑,媒体播放器,转码器,网络流媒体以及更多类型的应用程序提供工具包。系统的功能通过各种即用型工具,XML创作组件和基于可扩展插件的API提供。   尝试和学习MLT的最简单方法是下载Shotcut