针对界面显示的优化
This commit is contained in:
@@ -1,40 +1,65 @@
|
||||
using OpenCvSharp;
|
||||
using SHH.CameraSdk;
|
||||
|
||||
namespace SHH.CameraSdk.Core.Services
|
||||
public class ImageEnhanceCluster : BaseFrameProcessor<EnhanceWorker>
|
||||
{
|
||||
/// <summary>
|
||||
/// [图像增亮服务]
|
||||
/// 实现:对流水线中的 TargetMat 执行像素级亮度提升
|
||||
/// </summary>
|
||||
public class ImageEnhanceCluster : BaseFrameProcessor<EnhanceWorker>
|
||||
public ImageEnhanceCluster(int count, ProcessingConfigManager configManager)
|
||||
: base(count, "EnhanceCluster", configManager)
|
||||
{
|
||||
public ImageEnhanceCluster(int count) : base(count, "EnhanceCluster") { }
|
||||
|
||||
protected override EnhanceWorker CreateWorker(int id) => new EnhanceWorker(this);
|
||||
}
|
||||
|
||||
public class EnhanceWorker : BaseWorker
|
||||
protected override EnhanceWorker CreateWorker(int id) => new EnhanceWorker(this, _configManager);
|
||||
}
|
||||
|
||||
public class EnhanceWorker : BaseWorker
|
||||
{
|
||||
private readonly ImageEnhanceCluster _parent;
|
||||
private readonly ProcessingConfigManager _configManager;
|
||||
|
||||
public EnhanceWorker(ImageEnhanceCluster parent, ProcessingConfigManager configManager)
|
||||
{
|
||||
private readonly ImageEnhanceCluster _parent;
|
||||
public EnhanceWorker(ImageEnhanceCluster parent) => _parent = parent;
|
||||
_parent = parent;
|
||||
_configManager = configManager;
|
||||
}
|
||||
|
||||
protected override void PerformAction(SmartFrame frame, FrameDecision decision)
|
||||
protected override void PerformAction(long deviceId, SmartFrame frame, FrameDecision decision)
|
||||
{
|
||||
// 1. 获取配置
|
||||
var options = _configManager.GetOptions(deviceId);
|
||||
|
||||
// 2. 检查开关:如果没开启增强,直接跳过
|
||||
if (!options.EnableEnhance) return;
|
||||
|
||||
// 3. 确定操作对象
|
||||
// 策略:如果上一站生成了 TargetMat (缩放图),我们处理缩放图;
|
||||
// 如果没有 (例如缩放被禁用),我们是否要处理原图?
|
||||
// 通常 UI 预览场景下,如果不缩放,直接处理 4K 原图会非常卡。
|
||||
// 建议:仅当 TargetMat 存在时处理,或者强制 clone 一份原图作为 TargetMat
|
||||
|
||||
Mat srcMat = frame.TargetMat;
|
||||
bool createdNew = false;
|
||||
|
||||
// 如果没有 TargetMat (上一站透传了),但开启了增亮
|
||||
// 我们必须基于原图生成一个 TargetMat,否则下游 UI 拿不到处理结果
|
||||
if (srcMat == null || srcMat.IsDisposed)
|
||||
{
|
||||
// 业务逻辑:只处理已经过缩放的 TargetMat
|
||||
if (frame.TargetMat != null && !frame.TargetMat.IsDisposed)
|
||||
{
|
||||
Mat brightMat = new Mat();
|
||||
// 亮度线性提升:原像素 * 1.0 + 30 偏移量
|
||||
frame.TargetMat.ConvertTo(brightMat, -1, 1.0, 30);
|
||||
|
||||
// 替换掉原来的 TargetMat(旧的会在 AttachTarget 内部被自动 Dispose)
|
||||
frame.AttachTarget(brightMat, frame.ScaleType);
|
||||
}
|
||||
// 注意:处理 4K 原图非常耗时,生产环境建议这里做个限制
|
||||
srcMat = frame.InternalMat;
|
||||
createdNew = true; // 标记我们需要 Attach 新的
|
||||
}
|
||||
|
||||
protected override void NotifyFinished(long did, SmartFrame frame, FrameDecision dec)
|
||||
{
|
||||
_parent.PassToNext(did, frame, dec);
|
||||
}
|
||||
// 4. 执行增亮
|
||||
Mat brightMat = new Mat();
|
||||
// Alpha=1.0, Beta=配置值
|
||||
srcMat.ConvertTo(brightMat, -1, 1.0, options.BrightnessLevel);
|
||||
|
||||
// 5. 挂载结果
|
||||
// 这会自动释放上一站生成的旧 TargetMat (如果存在)
|
||||
frame.AttachTarget(brightMat, frame.ScaleType);
|
||||
}
|
||||
|
||||
protected override void NotifyFinished(long did, SmartFrame frame, FrameDecision dec)
|
||||
{
|
||||
_parent.PassToNext(did, frame, dec);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user