在嵌入式視覺系統開發中,STM32憑藉其高效能與低功耗特性,成為工業檢測、機器人導航等領域的熱門選擇。然而,受限於攝像頭硬體的非理想性,影像畸變問題普遍存在,直接影響測量精度與識別效果。本文將深入探討STM32平臺下相機標定與畸變矯正演算法的移植實現,助力開發者構建精度要求較高的視覺系統。
一、相機標定:視覺系統的“體檢”與“校準”
相機標定是視覺開發的第一步,其核心是透過數學模型量化攝像頭內參(焦距、主點座標、畸變係數)與外參(旋轉、平移矩陣)。以STM32MP157開發板搭配OV5640攝像頭為例,標定過程需完成以下關鍵步驟:
裝置樹配置
在STM32的Linux核心裝置樹中,需新增DCMI介面與OV5640節點,定義GPIO引腳複用功能及電源管理引數。例如,透過pinctrl-names與pinctrl-0屬性配置DCMI介面的引腳對映,有助於支援攝像頭資料能正確傳輸至STM32。標定板採集
使用棋盤格標定板(建議內部角點數7×9至11×8),從不同角度、距離拍攝15-20張影像。拍攝時需支援標定板佔據影像1/3至1/2面積,避免過度曝光或欠曝。例如,在OpenCV中可透過findChessboardCorners函式檢測角點,結合cornerSubPix實現亞畫素級精度最佳化。引數計算
呼叫OpenCV的calibrateCamera函式,輸入標定板世界座標與影像座標對應關係,計算內參矩陣mtx與畸變係數dist。實測中,重投影誤差需控制在0.1畫素以內,例如某專案透過最佳化標定板角度與光照條件,將誤差從0.3畫素降至0.08畫素。
二、畸變矯正:從“扭曲”到“真實”的影像還原
影像畸變主要分為徑向畸變(桶形/枕形)與切向畸變(透鏡安裝偏差),矯正需結合內參與畸變係數進行非線性變換。STM32平臺下推薦以下兩種實現方式:
OpenCV
undistort函式
適用於單幀影像快速矯正,直接呼叫cv2.undistort(img, mtx, dist)即可完成。但即時影片流處理時,該方法效率較低,例如在STM32H7上處理720P影像時幀率僅15FPS。initUndistortRectifyMap+remap組合
透過預計算對映表提升效率,步驟如下:呼叫
initUndistortRectifyMap生成對映表mapx與mapy;對每幀影像呼叫
remap應用對映表,實現即時矯正。
實測在STM32H7上幀率提升至30FPS,滿足工業檢測需求。
程式碼示例(基於OpenCV):
cpp// 計算對映表cv::Mat mapx, mapy;cv::initUndistortRectifyMap(mtx, dist, cv::Mat(), mtx, img_size, CV_32FC1, mapx, mapy);// 即時矯正cv::Mat dst;cv::remap(src_img, dst, mapx, mapy, cv::INTER_LINEAR);
三、STM32平臺移植關鍵點
記憶體最佳化
STM32多數型號無FPU,需將浮點運算轉為定點化。例如,將增益係數放大100倍儲存為整數,運算時透過temp /= 100還原,實測在STM32F407上處理2048點資料耗時僅1.2ms。Flash儲存
標定引數(內參、畸變係數)需存入內部Flash,但需注意寫入壽命(約10萬次)。建議採用專用頁管理,例如將引數存入Flash末尾扇區,避免影響程式執行。即時性支援
對於高速掃描場景,需結合ADC+DMA+定時器觸發機制實現資料採集與矯正並行。例如,配置TIM2產生PWM波觸發ADC啟動轉換,透過DMA迴圈模式持續傳輸資料,有助於支援幀率穩定。
四、應用場景與效果驗證
工業檢測
某電子廠採用STM32H7+OV5640方案檢測PCB板元件位置,透過標定與矯正將測量誤差從0.5mm降至0.1mm,良品率有所提升。機器人導航
在AGV小車專案中,矯正後的影像使SLAM演算法建圖精度有所提升,路徑規劃成功率保持在專案要求範圍內。
線上諮詢
電話諮詢
微信諮詢
回到頂部