v4.5.3

v4.5.3 是一个大型版本:新增 OV5640 自动对焦、抗锯齿线条绘制、合入主线的硬件 JPEG 解码器、i.MX RT(RT1060)能力的大幅提升,以及一系列广泛的摄像头/ISP 修复。少数很少使用的图像方法被移除,部分 ISP/显示 API 发生了变化——请阅读下方的破坏性变更。

亮点

  • OV5640 自动对焦——在 OpenMV 4 / 4 Plus / RT1060 上启用(sensor.ioctl(sensor.IOCTL_TRIGGER_AUTO_FOCUS)),并附带示例。

  • 抗锯齿的 draw_line() 以及合入主线的 STM32 硬件 JPEG 解码器(JPEG 解压更快)。

  • OpenMV RT1060 新增了 ulab、ISP 操作、set_framerate() / set_frame_callback()、大得多的帧缓冲区以及 CAN 驱动。

  • 破坏性变更: Image.div() / cartoon() / mul() 被移除,部分 ISP/显示 API 发生了变化——请参阅破坏性变更。

新功能

  • OV5640 自动对焦——自动对焦固件已在 OPENMV4、OPENMV4P 和 OPENMV RT1060 上启用;通过 sensor.ioctl(sensor.IOCTL_TRIGGER_AUTO_FOCUS) 触发。新增了 07-Sensor-Control/autofocus.py 示例。

  • 抗锯齿线条绘制——draw_line() 新增了抗锯齿功能。

  • 自定义 SPI 显示控制器——SPIDisplay 现在接受 controller= 关键字参数,并暴露了一个 bus_write 钩子,用于自定义初始化/命令序列。

  • Image.ccm() 升级——现在接受嵌套的 3x3 / 4x3 / 3x4 / 4x4 矩阵和 ulab 数组(可选带逐通道偏移行);新增了一个颜色校正示例。

  • i.MX RT JPEG 捕获——在 Arduino Portenta/Nicla Vision/Giga 上支持 sensor.JPEG 捕获,并在 mimxrt 移植上支持 set_framerate()set_frame_callback()

  • TFLite 模型校验——模型现在携带算子顺序哈希值和算子集大小。

  • WiFi——新增了 CYW43 安全模式常量;新增了 i.MX RT 板级控制示例脚本(Pin/ADC/CAN/I2C/PWM/SPI/UART/...)。

其他变更与改进

  • MicroPython 升级到 1.22;CMSIS 升级到 5.9.0。

  • 合入主线的 STM32 硬件 JPEG 解码器——使用片上编解码器实现更快的 JPEG 解压。

  • 优化了 Image.invert() / negate() 以及二值/数学图像运算(使用 CMSIS 内建函数)。

  • rpcvl53l1x 库被改造为可移植的(使用 machine / time 而非 pyb),因此它们可以在非 STM32 移植上运行。

  • 在 OpenMV H7 / H7 Plus / Pro / Pure Thermal 和 Arduino Giga / Nicla Vision / Portenta H7 上实现了 DMA 加速的帧缓冲区 memcpy;STM32 现在每次扫描只扫描一次 I2C 设备,以加快启动速度。

错误修复

摄像头与传感器:

  • 修正了 STM32 摄像头 XCLK,使其达到真正的 50% 占空比,并修复了摄像头时钟频率设为零时的一个错误;修复了 Bayer 裁剪+转置、YUV422 颜色偏移,以及 mimxrt 移植上的 set_windowing()

  • 修复了 GC2145 芯片 ID 探测以及旋转安装时的 hmirror/vflip;修复了 RT1062 上的 PAJ6100 以及 PixArt PAJ7620/PAW3902 的 SPI 缓冲区溢出。

图像处理:

  • 修复了 find_rects() 的 roi 裁剪、morph() 的小数偏移截断、image.gamma() 的对比度/亮度默认值、RGB565 上 get_threshold() 的 A/B 偏移,以及尺寸非 8 的倍数时的 JPEG 解码。

系统与库:

  • 不带参数调用 machine.LED.value() 现在返回 LED 状态而不再清除它;修复了共享总线上 SPI SSEL 的反初始化、RT1062 上的 machine.deepsleep()、缺失算子导致的 TF 崩溃,以及 connect() 时 WINC1500/ninaw10 网卡的自动激活。

硬件与板级支持

  • OpenMV RT1060——启用了 ulab 和 ISP 操作,更大的帧缓冲区(10M→20M)/ fb_alloc(2M→11M),恢复了 CAN 驱动,更多的堆内存。

  • Arduino GIGA——支持 GC2145 摄像头,并具备 GC2145/OV5640 自动检测(它们共用一个 I2C 地址)。

  • i.MX RT——支持 sensor.JPEG 捕获。

破坏性 API 变更

v4.5.2 与 v4.5.3 之间面向用户的 API 破坏性变更。范围:modules/ 中的 Python C 模块和 scripts/libraries/ 中的 Python 库。

每项变更都标注了其影响程度:

  • minor——窄范围 API;仅影响使用过它的脚本。

  • behavior——相同的 API,不同的结果;请重新检查已调优的脚本。

变更按上述顺序的影响程度分组。如果你只想移植代码,可直接跳到末尾的 迁移检查清单。每个提交哈希都链接到 GitHub 上对应的 diff。

移除的图像方法 (minor)

Image.div()Image.cartoon()(及其示例)和 Image.mul() 已被移除。

Commits: 7c932602e055a468b84fe7fb63b

显示模块 API (minor)

旧的 udisplay 模块名回退已被移除——该模块现在仅注册为 display。仅用于 DSI 的 dsi_write() / dsi_read() 方法被 bus_write() / bus_read() 取代,后者现在在所有显示控制器上都可用。

Commits: 7df6694c37d1f378a0

MQTT 和 tf.regression API 变更 (minor)

mqtt 库的 MQTTClient 经过了重构:port 现在为必需参数,新增了 ssl_params / callback 构造函数关键字参数以及 connect() 上的 timeout 参数,移除了旧的 ssl= / port=0 默认值,并且 check_msg() 现在是非阻塞的。tf.regression() 被重写——其签名现在为 regression(model, array),并能处理 1D/2D/3D 以及量化(int8)模型。

Commits: d12874c63c5ec576c1

ISP / 传感器行为变更 (behavior)

Image.awb() 经过了重构——灰度世界(默认)与白块(max=True)现在是显式区分的,max 参数以及 Image.gamma()gamma / contrast / brightness 参数现在仅限关键字(位置调用必须更新)。图像转置现在对 YUV422 被禁用(此前会产生不正确的输出),并且 YUV422 颜色偏移已被校正以与 Bayer 匹配。STM32 JPEG 路径现在在 JPEG 几何不匹配时抛出错误,而不再生成损坏的图像,并且 WiFi AP 模式现在在 STM32 和 i.MX RT 移植上应用默认的安全模式。

Commits: 36d5cecbd00500ccdec1eeaefd6333fb2b5f55cab8733c7d40f6af

迁移检查清单

要干净地移植到 v4.5.3,通常需要做的工作是:

  1. 停止使用 Image.div() / cartoon() / mul()已移除的方法)。

  2. display 导入显示模块,并将 dsi_write/ dsi_read 切换为 bus_write/bus_read显示 API 变更)。

  3. 更新 MQTTClient 的构造方式(port 为必需;ssl_params/callback)以及任何 tf.regression() 调用(库 API 变更)。

  4. awb()max 以及 gamma()gamma/contrast/ brightness 作为关键字参数传递,并重新检查 YUV422/转置和 AP 模式安全假设(ISP/传感器变更)。