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 imagePointsLeft
và imagePointsRight
. 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::stereoRectify
và cv::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.
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
@Michael: ý của bạn là cv :: calibrateCamera()? findChessboardCorners() không trả về một giá trị lỗi. – neuviemeporte
@neuviemeporte Vâng, bạn hoàn toàn đúng. Tôi đã sửa bài đăng gốc của mình. –