我需要为一个视频应用绿幕滤镜/色键滤镜,将其覆盖在另一个视频上,并输出为新视频。
是否有现成的库、脚本、滤镜或解决方案可供使用?
我需要为一个视频应用绿幕滤镜/色键滤镜,将其覆盖在另一个视频上,并输出为新视频。
是否有现成的库、脚本、滤镜或解决方案可供使用?
现在的答案是肯定的,有一个用于生成色度键并叠加它们的过滤器。该过滤器的名称是“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)控制不透明度的开关或渐变程度。(有关更多信息,请参见文档)。
具有测试数据的最小可运行示例
在https://dev59.com/mWsy5IYBdhLWcg3w0RQ5#32291842上的答案是正确的,这里只是一个具体的最小示例。
下载输入媒体:
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的视频大小。 视频大小可以使用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
在我的例子中,我使用了黑色背景,并将其转换为一个固定的图像。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
我在overlay
滤镜中添加了另一个参数shortest=1
:
overlay=shortest=1
如果想要在三角形视频停止时立即停止叠加层,否则默认会在长得多的 Atlantis 视频结束时停止。您可能还想使用 trim
过滤器来选择任意片段。
Atlantis 视频的分辨率为 1920x1080,最终输出大小也是这个大小。预览:
实际视频:https://www.youtube.com/watch?v=HI8XniA2Bk8
在 Ubuntu 20.10、FFmpeg 4.3.1 上进行了测试。
我不知道有没有特别的方法。
Opencv 包含了你需要读取视频、转换为RGB、分离颜色平面、基于颜色替换像素、合并帧和写入视频的所有函数。
它很适合研究,但不能直接创建一个插件DirectShow过滤器来自动完成这个任务。
在Mathematica中,函数ChanVeseBinarize可能会有所帮助,请参见此处的第一个“应用程序”: http://reference.wolfram.com/mathematica/ref/ChanVeseBinarize.html
对于离线处理,您需要按顺序导入每个图像,处理它,导出叠加图像。最终,您将从所有叠加图像创建新视频。