v2.4.0

v2.4.0 將 find_lines() 重寫為 Hough 變換偵測器,新增 find_line_segments()find_datamatrices() data-matrix 解碼、sensor.set_vsync_output()、影像切片讀寫,以及許多新的縮放影格大小以獲得更高的 FPS。find_lines()match_descriptor()skip_frames() 已變更 — 請閱讀下方的破壞性變更。

重點摘要

  • find_lines() — 重寫為 Hough 變換直線偵測器,回傳直線物件(現在可用於 RGB565,而不僅限於灰階)。

  • find_line_segments() — 偵測有限長度的線段。

  • find_datamatrices() — data-matrix 解碼。

  • sensor.set_vsync_output() — 在 I/O 接腳上驅動 VSYNC 以進行相機同步。

  • 更多影格大小 — 許多額外的縮放解析度以獲得更高的 FPS。

  • 破壞性變更: find_lines()match_descriptor()skip_frames() 已變更 — 請參閱破壞性變更。

新功能

  • image.find_line_segments() — 尋找非無限長的線段;直線物件新增了 .length() 存取器。

  • image.find_datamatrices() — data-matrix 解碼,附帶範例指令碼。

  • 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 的 cell-bitmap 索引與對齊圖案邊界修正)。

感測器與連線:

  • 降低 OpenMV 2 感測器時脈以配合較高的感測器 PLL(相機初始化/同步),並使 WINC socket.recvfrom() 回傳實際接收到的大小(在大小非正值時報錯,而非回傳過時的數值)。

硬體與開發板支援

  • GPIO 接腳上的 VSYNC 輸出(OpenMV 2 / OpenMV 3),作為 sensor.set_vsync_output() 的支援。

  • OpenMV 3 — 啟用 pyb.UART UART1。

破壞性 API 變更

v2.3.0 與 v2.4.0 之間使用者可見的 API 破壞性變更。範圍:modules/ 中的 Python C 模組與 scripts/libraries/ 中的 Python 函式庫。

每項變更都標註了其影響程度:

  • major(重大)— 影響大多數使用該功能的指令碼;您將需要移植程式碼。

  • minor(次要)— 範圍狹窄的 API;僅影響使用它的指令碼。

  • behavior(行為)— API 相同,但結果不同;請重新檢查經過調校的指令碼。

變更按上述影響順序分組。如果您只是想移植程式碼,請直接跳至末尾的 遷移檢查清單。每個 commit hash 都連結至其在 GitHub 上的 diff。

find_lines() 重寫為 Hough 偵測器 (major)

image.find_lines() 已重寫為 Hough 變換偵測器。它不再回傳 (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

Commits: 31b7b5bf3f4a9c6154

match_descriptor() 回傳一個 match 物件 (minor)

image.match_descriptor()(ORB)現在回傳一個帶有 .cx() / .cy() / .x() / .y() / .w() / .h() / .count() / .theta() / .rect() 存取器的 kptmatch 物件,而非單純的 8 元組。該物件仍可下標/切片,因此位置索引仍可運作,但使用 isinstance(result, tuple)(或使用元組方法)的程式碼必須改用新的存取器。

Commits: e960546b6

sensor.skip_frames() 現在以時間為基準 (behavior)

sensor.skip_frames() 已改為接受 time= 關鍵字(預設約 300 ms),現在預設以時間為基準,而非執行固定的影格數,一旦經過該時間即提前停止。依賴精確影格數的指令碼應傳入明確的影格數以及/或相應地設定 time=

Commits: a039b5d1c

遷移檢查清單

若要乾淨地移植至 v2.4.0,典型的工作為:

  1. find_lines() 的元組解包移植至直線物件,並重新調校整數的 thresholdfind_lines 重寫)。

  2. 改用 kptmatch 存取器,而非將 match_descriptor() 的結果當作元組處理(match_descriptor 變更)。

  3. 如果您依賴固定的影格數,請向 sensor.skip_frames() 傳入明確的影格數以及/或 time=skip_frames 變更)。

其餘所有指令碼皆可不經修改直接執行。