9.9 KiB
9.9 KiB
MAG160C 热像仪渲染项目交接 - 2026-08-11
项目目录: C:\Project\MAG160C
目标: 修复 csdk\tools\mag160c_demo3.c 的移动物体鬼影,同时不要破坏当前已经修好的画面问题。
1. 当前结论先说
- 黑洞问题已经基本消失。
- 固定遮蔽问题已经消失。
- 最高温点显示黑色的问题已经修掉。
- 当前主要剩余问题: 移动物体会留下鬼影,尤其是“小温差鬼影”擦除很慢。
- 官方 SDK 自己也存在类似“旧位置偏暗/偏黑”的残影,不是 demo3 独有问题。
- 现在最需要做的是: 在不破坏现有稳定画面的前提下,只针对“目标离开后的小残影”加速擦除。
2. 设备与构建
- 设备: MAG160C, 160x120, USB, VID
0x833C - 官方 SDK:
CoreSDKLib.dll - 当前主程序:
C:\Project\MAG160C\csdk\tools\mag160c_demo3.c - 输出程序:
C:\Project\MAG160C\build-artifacts\mag160c_demo3.exe
编译命令:
gcc -O2 -w -DMAG160C_STATIC -I"C:\Project\MAG160C\csdk\third_party\libusb\win64" -I"C:\Project\MAG160C\csdk\include" -I"C:\Project\MAG160C\csdk\src" -o "C:\Project\MAG160C\build-artifacts\mag160c_demo3.exe" "C:\Project\MAG160C\csdk\tools\mag160c_demo3.c" "C:\Project\MAG160C\csdk\src\mag160c_display.c" "C:\Project\MAG160C\csdk\src\mag160c_error.c" "C:\Project\MAG160C\csdk\third_party\libusb\win64\libusb-1.0.x64.a" -lgdi32 -luser32
重启命令:
Stop-Process -Name mag160c_demo3 -Force -ErrorAction SilentlyContinue
Start-Process "C:\Project\MAG160C\build-artifacts\mag160c_demo3.exe" -WorkingDirectory "C:\Project\MAG160C\build-artifacts"
日志与抓图:
demo3_diag.txtdemo3_auto_*.bmp
官方抓帧:
C:\Project\MAG160C\build-artifacts\tsdk_pair2.exe C:\Project\MAG160C\analysis\pairs_move 12 6000
注意:
- 跑
tsdk_pair2.exe前要先停demo3 - 如果报
no channel,通常要重插 USB - 这个工具默认要给官方 SDK 几秒初始化时间,
6000ms延时是成功过的
3. 官方渲染管线逆向结论
已验证主链路:
USB帧(type=0)
-> 平滑器 0x41f10 (模式1: 首帧 memcpy + EMA)
-> f20 (dev+0x41f20)
-> NUC查表 0x180017200
-> 输出到 dev+0x270
-> 窗口 hi/lo (dev+0x4202c / 0x42030)
-> gray (dev+0x220, 320x240)
-> palette 256
-> RGB
NUC 查表 0x180017200 已确认:
d2 = (f20 - ref) >> 1- 段阈值在
dev+0x41858 - gain/off 表在
dev+0x41870 shift = 12- 输出 clamp 到
[0, 65535]
参考帧 ref:
- 来自平滑器
0x41ee0 - 启动早期采集几帧后冻结
- FFC 后只做全局偏移,不重新采集整帧 ref
ref和live/f20同源 mura,能很好抵消固定纹理
FFC:
- 周期约
1800帧,也就是约120s - 或者传感器温差变化超过阈值时触发
FFC(0)后约9帧再FFC(1)type=1期间官方会冻结画面
关键逆向修正:
- 原来以为
0x180017330是整帧 3x3 平滑,这是错的 - 现在确认它更像“盲元/坏点补偿”,不是全帧模糊
- 所以 demo3 里已经去掉“整帧 3x3 blur”这条错误路径
4. 已经修好的问题
4.1 颗粒重
- 原因: NUC 斜率过大
- 修复:
NUC_GAIN=19
4.2 FFC 后颜色跳变
- 原因: FFC(1) 后重采集 ref,把场景吸进参考
- 修复:
REF_REINIT_AFTER_FFC=0
4.3 物体破碎 / 椒盐
- 原因: 固定窗口过窄
- 修复: 改为自适应窗口
4.4 蒙层 / mura 感
- 原因: 常数 ref 或错误参考导致 mura 直接显示
- 修复: 启动阶段采集每像素平场
g_ref_mura
4.5 中上固定遮蔽
- 原因: 动态 badmap / scene-derived bad map 会把错误结构钉在屏幕坐标
- 修复:
BADMAP_ENABLE 0
4.6 右下炫光
- 原因: 误把某层处理当成全帧平滑
- 修复: 去掉整帧 3x3 blur 路径
4.7 最高温点变黑
- 原因: 调色或极值像素处理不稳
- 修复:
- 加了
idx >= hi -> 1023饱和保护 - 保留保守的
correct_zero_pixels()
- 加了
5. 当前稳定基线
请把下面这些当作“目前相对稳定、不要随便一起推翻”的基线:
CONSTANT_REF=1SBNUC_ENABLE=1BADMAP_ENABLE=0- 不启用显示层
deghost_nuc() - 保留
correct_zero_pixels(g_live) - 不使用动态 badmap
- 不重新采集 FFC 后参考
g_reference由g_ref_mura + shift生成
当前 SBNUC 的核心逻辑仍在 CONSTANT_REF && g_ref_mura_ready 分支里。
6. 当前主要问题
用户最新稳定反馈是:
- 画面别的问题基本都行
- 主要剩下鬼影
- 大温差目标离开后擦得还可以
- 小温差目标离开后,残影很明显,而且消失慢
也就是说问题已经不是“黑洞”了,而是“低对比度残影消退太慢”。
7. 已尝试过的鬼影方案与结果
以下这些路线都试过了,后续模型不要再盲目重复:
7.1 直接全局加速 SBNUC
试过:
- 去掉
df条件 - 放宽
dd阈值 alpha从1/64提到1/16
结果:
- 对黑洞有帮助
- 但对小温差鬼影改善有限
- 太激进时容易把画面别的东西带坏
7.2 用 dd > 120 冻结热物体,负残差快速吸收
当前稳定版本里保留了这条思路:
dd > 120认为是热目标,冻结dd < -120用更快步长
结果:
- 黑洞基本缓解
- 但小温差鬼影仍然慢
7.3 显示层去鬼影
试过:
- 最近热区 mask
- motion history
- 在显示层替换 ghost 区像素
结果:
- 效果不明显,或者直接把显示搞坏
- 用户明确反馈“显示不对了,有地方看不见了”
结论:
- 不建议再从显示层硬补丁下手
7.4 更复杂的热区/静止检测
试过:
g_sb_stillg_hot_histg_motion_histg_disp_hot
结果:
- 大部分复杂掩码方案收益低,且很容易引入副作用
8. 最后一次实际修改
最后一次修改是在当前 SBNUC 块上,加入了“最近热像素释放加速”:
- 新增常量:
SB_HOT_T 120SB_HOT_SEED 48SB_HOT_HOLD 24
- 逻辑:
dd > SB_HOT_SEED时给该像素一个短期热记忆- 当像素刚从热态退出,且
dd < 0时 - 临时把更新步长提高到
denom = 1或2 - 目标是让“小温差尾巴”比以前更快擦掉
改动位置:
这一版已经成功编译并启动过,但还没有得到“明显修好鬼影”的确认。
9. 官方抓帧证据
已成功抓到:
- 目录:
C:\Project\MAG160C\analysis\pairs_move - 预览图:
C:\Project\MAG160C\analysis\pairs_move\preview - 统计表:
C:\Project\MAG160C\analysis\pairs_move\preview\summary.tsv
已经确认的事实:
- 官方
f20-ref的整帧残差均值并不在0附近,而是大约-5000 - 官方自身也能看到“人物旧位置偏暗”的形态
- 说明鬼影不是 demo3 独有 bug,而是官方这类冻结参考体系本来就会带来的现象
几个关键数值:
pair_000到pair_011的d_mean大约在-5012到-5249d_std大约在735到993- 官方
gray帧间变化大多不高,但在 FFC 附近会跳
重要提醒:
tsdk_pair2.c里.thr/.gain有重复写文件的问题- 前面本来先按指针保存了真实表,后面又被
dev+0x41848 / 0x41870覆盖 - 所以
pairs_move/*.gain不能直接当纯 gain/off 表来解析
10. 当前源文件里还留着但未启用的东西
mag160c_demo3.c 里还有一些历史试验残留,很多已经不在主路径使用:
g_sb_prev_dg_sb_stillg_hot_histg_disp_hotg_disp_hot2g_motion_histg_disp_prev_liveg_disp_prev_readyg_disp_cur_hotg_disp_ghostg_disp_repldeghost_nuc()
其中:
g_hot_hist现在又被重新用于“最近热像素释放加速”deghost_nuc()仍然存在,但调用被注释掉了
11. 建议下一步
优先顺序建议如下:
- 不要再做显示层补丁。
- 继续只在
SBNUC/参考更新层做改动。 - 重点针对“刚离开热目标后的低对比度负残差”做更稳的状态机。
- 如果参数法还是没明显改善,直接上 Hardie 风格时域方差门控。
更具体地说:
方案 A: 做“退出热目标后的短时释放状态机”
比当前 g_hot_hist 更严格一点:
- 进入热目标态:
dd > hot_enter - 退出热目标态: 从热态回落到
dd <= hot_exit - 退出后
N帧内:- 若
dd < 0,快速拉g_ref_mura -> g_live - 若再次变热,立刻取消释放
- 若
这比单纯看当前 dd 更稳,因为它显式编码了“曾经热过,现在走了”。
方案 B: Hardie / Kalman 风格时域方差门控
这是最值得上的正路。
对每个像素维护:
d = live - ref- 短窗均值
- 短窗方差
规则:
- 方差小且接近背景偏移 -> 当作背景,允许吸收
- 方差大 -> 当作运动目标,冻结
这类方法比单阈值 dd 更适合处理“小温差但持续可见的鬼影”。
12. 不要轻易改的点
后续模型请避免同时改这些东西,否则很难定位:
BADMAP_ENABLEcorrect_zero_pixels()- FFC 重采样策略
- 调色和窗口逻辑
- 显示层
deghost_nuc() - 已验证的官方 LUT / palette 路径
除非有充分证据,否则这次只改 SBNUC 块。
13. 关键文件
- 主程序: mag160c_demo3.c
- 官方抓帧工具: tsdk_pair2.c
- 当前交接: handoff_20260811_full.md
- 历史进展: progress_reverse.md
- 官方抓帧预览表: summary.tsv
14. 给下一个模型的直接任务
首选任务:
- 先读本文件
- 再读
C:\Project\MAG160C\csdk\tools\mag160c_demo3.c - 只改
SBNUC块 - 目标是明显改善“小温差鬼影擦除慢”
- 不要碰别的已稳定逻辑
- 改完后编译并启动 demo 给用户实测