Files
MAG160C/analysis/history/handoff_20260811_full.md

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.txt
  • demo3_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
  • reflive/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=1
  • SBNUC_ENABLE=1
  • BADMAP_ENABLE=0
  • 不启用显示层 deghost_nuc()
  • 保留 correct_zero_pixels(g_live)
  • 不使用动态 badmap
  • 不重新采集 FFC 后参考
  • g_referenceg_ref_mura + shift 生成

当前 SBNUC 的核心逻辑仍在 CONSTANT_REF && g_ref_mura_ready 分支里。

6. 当前主要问题

用户最新稳定反馈是:

  • 画面别的问题基本都行
  • 主要剩下鬼影
  • 大温差目标离开后擦得还可以
  • 小温差目标离开后,残影很明显,而且消失慢

也就是说问题已经不是“黑洞”了,而是“低对比度残影消退太慢”。

7. 已尝试过的鬼影方案与结果

以下这些路线都试过了,后续模型不要再盲目重复:

7.1 直接全局加速 SBNUC

试过:

  • 去掉 df 条件
  • 放宽 dd 阈值
  • alpha1/64 提到 1/16

结果:

  • 对黑洞有帮助
  • 但对小温差鬼影改善有限
  • 太激进时容易把画面别的东西带坏

7.2 用 dd > 120 冻结热物体,负残差快速吸收

当前稳定版本里保留了这条思路:

  • dd > 120 认为是热目标,冻结
  • dd < -120 用更快步长

结果:

  • 黑洞基本缓解
  • 但小温差鬼影仍然慢

7.3 显示层去鬼影

试过:

  • 最近热区 mask
  • motion history
  • 在显示层替换 ghost 区像素

结果:

  • 效果不明显,或者直接把显示搞坏
  • 用户明确反馈“显示不对了,有地方看不见了”

结论:

  • 不建议再从显示层硬补丁下手

7.4 更复杂的热区/静止检测

试过:

  • g_sb_still
  • g_hot_hist
  • g_motion_hist
  • g_disp_hot

结果:

  • 大部分复杂掩码方案收益低,且很容易引入副作用

8. 最后一次实际修改

最后一次修改是在当前 SBNUC 块上,加入了“最近热像素释放加速”:

  • 新增常量:
    • SB_HOT_T 120
    • SB_HOT_SEED 48
    • SB_HOT_HOLD 24
  • 逻辑:
    • dd > SB_HOT_SEED 时给该像素一个短期热记忆
    • 当像素刚从热态退出,且 dd < 0
    • 临时把更新步长提高到 denom = 12
    • 目标是让“小温差尾巴”比以前更快擦掉

改动位置:

这一版已经成功编译并启动过,但还没有得到“明显修好鬼影”的确认。

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_000pair_011d_mean 大约在 -5012-5249
  • d_std 大约在 735993
  • 官方 gray 帧间变化大多不高,但在 FFC 附近会跳

重要提醒:

  • tsdk_pair2.c.thr/.gain 有重复写文件的问题
  • 前面本来先按指针保存了真实表,后面又被 dev+0x41848 / 0x41870 覆盖
  • 所以 pairs_move/*.gain 不能直接当纯 gain/off 表来解析

10. 当前源文件里还留着但未启用的东西

mag160c_demo3.c 里还有一些历史试验残留,很多已经不在主路径使用:

  • g_sb_prev_d
  • g_sb_still
  • g_hot_hist
  • g_disp_hot
  • g_disp_hot2
  • g_motion_hist
  • g_disp_prev_live
  • g_disp_prev_ready
  • g_disp_cur_hot
  • g_disp_ghost
  • g_disp_repl
  • deghost_nuc()

其中:

  • g_hot_hist 现在又被重新用于“最近热像素释放加速”
  • deghost_nuc() 仍然存在,但调用被注释掉了

11. 建议下一步

优先顺序建议如下:

  1. 不要再做显示层补丁。
  2. 继续只在 SBNUC/参考更新层做改动。
  3. 重点针对“刚离开热目标后的低对比度负残差”做更稳的状态机。
  4. 如果参数法还是没明显改善,直接上 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_ENABLE
  • correct_zero_pixels()
  • FFC 重采样策略
  • 调色和窗口逻辑
  • 显示层 deghost_nuc()
  • 已验证的官方 LUT / palette 路径

除非有充分证据,否则这次只改 SBNUC 块。

13. 关键文件

14. 给下一个模型的直接任务

首选任务:

  • 先读本文件
  • 再读 C:\Project\MAG160C\csdk\tools\mag160c_demo3.c
  • 只改 SBNUC
  • 目标是明显改善“小温差鬼影擦除慢”
  • 不要碰别的已稳定逻辑
  • 改完后编译并启动 demo 给用户实测