本次在君正的T32pro上做 OS08G10 驱动适配,出流正常,但画面整体偏粉。以下是问题的排查与解决过程。
一、现象:出流正常,画面整体偏粉
出流本身是正常的,分辨率和帧率都符合预期,画面也没有花屏、闪烁这类问题。但整幅图像像是罩了一层粉紫色,连白色物体都是粉的。自动白平衡无法纠正;手动调白平衡只能在偏粉和偏青之间变化,始终回不到正常颜色。而且不是某个区域偏色,是全画面一起偏。如图:

二、解决办法
sensor 实际输出的颜色排列是 GRBG。而驱动里声明的是 BGGR,两者不一致——这就是画面偏粉的原因。
修改只有一处:打开驱动源码 `os08g10.c`,找到声明颜色排列的那一行,把
`TISP_VI_FMT_SBGGR10_1X10` 改成 `TISP_VI_FMT_SGRBG10_1X10`,
然后重新编译驱动模块、替换到板卡上、重启出流应用。修改后驱动中的相关代码如下:
static struct tx_isp_sensor_win_setting os08g10_win_sizes[] = {
/* boot=0: 3840x2160@30fps */
{
.width = 3840,
.height = 2160,
.fps = 30 << 16 | 1,
.mbus_code = TISP_VI_FMT_SGRBG10_1X10,
.colorspace = TISP_COLORSPACE_SRGB,
.regs = os08g10_init_regs_3844_2164_30fps_mipi,
},
};替换后画面恢复正常:白色物体呈中性白,蓝色、红色物体颜色也都正确。
为确认结论,又做了一次反向验证:把声明改回 BGGR,画面立刻再次偏粉;改回 GRBG,画面又恢复正常。
结果可重复,说明偏色与这一行声明直接相关,问题确认解决。
三、排查过程
1、先调参数:无效
根据官方文档。遇到偏色,第一步自然是从 ISP 参数入手。使用君正提供的调试工具,白平衡的自动、手动都试过,颜色只能在偏粉和偏青之间来回;效果文件和常用的色彩参数也换过、调过,偏色没有任何变化。也就是说,参数只能改变偏色的强弱和方向,改变不了"颜色本身就是错的"这个事实——问题不在参数层面。
2、换个方向:颜色排列
画面结构、亮度都正常,只有颜色不对,于是想到一个更底层的问题:ISP 是根据什么把每个像素还原成颜色的?

根据文档,sensor 的每个像素上只覆盖一种颜色的滤镜(红、绿或蓝),这些滤镜按固定的棋盘格排列。ISP 必须先知道这个排列是什么,才能把每个像素的数据还原成正确的颜色。如果它以为的排列和实际排列不一致,红和蓝就会互换,整幅画面就会偏成粉紫色——这和看到的现象对得上。
3、测试过程
出流之后抓一帧 RAW 数据(`impdbg --snap_raw`),拿到电脑上用脚本分析。判读的方法分两步。
第一步,确定绿色在哪条对角线上。把像素按棋盘格的四个位置分成四组,两个绿色一定在同一条对角线
上,而同色位置的数值最接近。所以比较两组对角,哪一组更接近,绿色就在哪条对角线上。实测绿色在主对
角,排除了两种排列,候选只剩两种。
第二步,确定红、蓝各在哪个位置。办法是找一个画面里已知颜色的物体——画面里有一块蓝色垫板。蓝
光能穿过蓝滤镜、几乎穿不过红滤镜,所以在蓝物体区域里,四个位置中"蓝色滤镜"那个数值最高、"红色
滤镜"那个最低。实测下来,蓝在 (1,0)、红在 (0,1)。
通俗的讲就是,透过一面镜子去看一个蓝色的物体,蓝色透镜看到的蓝色更多。红色透镜看到的蓝色就更少,
这样就可以确定Bayer 2x2单元中对应的位置颜色参数,去确定是GRBG形式,还是BGGR形式。
4、实测结论:实际是 GRBG,声明是 BGGR
sensor 实际输出的颜色排列是 GRBG。而驱动里声明的是 BGGR,两者不一致——这就是画面偏粉的原因。之后遇到这类"整幅偏色、调参又无法纠正"的问题,可以优先检查颜色排列的声明是否与实际一致。