4.20. 總結

你已經逐一了解了相機成像堆疊中每次指令碼擷取影格時都會涉及的各個部分:

  • 感測器前方的光學元件——以針孔作為最簡單的成像元件,接著是鏡頭,鏡頭在仍能聚焦的同時匯集了多得多的光線,並以焦距、光圈、景深與視野作為應用可從中挑選的調整旋鈕。真實的鏡頭會帶有畸變、暈影以及主光線角效應,這些後續由感測器與 ISP 補償。

  • 感測器網格——一個將光子轉換為電荷的二維光電二極體陣列,曝光時間與類比增益在亮度與運動模糊及雜訊之間取得平衡。捲簾式與全域快門決定陣列各列如何讀出,而一小組晶片上的校正——欄位 FPN、黑階、缺陷像素、鏡頭遮光——在資料離開晶片之前先將其清理乾淨。有兩條匯流排將晶片連接到 MCU:一條用於暫存器的慢速 I2C 控制匯流排,以及一條用於像素的快速並列或 MIPI 匯流排。

  • 色彩與 ISP——拜耳(Bayer)色彩濾光陣列為每個像素賦予紅、綠、藍其中之一;去拜耳(debayering)則內插出缺少的另外兩個通道。影像訊號處理器將處理流程的其餘部分串接起來——統計擷取、自動白平衡、去拜耳、色彩矩陣校正、伽瑪、縮放、裁切,以及最後封裝成所要求的像素格式。

  • 像素格式——原始拜耳、RGB888、RGB565、YUV422、灰階、BINARY,以及壓縮過的 JPEG / PNG 輸出,在記憶體大小與色彩保真度及下游演算法相容性之間取得平衡。RGB565 是完成後色彩的預設格式,因為它與 MCU 的字組寬度對齊,並相對於 RGB888 將記憶體成本減半。

  • CSI API——五行設定加上一個快照迴圈,是每個指令碼的起始形態。影格緩衝區池(單、雙、三緩衝、視訊 FIFO 或觸發式)決定應用與相機如何共用影格;一個獨立的預覽通道為所連接的任何除錯程式供應影像,而不會爭用應用的緩衝區;感測器旋鈕涵蓋方向、曝光、增益、白平衡、影格率上限,以及一個彩條測試圖樣。

  • 多個感測器與記憶體池——配備兩個感測器的開發板會為每個晶片實例化一個 CSI,並讓每個感測器以各自的速率運行。在底層,影格緩衝區池、預覽區域、MicroPython 堆積,以及較小的快速記憶體配置,分別位於 RAM 的不同區域中,這樣的擺放方式讓需要速度的部分得到速度,而只需要容量的部分則得到容量。

這樣便足以將影格以適合該場景的格式、影格大小與曝光從感測器中取出;挑選一個與應用處理時間相匹配的影格緩衝區模式;向所連接的任何裝置提供即時預覽;並將 Image 讀回 Python 中,準備好對其進行操作。

4.20.1. 日後使用本參考資料

請將成像相關的章節視為參考材料,而非一次讀完的內容。回頭來複習影格緩衝區模式、像素格式,或某個特定感測器旋鈕的含義,正是其預期的用途。當問題只是「這個呼叫的確切名稱到底是什麼」時,csi.CSI 參考頁面在同一處列出了每一個方法。

4.20.2. 接下來該往哪裡去

影像處理是順理成章的下一個主題。手中有了緩衝區,並理解了 csi API 之後,剩下的就是要對像素什麼:閾值、邊緣偵測、色塊尋找、線條與形狀偵測、QR 碼、AprilTag、機器學習推論。工具集轉移到 image 模組及其在 Image 物件上的方法目錄。本節中的一切都會延續下去;迴圈形態、影格緩衝區模式、像素格式——這一切都是影像處理方法所操作的對象。