编辑
2025-11-22
C#
00

目录

概述
环境准备
NuGet 包安装
引用命名空间
热成像效果核心实现
热成像风格枚举
热成像特效处理类
使用示例
结论

概述

热成像(Thermal Imaging)效果可以模拟红外线或热感应视觉,为视频添加独特的科技感和视觉冲击力。本文将深入探讨如何使用 Xabe.FFmpeg 实现多种热成像特效。

环境准备

NuGet 包安装

Bash
Install-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}"); } } } }

image.png

image.png

结论

  • 不同的热成像风格通过调整 lutyuvcolorchannelmixereq 等滤镜实现
  • 复杂的热成像效果可以通过组合多个滤镜实现
  • 建议在实际应用中根据具体需求微调参数

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!