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.UARTUART1。
破壞性 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。
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,典型的工作為:
將
find_lines()的元組解包移植至直線物件,並重新調校整數的threshold(find_lines 重寫)。改用
kptmatch存取器,而非將match_descriptor()的結果當作元組處理(match_descriptor 變更)。如果您依賴固定的影格數,請向
sensor.skip_frames()傳入明確的影格數以及/或time=(skip_frames 變更)。
其餘所有指令碼皆可不經修改直接執行。