Files
MAG160C/analysis/handoff_20260811_full.md
T

362 lines
9.9 KiB
Markdown

# 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`
编译命令:
```powershell
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
```
重启命令:
```powershell
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`
官方抓帧:
```powershell
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. 官方渲染管线逆向结论
已验证主链路:
```text
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=1`
- `SBNUC_ENABLE=1`
- `BADMAP_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_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 = 1``2`
- 目标是让“小温差尾巴”比以前更快擦掉
改动位置:
- [mag160c_demo3.c](/abs/path/C:/Project/MAG160C/csdk/tools/mag160c_demo3.c)
这一版已经成功编译并启动过,但还没有得到“明显修好鬼影”的确认。
## 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``-5249`
- `d_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_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. 关键文件
- 主程序: [mag160c_demo3.c](/abs/path/C:/Project/MAG160C/csdk/tools/mag160c_demo3.c)
- 官方抓帧工具: [tsdk_pair2.c](/abs/path/C:/Project/MAG160C/csdk/tools/tsdk_pair2.c)
- 当前交接: [handoff_20260811_full.md](/abs/path/C:/Project/MAG160C/analysis/handoff_20260811_full.md)
- 历史进展: [progress_reverse.md](/abs/path/C:/Project/MAG160C/analysis/progress_reverse.md)
- 官方抓帧预览表: [summary.tsv](/abs/path/C:/Project/MAG160C/analysis/pairs_move/preview/summary.tsv)
## 14. 给下一个模型的直接任务
首选任务:
- 先读本文件
- 再读 `C:\Project\MAG160C\csdk\tools\mag160c_demo3.c`
- 只改 `SBNUC`
- 目标是明显改善“小温差鬼影擦除慢”
- 不要碰别的已稳定逻辑
- 改完后编译并启动 demo 给用户实测