热成像(Thermal Imaging)效果可以模拟红外线或热感应视觉,为视频添加独特的科技感和视觉冲击力。本文将深入探讨如何使用 Xabe.FFmpeg 实现多种热成像特效。
BashInstall-Package Xabe.FFmpeg
C#using System;
using System.Threading.Tasks;
using Xabe.FFmpeg;
C#public enum ThermalStyle
{
Classic, // 经典红外线
ColdSpectrum, // 冷色谱
HotSpectrum, // 热色谱
NightVision, // 夜视仪
CyberPunk // 赛博朋克风格
}
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xabe.FFmpeg;
namespace App20
{
public class ThermalVideoProcessor
{
/// <summary>
/// 热成像视频处理
/// </summary>
/// <param name="inputPath">输入视频路径</param>
/// <param name="outputPath">输出视频路径</param>
/// <param name="style">热成像风格</param>
/// <returns></returns>
public async Task ApplyThermalEffect(
string inputPath,
string outputPath,
ThermalStyle style = ThermalStyle.Classic)
{
try
{
// 修正后的热成像滤镜
string videoFilter = style switch
{
ThermalStyle.Classic =>
"format=yuv420p," + // 确保颜色空间兼容
"lutyuv=" + // 颜色查表
"y='val*1.2':" + // 注意添加引号
"u='128+val/2':" + // 正确的色度调整
"v='128+val/2'," +
"colorchannelmixer=" + // 色彩混合
"rr=0:rg=0:rb=1:" +
"gr=0:gg=0:gb=0:" +
"br=0:bg=0:bb=0," +
"eq=contrast=1.2:brightness=0.1",
ThermalStyle.ColdSpectrum =>
"format=yuv420p," +
"lutyuv=" +
"y='val*1.1':" +
"u='val*1.3':" +
"v='val*0.7'," +
"colorchannelmixer=" +
"rr=0:rg=0:rb=1:" +
"gr=0:gg=1:gb=0:" +
"br=1:bg=0:bb=0," +
"eq=contrast=1.3:brightness=-0.1:saturation=1.5",
ThermalStyle.HotSpectrum =>
"format=yuv420p," +
"lutyuv=" +
"y='val*1.3':" +
"u='val*0.7':" +
"v='val*1.2'," +
"colorchannelmixer=" +
"rr=1:rg=0:rb=0:" +
"gr=0:gg=0:gb=1:" +
"br=0:bg=1:bb=0," +
"eq=contrast=1.4:brightness=0.2:saturation=1.8",
ThermalStyle.NightVision =>
"format=yuv420p," +
"lutyuv=" +
"y='val*1.5':" +
"u='128+val/2':" +
"v='128-val/2'," +
"colorchannelmixer=" +
"rr=0:rg=1:rb=0:" +
"gr=0:gg=0:gb=1:" +
"br=1:bg=0:bb=0," +
"eq=contrast=1.5:brightness=0:gamma=0.8:saturation=1.2," +
"noise=alls=20:allf=t+u",
ThermalStyle.CyberPunk =>
"format=yuv420p," +
"lutyuv=" +
"y='val*1.4':" +
"u='val*1.2':" +
"v='val*0.8'," +
"colorchannelmixer=" +
"rr=1:rg=0:rb=1:" +
"gr=0:gg=1:gb=1:" +
"br=1:bg=1:bb=0," +
"eq=contrast=1.6:brightness=0.1:saturation=2.0," +
"gblur=sigma=0.5",
_ => throw new ArgumentException("无效的热成像风格")
};
// 转换方法保持不变
var conversion = FFmpeg.Conversions.New()
.AddParameter($"-i \"{inputPath}\"")
.AddParameter("-vf")
.AddParameter($"\"{videoFilter}\"")
.AddParameter("-c:v")
.AddParameter("libx264")
.AddParameter("-preset")
.AddParameter("medium")
.AddParameter("-crf")
.AddParameter("23")
.AddParameter("-c:a")
.AddParameter("copy")
.SetOutput(outputPath);
// 执行转换
IConversionResult result = await conversion.Start();
Console.WriteLine($"热成像特效处理完成:{style} 风格");
}
catch (Exception ex)
{
Console.WriteLine($"热成像处理错误: {ex.Message}");
Console.WriteLine($"详细异常: {ex.StackTrace}");
}
}
/// <summary>
/// 动态热成像效果
/// </summary>
public async Task DynamicThermalEffect(
string inputPath,
string outputPath)
{
string complexFilter =
// 分割输入流
"split[original][thermal];" +
// 热成像处理
"[thermal]lutyuv=y=val*1.3:" +
"u=val*1.2:v=val*0.8," +
"colorchannelmixer=rr=1:rg=0:rb=1:" +
"gr=0:gg=1:gb=1:" +
"br=1:bg=1:bb=0," +
"eq=contrast=1.6:brightness=0.1:" +
"saturation=2.0," +
"gblur=sigma=0.5," +
"colorwave=0.5[thermalEffect];" +
// 混合原始视频和热成像效果
"[original][thermalEffect]blend=all_mode=overlay:all_opacity=0.6";
var conversion = FFmpeg.Conversions.New()
.AddParameter($"-i \"{inputPath}\"")
.AddParameter("-filter_complex")
.AddParameter($"\"{complexFilter}\"")
.AddParameter("-c:v")
.AddParameter("libx264")
.AddParameter("-preset")
.AddParameter("slow")
.AddParameter("-crf")
.AddParameter("20")
.AddParameter("-c:a")
.AddParameter("copy")
.SetOutput(outputPath);
await conversion.Start();
}
/// <summary>
/// 热点追踪效果
/// </summary>
public async Task HotspotTrackingEffect(
string inputPath,
string outputPath)
{
string complexFilter =
// 分割输入流
"split[original][hotspot];" +
// 热点处理
"[hotspot]scale=iw/2:ih/2," + // 缩小处理
"gblur=sigma=5," + // 高斯模糊
"colorchannelmixer=rr=1:rg=0:rb=0:" + // 红色通道增强
"gr=0:gg=0:gb=0:" +
"br=0:bg=0:bb=0," +
"eq=contrast=1.5:brightness=0.2," +
"threshold=0.1[hotspotMask];" + // 阈值处理
// 混合原始视频和热点遮罩
"[original][hotspotMask]blend=all_mode=screen:all_opacity=0.7";
var conversion = FFmpeg.Conversions.New()
.AddParameter($"-i \"{inputPath}\"")
.AddParameter("-filter_complex")
.AddParameter($"\"{complexFilter}\"")
.AddParameter("-c:v")
.AddParameter("libx264")
.AddParameter("-preset")
.AddParameter("slow")
.AddParameter("-crf")
.AddParameter("20")
.AddParameter("-c:a")
.AddParameter("copy")
.SetOutput(outputPath);
await conversion.Start();
}
}
}
C#using Xabe.FFmpeg;
namespace App20
{
public enum ThermalStyle
{
Classic, // 经典红外线
ColdSpectrum, // 冷色谱
HotSpectrum, // 热色谱
NightVision, // 夜视仪
CyberPunk // 赛博朋克风格
}
internal class Program
{
static async Task Main(string[] args)
{
// 设置FFmpeg路径(如果非标准安装)
FFmpeg.SetExecutablesPath("D:\\Software\\ffmpeg-master-latest-win64-gpl-shared\\bin");
var thermalProcessor = new ThermalVideoProcessor();
try
{
// 经典热成像
await thermalProcessor.ApplyThermalEffect(
@"D:\video\1.mp4",
@"D:\classic_thermal.mp4",
ThermalStyle.Classic
);
//// 赛博朋克风格
//await thermalProcessor.ApplyThermalEffect(
// @"D:\input_video.mp4",
// @"D:\cyberpunk_thermal.mp4",
// ThermalStyle.CyberPunk
//);
//// 动态热成像
//await thermalProcessor.DynamicThermalEffect(
// @"D:\input_video.mp4",
// @"D:\dynamic_thermal.mp4"
//);
//// 热点追踪
//await thermalProcessor.HotspotTrackingEffect(
// @"D:\input_video.mp4",
// @"D:\hotspot_thermal.mp4"
//);
}
catch (Exception ex)
{
Console.WriteLine($"处理失败: {ex.Message}");
}
}
}
}


lutyuv、colorchannelmixer 和 eq 等滤镜实现本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!