v3.0.0

v3.0.0 是重大的 v2 → v3 版本。它引入了 OpenMV Cam M7(STM32F7)和全新的 nn CMSIS-NN 神经网络模块(取代旧的硬编码 find_number() / classify_object() 方法),新增 MT9V034 全局快门FLIR Lepton 传感器支持、sensor.WVGA 帧大小,并将核心更新至 MicroPython 1.9.4。多个 image / sensor / WiFi 行为发生了变化——请阅读下方的重大变更说明。

亮点

  • OpenMV Cam M7 —— 全新的 STM32F7 开发板。

  • nn 模块 —— CMSIS-NN 推理:nn.load()Net.forward()Net.search(),附带模型转换器和示例。

  • 新增传感器 —— MT9V034 全局快门(FSIN 触发)和 FLIR Lepton。

  • MicroPython 1.9.4 核心更新。

  • 重大变更: 移除了硬编码的 image.find_number() / image.classify_object()sensor.sleep() 现在会抛出异常,WINC 套接字返回真实的字节计数,image.binary() 返回一张新图像,find_apriltags() 被限制在 64K 像素以内——参见重大变更说明。

新增功能

  • nn —— 全新的 CMSIS-NN 神经网络模块:nn.load(path)Net.forward(img, roi=, softmax=, dry_run=)(返回 0.0–1.0 的浮点数)、用于多尺度/多位置检测的 Net.search() 以及 Net.test(),外加一个 CMSIS-NN 模型转换器(nn_convert.py / nn_quantizer.py)、内置的 CIFAR-10 / LeNet / smile 模型,以及 NN / NN-search 示例脚本。

  • 传感器 —— OpenMV 4 上的 MT9V034 全局快门支持(FSIN 触发快照)、带 Lepton 快照的更新版 FLIR Lepton 驱动,以及新的 sensor.WVGA(720x480)/ sensor.WVGA2(752x480)帧大小。

  • 成像 —— image.find_circles() 新增了 r_min / r_max / r_step 关键字参数(更快的 Hough 变换),find_keypoints() 和 Haar find_features() 现在接受 RGB 图像,image.compress() / JPEG 编码现在支持二值(位图)图像。

  • 启动 —— boot.py 现在在 USB 初始化之前运行,因此它可以覆盖 USB 模式(例如 HID)。

  • 示例 —— 新增了小尺寸/高分辨率 AprilTag 示例、一个 I2C LIDAR-Lite V3 示例,以及数据集工具(augment_images.py / make_patches.py)。

其他变更与改进

  • 将内置的 MicroPython 更新至 1.9.4(包含一次 pyexec 解析/编译/执行的回退和 PendSV 修复);更清晰的 fb_alloc / xalloc 内存不足错误信息;抑制了网络加载期间 nn 的 printf 噪声;重组了仓库结构(示例 → scripts/,工具 → tools/,Haar 级联 → ml/)。nn 模块在 OpenMV 2 上不可用(闪存不足)。

错误修复

成像:

  • 修复了 x≤0 时的 fast_atan2f(之前始终为 0——请重新检查色块/直线/关键点的角度)、find_apriltags() 的内存处理(内存不足时丢弃内容和错误的 realloc)、二值/位图的逐 bpp 行指针(损坏的二值结果)、带 ROI 的 find_edges(EDGE_CANNY)TO_GS_PIXEL 宏(积分图/形态学)、灰度(bpp==0)帧的位图/JPEG 流传输、关键点/色块列表的 pop_front,以及 match_descriptor 的结果。

系统与摄像头:

  • 修复了 USB HID 接口/端点编号、运行时动态更改 XCLK 频率、Net.forward() 返回正确数量的输出,以及中断脚本解析时的硬错误。

硬件与板级支持

  • OpenMV Cam M7 (STM32F7) —— 全新开发板。

  • MT9V034 全局快门传感器(OpenMV 4,FSIN 触发)。

  • FLIR Lepton —— 带快照支持的更新版驱动。

重大 API 变更

v2.9.0 与 v3.0.0 之间面向用户的 API 变更。范围:modules/ 中的 Python C 模块和 scripts/libraries/ 中的 Python 库。

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

  • 重大 —— 影响大多数使用该功能的脚本;你需要移植代码。

  • 影响较小 —— 范围狭窄的 API;仅影响使用了它的脚本。

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

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

image.find_number() / image.classify_object() 被移除 (重大)

硬编码的 image.find_number()(LeNet)和 image.classify_object()(CMSIS CNN)方法已被移除,转而使用新的 nn 模块。请用 net = nn.load('/model.network'); out = net.forward(img) 替换它们。

提交: d151f7e38

sensor.sleep() / sensor.reset() 失败时抛出异常 (影响较小)

sensor.sleep()sensor.reset() 现在在失败时抛出异常,而不是返回 True / False。检查 sensor.sleep() 布尔返回值的代码必须改为用 try / except 包裹该调用。

提交: 7d16d008f

WINC 套接字返回真实的字节计数 (行为)

WINC1500 套接字的 send / recv / sendto / recvfrom 方法之前始终返回 0;它们现在返回实际传输的字节数。假定返回 0 的代码(或对其循环/阻塞的代码)必须处理真实的计数。

提交: a07fb2f60

image.binary() 返回一张新图像 (行为)

image.binary() 新增了 to_bitmap / copy 关键字参数,现在返回一个新的图像对象,而不是就地返回/修改源图像。依赖 binary() 修改原始图像的代码应改用返回的对象(并传入 copy=True 以获得非就地行为)。

提交: 8a44f0cd9

find_apriltags() 被限制在 64K 像素以内 (行为)

如果图像(或 ROI)超过 64K 像素,image.find_apriltags() 现在会抛出异常;对于小于 4x4 的图像则返回空列表。在调用 find_apriltags() 之前请缩小大图像(使用更小的 framesize 或传入显式的 roi)。

提交: bd77afbc0

迁移清单

要顺利移植到 v3.0.0,通常需要做的工作有:

  1. nn 模块替换 image.find_number() / image.classify_object()nn 迁移)。

  2. try / except 包裹 sensor.sleep() / sensor.reset(),而不是检查布尔返回值(sensor.sleep 变更)。

  3. 处理 WINC 套接字 send / recv 返回的真实字节计数(WINC 套接字变更)。

  4. 使用 image.binary() 返回的图像,而不是期望就地修改(binary 变更)。

  5. find_apriltags() 之前缩小图像,使其保持在 64K 像素以内(find_apriltags 限制)。

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