1. 项目概述与Resizer模块定位
在嵌入式视觉系统的开发中,图像信号处理器(ISP)扮演着“视觉大脑”的角色,它负责将传感器采集的原始数据(RAW Data)转化为我们肉眼可识别、算法可处理的图像。而在ISP这条复杂的处理流水线中,图像缩放器(Resizer)往往是一个容易被忽视,却又至关重要的环节。无论是为了适配不同分辨率的显示屏、满足后端算法对输入尺寸的要求,还是为了生成预览流(Preview)或缩略图,Resizer都承担着实时、高效改变图像尺寸的重任。
德州仪器(TI)的Camera ISP Resizer模块,是一个高度可配置的硬件加速单元。它绝非简单的像素复制或丢弃,而是基于多相滤波器的插值算法,能够在缩放过程中最大限度地保留图像细节、抑制混叠效应,保证输出画质。对于工程师而言,理解其寄存器配置,就是掌握了精准控制图像尺寸变换的“遥控器”。这不仅关乎功能实现,更直接影响到最终产品的图像质量、处理延迟和内存带宽占用。今天,我们就来深入拆解TI Camera ISP Resizer的寄存器配置逻辑,结合实战经验,让你从“知道有哪些寄存器”升级到“明白为何这样配置”。
2. Resizer核心寄存器功能解析与配置逻辑
TI ISP Resizer的寄存器看似繁多,但按其功能可以清晰地划分为几个核心组:控制与状态寄存器、尺寸与地址配置寄存器以及滤波器系数寄存器。理解每一组寄存器的设计意图,是进行正确配置的前提。
2.1 核心控制与状态寄存器:RSZ_PCR与RSZ_CNT
RSZ_PCR (Peripheral Control Register)是Resizer的“总开关”和模式选择器。其关键字段如下:
- ENABLE (Bit 0): 模块使能位。一个至关重要的细节是:在启动一帧的缩放处理时,ENABLE位必须是最后写入的字段。这确保了所有配置参数(如尺寸、地址、系数)在模块启动前都已准备就绪,避免因配置不同步导致的图像错乱或系统错误。
- BUSY (Bit 1): 只读状态位。当该位为1时,表示Resizer正在处理一帧数据。在连续模式下,可以通过轮询此位来判断一帧是否处理完毕,以便进行下一帧的预处理(如更新输入地址)。
- ONESHOT (Bit 2): 单次/连续模式选择。此位仅当输入源为CCDC或PREVIEW模块(RSZ_CNT.INPSRC=0)时有效。
0: 连续模式。模块启动后将持续处理输入的视频流,直到软件将其禁用(ENABLE置0)。禁用操作会在当前帧结束时生效。1: 单次模式。当ENABLE置1启动模块后,一旦BUSY位跳变为1(表示开始处理),ENABLE位会自动清零。这适用于从内存(SDRAM)到内存的缩放任务,处理完一帧即停止。
RSZ_CNT (Resizer Control Register)是功能配置的核心,它定义了Resizer如何处理数据:
- INPSRC (Bit 28): 输入源选择。
0表示来自CCDC或预览引擎,1表示来自内存(SDRAM)。这里有一个硬件仲裁机制:当此位为0时,如果CCDC和预览引擎同时试图向Resizer输出数据,CCDC拥有更高优先级。这要求软件必须妥善管理这两个前端模块的输出使能,避免冲突。 - INPTYP (Bit 27): 输入数据类型。
0为交织的YUV422格式(每个16位字包含一个Y和一个C分量),1为8位色彩分离数据(Y、Cb、Cr分量分别存储)。这直接影响后续的存储地址计算和对齐要求。 - YCPOS (Bit 26): 仅对YUV422交织格式有效。
0表示16位字中高字节为Y(亮度),低字节为C(色度);1则相反。配置错误会导致颜色通道完全错乱。 - HRSZ (Bits 9:0) & VRSZ (Bits 19:10): 水平和垂直缩放系数。这是最容易出错的地方之一。手册明确说明,缩放比率 = 256 / (HRSZ+1) 或 256 / (VRSZ+1)。例如,要实现1:1(即不缩放),比率应为1,代入公式:1 = 256 / (HRSZ+1) => HRSZ = 255。因此,你需要写入寄存器的值是
期望系数 - 1。系数的有效范围是64到1024,意味着支持的缩放比率范围大约是0.25倍(256/1024)到4倍(256/65)。注意:这里的“缩放系数”指的是输出像素相对于输入像素的“步进”关系,值越大,输出图像尺寸越小(缩小),反之则放大。 - CBILIN (Bit 29): 色度分量水平缩放算法选择。
0表示色度使用与亮度相同的多相滤波算法;1表示色度使用双线性插值。手册建议,多相滤波仅用于下采样(缩小),双线性插值仅用于上采样(放大)。这是因为多相滤波在放大时可能导致过度模糊,而双线性插值在下采样时抗混叠能力不足。
2.2 尺寸与地址配置寄存器:定义处理画布
这组寄存器定义了“从哪里取数据”、“取多大”、“处理完放到哪里”、“输出多大”。
- RSZ_IN_SIZE & RSZ_OUT_SIZE: 分别定义输入和输出图像的宽度(HORZ)和高度(VERT)。输入尺寸定义了从源中读取的有效区域,输出尺寸定义了缩放后的目标尺寸。关键约束:
RSZ_OUT_SIZE.HORZ(输出宽度)必须为偶数。如果垂直缩放系数大于1(即放大),则写入SDRAM的字节数必须是16字节的倍数。这源于DMA总线传输的效率要求,违反此约束可能导致数据错位或传输失败。 - RSZ_IN_START: 定义输入图像的起始点(HORZ_ST, VERT_ST)。其编程方式根据输入源不同而有巨大差异:
- 输入源为SDRAM时:
HORZ_ST必须设置为15(对于16位YUV数据)或31(对于8位色彩分离数据)。VERT_ST必须设为0。这里的15/31是出于32字节对齐的硬件要求(地址低5位强制为0),HORZ_ST实际上是以像素为单位。 - 输入源为CCDC/PREVIEW时:
HORZ_ST需要以字节为单位编程,并且最低有效位(LSB)需要根据像素起始位置调整。例如,若要从第3个像素开始(YUV422,每个像素2字节),则HORZ_ST应设为(3*2) = 6(二进制110)。如果起始位置要求半个像素偏移(在某些Bayer格式处理中可能出现),则需将LSB置1。
- 输入源为SDRAM时:
- SDRAM地址与偏移寄存器 (RSZ_SDR_INADD, RSZ_SDR_INOFF, RSZ_SDR_OUTADD, RSZ_SDR_OUTOFF):
- 地址对齐:输入/输出地址(ADDR)的低5位会被硬件强制清零,即对齐到32字节边界。为了获得最佳的SDRAM带宽利用率,强烈建议将输出地址(RSZ_SDR_OUTADD)和行偏移(RSZ_SDR_OUTOFF)对齐到256字节边界。这能最大化突发传输效率,对高帧率应用至关重要。
- 动态更新:一个非常有用的特性是,这些地址和偏移寄存器可以在Resizer忙碌(BUSY=1)时被修改。新值将在下一帧处理时生效。这实现了“乒乓缓冲”或环形缓冲区的无缝切换,是构建高效视频流水线的基石。但请注意,读取这些寄存器总是返回最新写入的值。
2.3 滤波器系数寄存器:图像质量的核心
RSZ_HFILT10~RSZ_HFILT3130和RSZ_VFILT10~RSZ_VFILT3130这两组寄存器,分别控制水平和垂直方向的8相位、8抽头多相滤波器。这是Resizer画质的灵魂所在。
- 系数格式:所有系数均为10位有符号数,格式为S10Q8。这意味着它用10位二进制数表示一个定点数,其中1位符号位,1位整数位,8位小数位。数值范围是-2.0到+1.996(约等于+2,因为1.255/256是示例,实际最大正值是
0x1FF/ 256 ≈ 1.996)。数值1.0对应的十六进制值是0x100(二进制01 0000 0000)。 - 相位与抽头:寄存器名称中的数字(如COEF0, COEF1)代表抽头索引,而描述中的“Phase X/Y, tap A/B”揭示了其复用逻辑。���如,
RSZ_HFILT54的COEF4对应“Phase 0/1, tap 4/0”,这意味着同一个系数存储位置,在相位0时作为第4个抽头系数,在相位1时作为第0个抽头系数。这种设计是为了节省寄存器资源,因为一个8抽头滤波器,每个相位都需要8个系数,8个相位总共需要64个系数。通过巧妙的复用,32个寄存器就存储了全部64个系数(水平+垂直各32个寄存器)。 - 默认值与自定义:复位后,所有系数为0。TI通常会提供一组推荐的默认滤波器系数(如Lanczos、双线性、双立方插值的近似系数),用于不同缩放比例和画质需求。工程师需要根据应用场景(追求速度还是画质)来加载相应的系数集。加载系数是一个精细活,必须确保所有系数之和在相位间保持恒定(通常为1.0),以避免引入亮度偏差。
3. 完整配置流程与实战案例拆解
理解了单个寄存器后,我们将其串联起来,形成一个完整的配置流程。假设我们要实现一个经典场景:从SDRAM中读取一幅1280x720(720p)的YUV422图像,缩放至640x360(360p)用于网络预览,并将结果存回SDRAM的另一位置。
3.1 第一步:参数计算与规划
计算缩放系数:
- 目标缩放比(水平) = 输出宽度 / 输入宽度 = 640 / 1280 = 0.5
- 根据公式:缩放比 = 256 / (HRSZ + 1) => 0.5 = 256 / (HRSZ + 1) => HRSZ = 511
- 同理,垂直缩放比 = 360 / 720 = 0.5 => VRSZ = 511
- 因此,RSZ_CNT.HRSZ = 511, RSZ_CNT.VRSZ = 511。
选择滤波器系数:由于是2倍下采样(缩小),为了防止混叠(Aliasing),需要使用具有良好抗混叠特性的低通滤波器系数。这里可以选择TI提供的“7-tap downsampling filter”系数集。我们需要将这些系数按照相位和抽头关系,正确写入
RSZ_HFILTxx和RSZ_VFILTxx寄存器组。假设我们获得了一组系数数组coeff_h[8][8]和coeff_v[8][8](8相位 x 8抽头)。规划内存布局:
- 输入图像:1280x720 YUV422,每像素2字节,一帧大小 = 1280 * 720 * 2 = 1,843,200 字节。假设输入缓冲区起始地址为
0x8000_0000,且已32字节对齐。 - 输出图像:640x360 YUV422,一帧大小 = 640 * 360 * 2 = 460,800 字节。我们分配输出缓冲区起始地址为
0x8200_0000。 - 行偏移(OFFSET):对于YUV422交织格式,一行数据的字节数 = 宽度 * 2。因此,输入行偏移 = 1280 * 2 = 2560。输出行偏移 = 640 * 2 = 1280。检查对齐:输出行偏移1280是256字节的整数倍吗?1280 / 256 = 5,是整数,满足最优带宽对齐要求。
- 输入图像:1280x720 YUV422,每像素2字节,一帧大小 = 1280 * 720 * 2 = 1,843,200 字节。假设输入缓冲区起始地址为
3.2 第二步:寄存器配置代码示例
以下是一个基于C语言的伪代码配置流程,展示了配置的先后顺序和关键步骤:
// 假设寄存器基地址定义为宏 #define ISP_RESIZER_BASE 0x480BD000 // 1. 停止Resizer模块(如果正在运行) REG_WRITE(ISP_RESIZER_BASE + RSZ_PCR_OFFSET, 0x0); // 清除ENABLE // 2. 配置输入源和数据类型 (从SDRAM, YUV422交织) uint32_t rsz_cnt_val = 0; rsz_cnt_val |= (1 << 28); // INPSRC = 1 (Memory) rsz_cnt_val |= (0 << 27); // INPTYP = 0 (YUV422 interleaved) rsz_cnt_val |= (0 << 26); // YCPOS = 0 (YC order) rsz_cnt_val |= (0 << 29); // CBILIN = 0 (色度同亮度处理,适用于下采样) // 设置缩放系数 rsz_cnt_val |= ((511 & 0x3FF) << 10); // VRSZ = 511 rsz_cnt_val |= ((511 & 0x3FF) << 0); // HRSZ = 511 REG_WRITE(ISP_RESIZER_BASE + RSZ_CNT_OFFSET, rsz_cnt_val); // 3. 配置输入/输出尺寸 uint32_t in_size_val = (720 << 16) | (1280 << 0); // VERT, HORZ uint32_t out_size_val = (360 << 16) | (640 << 0); // VERT, HORZ REG_WRITE(ISP_RESIZER_BASE + RSZ_IN_SIZE_OFFSET, in_size_val); REG_WRITE(ISP_RESIZER_BASE + RSZ_OUT_SIZE_OFFSET, out_size_val); // 4. 配置输入起始(SDRAM源有特殊要求) uint32_t in_start_val = (0 << 16) | (15 << 0); // VERT_ST=0, HORZ_ST=15 (for 16-bit data) REG_WRITE(ISP_RESIZER_BASE + RSZ_IN_START_OFFSET, in_start_val); // 5. 配置SDRAM地址和偏移 REG_WRITE(ISP_RESIZER_BASE + RSZ_SDR_INADD_OFFSET, 0x80000000); // 输入地址 REG_WRITE(ISP_RESIZER_BASE + RSZ_SDR_INOFF_OFFSET, 2560); // 输入行偏移 REG_WRITE(ISP_RESIZER_BASE + RSZ_SDR_OUTADD_OFFSET, 0x82000000); // 输出地址 REG_WRITE(ISP_RESIZER_BASE + RSZ_SDR_OUTOFF_OFFSET, 1280); // 输出行偏移 // 6. 加载水平滤波器系数 (示例:加载相位0的8个系数) // coeff_h[0][0] ~ coeff_h[0][7] 是S10Q8格式的系数 REG_WRITE(ISP_RESIZER_BASE + RSZ_HFILT10_OFFSET, (coeff_h[0][1]<<16) | (coeff_h[0][0]<<0)); REG_WRITE(ISP_RESIZER_BASE + RSZ_HFILT32_OFFSET, (coeff_h[0][3]<<16) | (coeff_h[0][2]<<0)); // ... 依次写入所有水平和垂直滤波器寄存器 // 注意:需要根据系数表,正确填充所有32个水平寄存器和32个垂直寄存器。 // 7. 配置亮度增强器(RSZ_YENH)- 根据需求可选 // 本例禁用增强 REG_WRITE(ISP_RESIZER_BASE + RSZ_YENH_OFFSET, 0x0); // 8. 最后,启动Resizer (单次模式,因为是从SDRAM到SDRAM) // 单次模式下,ONESHOT=1, 启动ENABLE REG_WRITE(ISP_RESIZER_BASE + RSZ_PCR_OFFSET, (1<<2) | (1<<0)); // ONESHOT=1, ENABLE=1 // 9. (可选)等待处理完成 while (REG_READ(ISP_RESIZER_BASE + RSZ_PCR_OFFSET) & (1<<1)) { // 轮询BUSY位,直到为0 // 或者使用中断方式 }关键操作顺序提示:务必遵循“先配置参数,最后使能”的原则。特别是地址、尺寸、系数等寄存器,必须在使能(ENABLE)前设置好。对于SDRAM到SDRAM的操作,模块会在帧处理完成后自动关闭(ENABLE自动清零)。
4. 滤波器系数详解与自定义设计指南
寄存器手册只定义了存储格式,而滤波器系数的具体值决定了缩放质量。TI的Resizer使用一个8相位、8抽头的多相滤波器结构。这意味着对于任意一个缩放比例,输出像素值是由输入图像中相邻的8个像素,根据当前相位权重计算得出的。
4.1 多相滤波器原理
想象一下,我们要将输入图像的坐标映射到输出图像。这个映射通常不是整数。相位(Phase)就代表了输出像素点落在两个输入像素之间的相对位置。8相位意味着将这个间隔分成了8等份。例如,相位0代表输出像素位置与最近的输入像素位置完全对齐(偏移为0),相位4代表偏移了半个像素间隔。
对于每一个相位,都有一组独立的8个滤波器系数(Coefficients),也就是8个权重。输出像素值等于这8个输入像素值各自乘以对应权重后的和。这组系数本质上是一个针对该相位位置的重构滤波器。
4.2 系数设计考量与常见预设
- 双线性插值(Bilinear):最简单的2抽头插值。在8抽头系统中实现双线性,只需将最近的两个像素的系数设为非零(根据相位进行线性分配,和为1),其余6个系数为0。这种算法速度快,但图像容易变模糊。
- 双立方插值(Bicubic):通常使用4个像素,能产生比双线性更平滑的边缘。在8抽头系统中,可以近似实现。其系数曲线更复杂。
- Lanczos重采样:一种sinc函数加窗的插值算法,在频域上有很好的特性,能较好地平衡锐利度和振铃效应,是高质量图像缩放的常用选择。但其系数计算复杂,且抽头数越多(Lanczos-3用6个像素),效果越好,8抽头可以较好地近似。
TI通���会在其软件库(如DVSDK或Processor SDK)中提供几组预定义的系数表,例如:
rsz_coeffs_bilinear: 用于快速、低质量的缩放。rsz_coeffs_bicubic: 用于平衡质量和速度。rsz_coeffs_lanczos: 用于高质量缩放,但计算量稍大。
工程师的��务就是根据性能(加载系数的时间、滤波计算开销)和画质需求,选择合适的系数集,并正确无误地写入那64个寄存器(水平32个,垂直32个)。
4.3 自定义系数生成与验证
如果你有特殊的滤波需求,可以自行生成系数。基本步骤如下:
- 确定目标响应:你希望滤波器在频域上有何特性?低通截止频率是多少?这取决于你的缩放比例。下采样(缩小)时,必须使用低通滤波器来防止高频混叠。
- 设计滤波器原型:设计一个具有所需频率响应的1D数字滤波器(如FIR滤波器)。
- 多相分解:将这个原型滤波器的冲激响应,按8个相位进行分解,得到8组、每组8个系数。确保每组系数之和为1(或一个统一的增益值),以避免引入整体亮度变化。
- 量化到S10Q8格式:将浮点系数乘以256(2^8),取整,并确保在-512到+511的范围内(对应S10Q8的-2.0到+1.996)。
- 写入寄存器:按照寄存器描述中的“Phase X/Y, tap A/B”映射关系,将计算好的系数数组填充到
RSZ_HFILTxx和RSZ_VFILTxx寄存器中。
一个重要的验证步骤:在加载自定义系数后,用一个已知的测试图案(如黑白棋盘格、渐变条纹)输入,检查输出图像是否有明显的振铃(Ringing)、模糊(Blurring)或亮度不均(Gain Variation)。这能有效验证系数计算的正确性。
5. 高级应用场景与性能优化技巧
掌握了基础配置后,我们可以探讨一些高级用法和优化点,这些往往是产品化过程中提升稳定性和效率的关键。
5.1 动态切换与乒乓缓冲
Resizer支持在BUSY状态下更新输入/输出地址(RSZ_SDR_INADD/OUTADD)和行偏移(RSZ_SDR_INOFF/OUTOFF)。这一特性是实现零延迟帧处理流水线的核心。
典型乒乓缓冲操作流程:
- 准备两个输入缓冲区(
BufA_in,BufB_in)和两个输出缓冲区(BufA_out,BufB_out)。 - 初始配置Resizer从
BufA_in处理到BufA_out,并启动。 - 当Resizer开始处理(
BUSY变1)后,立即(在ISR或主循环中)将其输入/输出地址重新配置为BufB_in和BufB_out。此配置将在当前帧(A帧)处理完毕后生效。 - A帧处理完毕(
BUSY变0,或通过中断通知)。此时,Resizer已自动指向B缓冲区。软件可以读取BufA_out的数据,同时用新图像填充BufA_in。 - 当Resizer开始处理B帧(
BUSY再变1)后,再次立即将地址切换回BufA_in和BufA_out。 如此循环,实现了处理与数据搬运的完全并行,最大化吞吐量。
5.2 与CCDC/Preview Engine的实时流水线协作
当RSZ_CNT.INPSRC=0时,Resizer的输入直接来自CCDC(图像传感器接口)或预览引擎。这是实现实时预览、录像的典型场景。
配置要点:
- 输入起始(RSZ_IN_START):此时
HORZ_ST以字节为单位编程,且需调整LSB。这常用于实现电子平移(Pan)和缩放(Zoom),即从传感器有效像素窗口内选取一个子区域进行缩放输出。 - 连续模式(RSZ_PCR.ONESHOT=0):在此模式下,一旦使能,Resizer会持续处理前端送来的每一帧。你需要确保CCDC/Preview Engine的输出时序和分辨率与Resizer的输入配置匹配。
- 优先级仲裁:如前所述,CCDC和预览引擎不能同时驱动Resizer。软件需要通过配置CCDC和预览引擎各自的输出使能寄存器来管理数据流。
5.3 性能约束与计算
Resizer的处理性能受限于几个因素:
- 时钟频率:模块的运行时钟。
- 输入/输出带宽:尤其是从SDRAM读取和写入的带宽。这也是为什么强调256字节对齐对于输出地址和偏移如此重要,它能最大化SDRAM的突发传输效率。
- 缩放比例与滤波器抽头数:更复杂的滤波器(系数非零项多)和更大的缩放倍数(需要更多计算)会消耗更多时钟周期。
一个粗略的吞吐量估算思路: 处理一个像素所需的时间 ≈ (滤波器抽头数 * 每个抽头的计算周期) / 时钟频率。 总处理时间 ≈ 输出图像总像素数 * 每个像素处理时间。 在实际项目中,需要参考TI特定芯片的数据手册中的“Resizer Throughput”章节获取精确数据,以确保能满足目标帧率(如1080p@30fps)的要求。
6. 常见问题排查与调试心得
即使按照手册配置,在实际调试中也可能遇到各种问题。以下是我在项目中总结的一些常见“坑”和解决思路。
6.1 问题现象与排查表
| 问题现象 | 可能原因 | 排查步骤与解决方法 |
|---|---|---|
| 输出图像全黑或全绿 | 输入/输出地址配置错误,或数据格式不匹配。 | 1. 检查RSZ_SDR_INADD/OUTADD是否已32字节对齐。2. 确认 RSZ_CNT.INPTYP和YCPOS设置与内存中实际数据格式完全一致。3. 使用内存查看工具,确认输入缓冲区已有正确的图像数据。 |
| 输出图像错位、撕裂 | 输入/输出尺寸(RSZ_IN_SIZE,RSZ_OUT_SIZE)或行偏移(RSZ_SDR_INOFF/OUTOFF)计算错误。 | 1. 复核尺寸计算:宽度x高度x每像素字节数。 2.重点检查 RSZ_OUT_SIZE.HORZ是否为偶数。3. 检查行偏移值是否等于 宽度 * 每像素字节数。对于YUV422,是宽度*2。 |
| 缩放比例不对 | RSZ_CNT.HRSZ/VRSZ计算错误。 | 牢记公式:缩放比 = 256 / (HRSZ/VRSZ + 1),且写入值是期望系数-1。用计算器反复验算。 |
| 图像模糊或有锯齿 | 滤波器系数选择不当。 | 1. 确认缩放方向:下采样必须使用抗混叠的低通滤波器(如下采样专用系数)。 2. 检查加载的系数集是否完整、正确,所有相位系数之和是否接近256(1.0的Q8表示)。 3. 尝试切换TI提供的不同预设系数集(双线性、双立方、Lanczos)对比效果。 |
| 垂直方向有重复线条 | 垂直滤波器系数寄存器(RSZ_VFILTxx)配置错误或未配置。 | 水平缩放正常但垂直异常,几乎可以断定是垂直滤波器问题。确保像配置水平滤波器一样,完整配置了所有32个垂直滤波器寄存器。 |
| 系统卡死或数据异常 | 在Resizer忙碌时改写了不允许修改的寄存器。 | 确认只在对BUSY位不敏感的寄存器(如SDR_INADD,SDR_INOFF等)进行动态更新。像RSZ_CNT,RSZ_IN_SIZE等关键参数,必须在模块空闲(ENABLE=0且BUSY=0)时配置。 |
| 性能不达标,帧率低 | 内存带宽成为瓶颈。 | 1. 使用芯片性能分析工具,查看SDRAM带宽占用是否饱和。 2.确保输出内存地址和行偏移按256字节对齐,这是手册明确建议的优化点。 3. 考虑降低输出分辨率或使用更简单的滤波器系数。 |
6.2 调试心得与建议
- 从简入繁:初次调试,建议先配置为1:1缩放(HRSZ=VRSZ=255),并使用最简单的双线性插值系数(甚至可以直接用一组平均系数)。先确保数据通路是通的,再逐步调整缩放比和优化滤波器。
- 善用静态测试图案:不要一开始就用真实的摄像头数据。使用软件在内存中生成固定的测试图案(如彩色条纹、棋盘格)。当输出异常时,静态图案比动态视频更容易分析问题所在(例如,颜色通道是否错乱,几何形状是否扭曲)。
- 寄存器回读验证:在写入所有配置后,逐一回读关键寄存器(如
RSZ_CNT,RSZ_OUT_SIZE,RSZ_SDR_OUTADD),确认写入的值与预期一致。硬件可能存在写缓冲或位域理解差异。 - 关注数据对齐:“对齐”是嵌入式系统性能与稳定的生命线。除了硬件强制的32字节对齐,主动做到256字节对齐会带来意想不到的性能提升。
- 理解“相位”的视觉影响:对于非常规比��的缩放(如非整数倍),不同的起始相位(
HSTPH/VSTPH)会使输出图像产生亚像素级的整体偏移。这在多路Resizer输出需要像素级对齐时(如图像拼接)非常重要,可以通过微调起始相位来校准。
TI Camera ISP的Resizer模块是一个功能强大且灵活的图像处理硬件。吃透其寄存器配置,意味着你不仅能实现基本的缩放功能,更能根据产品需求,在画质、性能和功耗之间做出精准的权衡。希望这篇深入的解析和实战指南,能帮助你在下一个嵌入式视觉项目中,让Resizer模块真正地“物尽其用”。