- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
cv::ccalib::CustomPattern 是OpenCV的 ccalib 模塊中的一個類,主要用于自定義標定板的檢測和處理。這個模塊提供了比傳統的 calib3d 模塊更高級的相機標定功能。
函數calibrate是 cv::ccalib::CustomPattern 類中的一個靜態方法,用于基于自定義標定圖案進行相機標定。它的作用與 OpenCV 中經典的 cv::calibrateCamera() 非常相似,但針對的是使用自定義標定板的情況。
該函數的作用是根據多個視角下檢測到的 世界坐標系點(objectPoints) 和 圖像坐標系點(imagePoints) 來計算相機的內參矩陣和畸變系數,并可選地返回每幀圖像對應的旋轉向量和位移向量。
它是一個封裝了標定流程的方法,適用于那些通過 CustomPattern 檢測得到角點或特征點的場景。
函數原型
double cv::ccalib::CustomPattern::calibrate
(InputArrayOfArrays objectPoints,InputArrayOfArrays imagePoints,Size imageSize,InputOutputArray cameraMatrix,InputOutputArray distCoeffs,OutputArrayOfArrays rvecs,OutputArrayOfArrays tvecs,int flags = 0,TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON)
)
參數
參數名 | 類型 | 描述 |
---|---|---|
objectPoints | InputArrayOfArrays | 各視圖中 3D 空間點集合,通常為 std::vector<std::vectorcv::Point3f> 類型。每個子 vector 表示一張圖的世界坐標點。 |
imagePoints | InputArrayOfArrays | 各視圖中對應的 2D 圖像點集合,通常為 std::vector<std::vectorcv::Point2f> 類型。每個子 vector 是檢測到的圖像上的角點。 |
imageSize | Size | 圖像尺寸,如 Size(640, 480),用于初始化內參矩陣等。 |
cameraMatrix | InputOutputArray | 輸出/輸入的相機內參矩陣(3x3),可以傳入已知值作為初始估計。 |
distCoeffs | InputOutputArray | 輸出/輸入的畸變系數(1x5 或 1x8),格式為 (k1, k2, p1, p2, [k3, [k4, k5, k6]])。 |
rvecs | OutputArrayOfArrays | 輸出每個視圖的旋轉向量(可為 std::vectorcv::Mat 或 std::vectorcv::Vec3d>)。 |
tvecs | OutputArrayOfArrays | 輸出每個視圖的平移向量(同上)。 |
flags | int | 標志位,控制標定行為。常用選項如下: - CALIB_USE_INTRINSIC_GUESS: 使用提供的內參初始值 - CALIB_FIX_PRINCIPAL_POINT: 固定主點不優化 - CALIB_ZERO_TANGENT_DIST: 不優化切向畸變 - CALIB_FIX_K1~K6: 固定某些徑向畸變系數 |
criteria | TermCriteria | 迭代優化終止條件,默認為最多迭代30次或精度達到浮點誤差級別。 |
代碼示例
#include <opencv2/ccalib.hpp>
#include <opencv2/opencv.hpp>int main()
{// 假設我們已經用 CustomPattern 檢測到了多組 objectPoints 和 imagePointsstd::vector< std::vector< cv::Point3f > > objectPoints;std::vector< std::vector< cv::Point2f > > imagePoints;// 示例數據(實際應由 detectPattern 得到)for ( int i = 0; i < 10; ++i ){std::vector< cv::Point3f > obj;std::vector< cv::Point2f > img;// 填充一些世界坐標和圖像坐標for ( int x = 0; x < 5; ++x )for ( int y = 0; y < 5; ++y )obj.push_back( cv::Point3f( x * 10, y * 10, 0 ) );// 假設圖像點是隨機生成的for ( int j = 0; j < 25; ++j )img.push_back( cv::Point2f( rand() % 640, rand() % 480 ) );objectPoints.push_back( obj );imagePoints.push_back( img );}cv::Mat cameraMatrix = cv::Mat::eye( 3, 3, CV_64F ); // 初始化內參cv::Mat distCoeffs = cv::Mat::zeros( 8, 1, CV_64F ); // 畸變系數std::vector< cv::Mat > rvecs, tvecs;cv::ccalib::CustomPattern pattern;double error =pattern.calibrate( objectPoints, imagePoints, cv::Size( 640, 480 ), cameraMatrix, distCoeffs, rvecs, tvecs, 0, cv::TermCriteria( cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 30, 1e-6 ) );std::cout << "Reprojection Error: " << error << std::endl;std::cout << "Camera Matrix:\n" << cameraMatrix << std::endl;std::cout << "Distortion Coefficients:\n" << distCoeffs << std::endl;return 0;
}
運行結果
Reprojection Error: 243.176
Camera Matrix:
[145.5314351146498, 0, 319.4999999809153;0, 111.8716131818644, 239.5000000023377;0, 0, 1]
Distortion Coefficients:
[-0.02024007664987641;5.558029159131296e-05;0.0006431802159707427;-0.0009573062145439125;-3.54839696095315e-08]