首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

攝像頭標定與畸變校正:OpenCV 完整實作指南

     編輯:關於C++

攝像頭標定基礎知識

攝像頭模型採用針孔成像模型,誤差參數分三類:

  • 內參 (4 個):焦距 fx, fy、光學中心 cx, cy,以 3×3 矩陣 A = [fx 0 cx; 0 fy cy; 0 0 1] 表示。
  • 畸變參數 (5 個):
    • 徑向畸變 k1, k2, k3(透鏡形狀導致,邊緣畸變大)
    • 切向畸變 p1, p2(透鏡與影像平面不平行導致)
  • 外參 (6 個):旋轉向量 3 個、平移向量 3 個,描述相機在世界座標系中的位姿。

OpenCV 標定流程與關鍵函式

1. 取得資料來源

讀取棋盤格影片或多張圖片。

2. 提取棋盤格角點

// 找角點
cvFindChessboardCorners(image, pattern_size, corners, &corner_count,
    CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_NORMALIZE_IMAGE);

// 亞像素精度優化
cvFindCornerSubPix(image, corners, count, win, zero_zone, criteria);

參數說明:pattern_size 為每行列內角點數;flags 控制自適應閾值、亮度均衡化、四邊形過濾等。

3. 標定求解參數

cvCalibrateCamera2(object_points, image_points, point_counts, image_size,
    intrinsic_matrix, distortion_coeffs, rotation_vectors, translation_vectors, flags);
  • object_points:世界座標系中的棋盤格角點位置(3D)。
  • image_points:影像平面上偵測到的角點座標(2D)。
  • flags:可固定主點、長寬比、切向畸變為零等約束條件。

4. 影像畸變校正

兩種方法:

  1. 映射表法(推薦,效能佳):
    cvInitUndistortMap(intrinsic_matrix, distortion_coeffs, mapx, mapy);
    cvRemap(src, dst, mapx, mapy, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS);
    
    預先計算映射表,重複校正時直接套用,避免重複計算。
  2. 單步函式法:
    cvUndistort2(src, dst, camera_matrix, distortion_coeffs, new_camera_matrix);
    
    簡便但每次皆重算映射,效率較低。

實驗結果展示

完整程式碼可參考 OpenCV 官方範例 calibration.cpp,本文重點在流程與參數解析。如需原始碼請留言聯繫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved