v3.6.1

v3.6.1 是一次重大发布。它引入了 imu 模块(LSM6DS3)、一套全新的 sensor getter API(带有 IMU 驱动的自动旋转)、4 点透视 rotation_corr(),并使 Arduino Portenta H7 配合 HIMAX HM01B0OV7690 摄像头投入运行。多个 sensor / image API 发生了变化,且 M7 上移除了 TensorFlow——请阅读下方的破坏性变更。

重点内容

  • imu 模块——LSM6DS3(OpenMV 4 / Portenta)上的加速度计 / 陀螺仪 / 温度 / 横滚 / 俯仰。

  • 传感器 getter + 自动旋转——get_pixformat() / get_framesize() / get_hmirror() / get_vflip() / get_windowing()set_transpose() / set_auto_rotation(),以及 IMU 驱动的快照旋转。

  • 透视校正——rotation_corr() 新增 fovcorners(4 点)关键字参数。

  • 新硬件——Arduino Portenta H7、HIMAX HM01B0 和 OV7690 摄像头。

  • 破坏性变更: set_pixformat() / set_framesize() 现在返回 Nonesensor.set_framerate() 被移除,M7 上移除了 TensorFlow,且 lens_corr() / linpolar() 现在要求偶数尺寸——参见破坏性变更。

新功能

  • imu——全新的 IMU 模块:imu.acceleration_mg()imu.angular_rate_mdps()imu.temperature_c()imu.roll()imu.pitch()imu.sleep()(OpenMV 4 / Portenta 上的 LSM6DS3)。

  • 传感器 getter——新增 sensor.get_pixformat()get_framesize()get_hmirror()get_vflip()get_windowing()set_transpose() / get_transpose(),以及 set_auto_rotation() / get_auto_rotation()

  • 自动旋转——启用自动旋转后,sensor.snapshot() 会利用 IMU 对帧进行翻转 / 镜像 / 转置。

  • rotation_corr()——新增 fovcorners(4 点透视)关键字参数,并附有透视校正示例。

  • lcd.init()——新增 bgr 关键字参数。

  • collections.deque——在 MicroPython 构建中启用。

  • 新增 sensor.OV7690sensor.HM01B0 id 常量,以及一个类似 numpy 的 ulab 图像滤波示例。

其他变更与改进

  • 大幅优化了图像滤波器(median / mode / mean / …)以及 find_circles() 和镜头校正;alloc_extra_fb 现在可以分配任意字节数;人体检测模型采用新的 average-pool 算子重新构建。

Bug 修复

摄像头与传感器:

  • 修复了 OV2640 sleep()(现在使用 COM2 待机寄存器而非掉电引脚)、FSYNC 引脚配置、HM01B0 的 HSYNC/VSYNC 极性和 I2C 地址/扫描、Portenta 传感器掉电 GPIO 和摄像头复位引脚,并在 IMU 俯仰角接近 90°/270° 时禁用自动旋转。

成像与系统:

  • 修复了一个图像滤波边界检查 bug、禁用 D-cache 时的硬故障、无 SD 卡的板卡上的启动问题、一个 tf.load()load_to_fb bug、人体检测栈溢出(H7 栈提升至 ≥12 KB),以及 OpenMV 4 Plus 上高速模式的 USB 描述符偏移问题。

硬件与板卡支持

  • Arduino Portenta H7——初始板卡启用(STM32H747 时钟/OSC/HSE 配置、CMSIS 头文件、ADC、SDRAM、Arduino USB PID)。

  • HIMAX HM01B0——全新的单色摄像头驱动(Bayer、外部振荡器时钟)。

  • OV7690——全新的摄像头驱动。

  • LSM6DS3 IMU——OpenMV 4 / Portenta。

破坏性 API 变更

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

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

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

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

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

sensor.set_framerate() 被移除 (minor)

无操作的 sensor.set_framerate() 占位函数被移除;现在调用它会引发 AttributeError。请移除该调用,改为通过 framesize/exposure 控制帧时序。(可用的 set_framerate() 在 v4.0.2 中重新引入。)

提交: 705e98f91

OpenMV Cam M7 上移除 TensorFlow (minor)

TensorFlow(tf 模块)在 OpenMV Cam M7 / OpenMV 3 上被禁用(已无法容纳)。在 M7 上执行 import tf 会失败——请使用 H7 级摄像头来运行 TensorFlow。(tf 在 v3.6.3 中于 F7 上重新启用。)

提交: 2ae875077

set_pixformat() / set_framesize() 返回 None (behavior)

sensor.set_pixformat()sensor.set_framesize() 现在返回 None 而非 True,且不支持的像素格式现在会引发 ValueError 而非断言错误。检查返回值的代码(例如 if sensor.set_pixformat(...):)必须不再这样做,捕获 AssertionError 以处理不支持格式的代码必须改为捕获 ValueError

提交: f314ac4e7

lens_corr() / linpolar() / logpolar() 要求偶数尺寸 (behavior)

image.lens_corr() 以及 image.linpolar() / image.logpolar() 现在要求图像宽度和高度均为偶数,奇数尺寸会引发错误。在调用这些方法前,请将图像裁剪或缩放为偶数尺寸。

提交: b36460a362b26ca17b

迁移检查清单

要干净地移植到 v3.6.1,典型的工作是:

  1. 移除 sensor.set_framerate() 调用(set_framerate 移除)。

  2. 将 TensorFlow 工作负载迁离 OpenMV Cam M7(M7 TensorFlow 变更)。

  3. 不再依赖 set_pixformat() / set_framesize() 的返回值,并为不支持的像素格式捕获 ValueError返回值变更)。

  4. 在调用 lens_corr() / linpolar() / logpolar() 前确保图像尺寸为偶数(偶数尺寸要求)。

所有其他脚本无需更改即可运行。