2011-05-13 29 views
22

Bối cảnh:Giá trị trả lại "chấp nhận được" từ cv :: calibrateCamera là gì?

Tôi hiện đang làm việc trên dự án tầm nhìn âm thanh nổi bằng cách sử dụng OpenCV. Tôi đang cố gắng tạo ra một bản đồ khác biệt từ một tập hợp của hai hình ảnh đã chỉnh sửa, nhưng tôi không nhận được kết quả mà tôi mong đợi. Khi nhìn vào hình ảnh được chỉnh sửa, có một sự thay đổi dọc dọc giữa các hình ảnh, không nên ở đó sau khi sửa chữa. Tôi hiện đang tìm kiếm lỗi có thể là gì. Mã của tôi dựa trên hiệu chuẩn âm thanh nổi và mã tương ứng từ sách OpenCV và this example. Tôi sử dụng giao diện C++ của OpenCV. Phiên bản OpenCV của tôi là 2.1, từ kho lưu trữ Ubuntu 11.04.

phiên bản ngắn của câu hỏi:

RMS gì giá trị trả về là có thể chấp nhận đối với các chức năng:

double cv::calibrateCamera(...) 

Tôi hiện hiệu chỉnh mỗi camera sử dụng một bộ ~ 20 cặp hình ảnh bàn cờ. Máy ảnh là hai con mắt PS3 giống hệt nhau (với độ phân giải 640 * 480 pixel) được gắn bên cạnh nhau. cv::calibrateCamera trả về lỗi RMS giữa và (Tôi đã có kết quả khác nhau với các bộ hình ảnh khác nhau). Đây có phải là giá trị chấp nhận được cho độ phân giải hình ảnh này hay tôi nên cố gắng để có được hình ảnh bàn cờ tốt hơn?

phiên bản Long (chi tiết, mẫu mã):

Để có được làm việc tầm nhìn stereo; đầu tiên, tôi muốn chắc chắn rằng thói quen hiệu chỉnh máy ảnh hoạt động chính xác. Tôi sử dụng một loạt các hình ảnh bàn cờ để hiệu chỉnh thiết lập âm thanh stereo của tôi, như vậy:

// Find chessboard corners 
cv::Mat left = ... //Load image 
vector<cv::Point2f> points; 

bool found = cv::findChessboardCorners(left, patternSize, points, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE); 
if(found) 
    cv::cornerSubPix(left, points, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); 
imagePointsLeft.push_back(points); 

Tôi làm điều này đối với một số cặp hình ảnh và đặt các điểm dẫn đến imagePointsLeftimagePointsRight. Tôi đã chạy một kiểm tra trong một chương trình riêng biệt trên cùng một hình ảnh, nơi tôi trực quan xác nhận rằng hình ảnh trái và phải đăng ký chính xác tất cả các góc, theo thứ tự, sử dụng cv::drawChessboardCorners. Đối với mỗi cặp hình ảnh tôi cũng điền vào một tập hợp các đối tượng phối như sau:

vector<cv::Point3f> obj; 
for(int i = 0; i < ny; i++) 
    for(int j = 0; j < nx; j++) 
    obj.push_back(cv::Point3f(i*squareSize,j*squareSize,0.0)); 
objectPoints.push_back(obj); 

sau đó tôi cố gắng để hiệu chỉnh máy ảnh với những hình ảnh này:

double rms = cv::calibrateCamera(objectPoints, imagePointsLeft, m_imageSize, m_cameraMatrixLeft, m_distortionMatrixLeft, rvecsLeft, tvecsLeft); 

tôi sử dụng intrinsics camera từ chức năng này khi tôi gọi cv::stereoCalibrate bằng cách sử dụng cờ CV_CALIB_FIX_INTRINSIC (cách hiệu chỉnh âm thanh nổi này được đề xuất trong tài liệu, here).

Tôi tiếp tục gọi cv::stereoRectifycv::initUndistortRectifyMap, sau này cho cả hai máy ảnh. Các hình ảnh được chỉnh sửa được tạo ra với cv::remap bằng cách sử dụng đầu ra của initUndistortRectifyMap và nguồn cấp dữ liệu của máy ảnh. Cả hai hình ảnh chỉ chứa các pixel hợp lệ (không có vùng màu đen). Vấn đề của tôi là các pixel của một hàng nhất định không khớp với cùng một hàng trong hình ảnh khác (có một độ lệch dọc nhỏ). Điều này làm cho nó khó khăn để có được bất kỳ kết quả tốt từ các thuật toán tương ứng như StereoBM.

Trả lời

23

Đã xảy ra sự cố với hiệu chuẩn máy ảnh của bạn: cv::calibrateCamera() trả về lỗi tái chiếu trung bình gốc (RMS) [1] và phải nằm trong khoảng từ 0,1 đến 1,0 pixel khi hiệu chuẩn tốt.Đối với một điểm tham chiếu, tôi nhận được khoảng 0,25 px lỗi RMS khi sử dụng máy ảnh stereo tùy chỉnh của tôi được làm bằng hai máy ảnh Playstation Eye được đồng bộ hóa phần cứng chạy ở độ phân giải 640 x 480.

Bạn có chắc chắn rằng tọa độ pixel được trả về bởi cv::findChessboardCorners() giống với thứ tự trong số obj? Nếu các trục bị lật, bạn sẽ nhận được các triệu chứng tương tự như các triệu chứng mà bạn mô tả.

[1]: OpenCV tính toán lỗi reprojection bằng cách chiếu ba chiều của các điểm bàn cờ vào hình ảnh bằng cách sử dụng tập hợp thông số hiệu chuẩn cuối cùng và so sánh vị trí của các góc. Sai số RMS của 300 có 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ó 300 px.

+1

Cảm ơn bạn đã phản hồi nhanh! Bây giờ tôi biết những gì cần tìm. Tôi sẽ thử một số thiết lập khác nhau khi chụp ảnh hiệu chuẩn. – Orka

+0

@Michael: ý của bạn là cv :: calibrateCamera()? findChessboardCorners() không trả về một giá trị lỗi. – neuviemeporte

+0

@neuviemeporte Vâng, bạn hoàn toàn đúng. Tôi đã sửa bài đăng gốc của mình. –

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