2015-04-14 22 views
5

như tiêu đề cho biết, câu hỏi của tôi là về giá trị trả về do hàm calibrateCamera cung cấp từ OpenCv.Ý nghĩa của giá trị trả lại trong cv2.CalibrateCamera

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

Tôi có một thực hiện functionnal trong python để tìm các thông số nội tại và các hệ số distorsion của một máy ảnh sử dụng một màu đen & lưới Trắng.

Câu hỏi đặt ra nhiều hơn về khoảng thời gian trả lại do hàm trả về. Nếu tôi hiểu chính xác thì đó là "lỗi chiếu lại trung bình. Con số này đưa ra ước tính chính xác về các thông số tìm thấy. Điều này sẽ càng gần bằng không." như mentionned trong

http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

chính xác là gì một giá trị gần như gần bằng không càng tốt nghĩa là gì?

Ví dụ khi tôi làm điều đó cho webcam Logitech tôi:

RMS: 0.702660793513

camera ma trận:

[[ 616.30868126 0.   339.02126978] 
[ 0.   605.08224927 241.64607568] 
[ 0.   0.   1.  ]] 

Méo hệ số:

[ 0.19805527 -0.62915986 0.00924648 0.02618232 1.02491764] 

Trong trường hợp này, Làm thế nào để lỗi định lượng chất lượng của p nội tại ước lượng đường kính?

EDIT:

Vì vậy, tôi đã đi tìm câu trả lời và đào một chút sâu hơn và kiểm tra việc thực hiện cpp của chức năng này.

Đây là chức năng tính toán giá trị lỗi này:

static double computeReprojectionErrors(
     const vector<vector<Point3f> >& objectPoints, 
     const vector<vector<Point2f> >& imagePoints, 
     const vector<Mat>& rvecs, const vector<Mat>& tvecs, 
     const Mat& cameraMatrix, const Mat& distCoeffs, 
     vector<float>& perViewErrors) 
{ 
    vector<Point2f> imagePoints2; 
    int i, totalPoints = 0; 
    double totalErr = 0, err; 
    perViewErrors.resize(objectPoints.size()); 

    for(i = 0; i < (int)objectPoints.size(); i++) 
    { 
     projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i], 
         cameraMatrix, distCoeffs, imagePoints2); 
     err = norm(Mat(imagePoints[i]), Mat(imagePoints2), NORM_L2); 
     int n = (int)objectPoints[i].size(); 
     perViewErrors[i] = (float)std::sqrt(err*err/n); 
     totalErr += err*err; 
     totalPoints += n; 
    } 

    return std::sqrt(totalErr/totalPoints); 
} 

Lỗi này được tính toán xem xét tvecs và rvecs tìm thấy với cv2.CalibrateCamera, nó chiếu lại điểm sử dụng cho việc tìm kiếm những dịch và xoay vectơ và tính toán khoảng cách euclidian giữa điểm được tái chiếu và tọa độ thực tế của các điểm đó.

Tôi không nghĩ rằng lỗi này được giới hạn trong [0,1] nhưng thay vào đó phụ thuộc vào phạm vi tọa độ được sử dụng để hiệu chuẩn. Vì vậy, nó phụ thuộc vào độ phân giải của hình ảnh được sử dụng để hiệu chuẩn.

Ai đó có thể xác nhận/bác bỏ điều này không?

+1

[Github OpenCV cho Calibrate Camera:] (https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp) – David

Trả lời

6

calibrateCamera trả về lỗi chiếu lại trung bình của phương tiện gốc (RMS), thường là từ 0,1 đến 1,0 pixel khi hiệu chuẩn tốt.
Việc tính toán được thực hiện bằng cách chiếu các điểm bàn cờ 3D (objectPoints) vào mặt phẳng ảnh bằng cách sử dụng tập cuối cùng của các thông số hiệu chuẩn (cameraMatrix, distCoeffs, rvecstvecs) và so sánh các vị trí đã biết của các góc (imagePoints).

Lỗi RMS là 1,0 nghĩa là, trung bình, mỗi điểm dự kiến ​​này cách vị trí thực tế của nó là 1,0 px.Lỗi không bị giới hạn trong [0, 1], nó có thể được coi là khoảng cách.

Các vấn đề liên quan