v2.4.0¶
v2.4.0 将 find_lines() 重写为霍夫变换检测器,新增了 find_line_segments()、find_datamatrices() 数据矩阵解码、sensor.set_vsync_output()、图像切片读写,以及许多新的缩放分辨率以获得更高的帧率。find_lines()、match_descriptor() 和 skip_frames() 发生了变化 —— 请阅读下方的破坏性变更。
亮点¶
find_lines()—— 重写为霍夫变换直线检测器,返回直线对象(现在可用于 RGB565,而不仅仅是灰度图像)。find_line_segments()—— 检测有限长度的线段。find_datamatrices()—— 数据矩阵解码。sensor.set_vsync_output()—— 在 I/O 引脚上驱动 VSYNC 以实现摄像头同步。更多分辨率 —— 许多额外的缩放分辨率,以获得更高的帧率。
破坏性变更:
find_lines()、match_descriptor()和skip_frames()发生了变化 —— 请参阅破坏性变更。
新功能¶
image.find_line_segments()—— 查找非无限长的线段;直线对象新增了.length()访问器。image.find_datamatrices()—— 数据矩阵解码,并附带示例脚本。sensor.set_vsync_output(pin)—— 在 GPIO 引脚上输出 VSYNC 信号以实现摄像头同步(OpenMV 2 / OpenMV 3)。图像切片 —— 图像下标 / 缓冲区协议现在支持读取和写入图像数据的切片。
新增了许多额外的缩放分辨率 / 帧大小组合以支持更高的帧率;
clock.fps()现在每 2 秒重置一次其累加器,使报告的 FPS 能跟踪最近的速率。
其他变更与改进¶
当分辨率 ≤ VGA 时,OV7725 会被窗口化为 QVGA(在高采集速率下减少丢帧),其 PLL 被设置为 6×,并降低了外部时钟(OpenMV 2 为 48 MHz,OpenMV 3 为 54 MHz),从而改变了传感器的帧时序。
缺陷修复¶
成像:
修复了
compress_for_ide()缓冲区大小错误(起始/结束标记)、QR 解码(以及上游 quirc 单元位图索引和对齐图案边界修复)。
传感器与连接:
降低了 OpenMV 2 传感器时钟以配合更高的传感器 PLL(摄像头初始化/同步),并使 WINC 的
socket.recvfrom()返回实际接收到的大小(在大小为非正值时报错,而不是返回过时的值)。
硬件与开发板支持¶
支持
sensor.set_vsync_output()的 GPIO 引脚 VSYNC 输出(OpenMV 2 / OpenMV 3)。OpenMV 3 —— 启用了
pyb.UARTUART1。
破坏性 API 变更¶
v2.3.0 与 v2.4.0 之间面向用户的 API 破坏性变更。范围:modules/ 中的 Python C 模块和 scripts/libraries/ 中的 Python 库。
每项变更都标注了其影响:
major —— 影响大多数使用该功能的脚本;你需要移植代码。
minor —— 范围较窄的 API;仅影响使用了它的脚本。
behavior —— API 相同,但结果不同;请重新检查经过调优的脚本。
变更按影响程度依此顺序分组。如果你只想移植代码,可直接跳到末尾的 迁移清单。每个提交哈希都链接到其在 GitHub 上的差异。
find_lines() 重写为霍夫检测器 (major)¶
image.find_lines() 被重写为霍夫变换检测器。它不再返回 (x1, y1, x2, y2) 元组的列表 —— 而是返回直线对象(.line() / .x1() / .y1() / .x2() / .y2() / .theta() / .rho() / .magnitude())—— 并且现在也可用于 RGB565(而不仅仅是灰度图像)。threshold 参数从 0.0–1.0 的浮点数改为整数边缘幅值总和,line.magnitude 现在是整数,并新增了 theta_margin / rho_margin 关键字。请将元组解包代码移植到直线对象上,并重新调优 threshold。
match_descriptor() 返回一个匹配对象 (minor)¶
image.match_descriptor()(ORB)现在返回一个 kptmatch 对象,带有 .cx() / .cy() / .x() / .y() / .w() / .h() / .count() / .theta() / .rect() 访问器,而不是一个普通的 8 元组。该对象仍可下标访问/切片,因此按位置索引仍然有效,但使用 isinstance(result, tuple)(或使用元组方法)的代码必须改用新的访问器。
提交: e960546b6
sensor.skip_frames() 现在基于时间 (behavior)¶
sensor.skip_frames() 经过重新设计,现在接受一个 time= 关键字(默认约 300 ms),并且默认基于时间而非运行固定的帧数,一旦时间耗尽即提前停止。依赖精确帧数的脚本应传入明确的帧数和/或相应地设置 time=。
提交: a039b5d1c
迁移清单¶
要顺利移植到 v2.4.0,通常需要完成以下工作:
将
find_lines()的元组解包移植到直线对象上,并重新调优整数threshold(find_lines 重写)。使用
kptmatch访问器,而不是将match_descriptor()的结果当作元组处理(match_descriptor 变更)。如果你依赖固定的帧数,请向
sensor.skip_frames()传入明确的帧数和/或time=(skip_frames 变更)。
所有其他脚本无需修改即可运行。