2012-04-17 35 views
5

Tôi đang cố gắng hiệu chỉnh camera Kinect và camera ngoài, với Emgu/OpenCV. Tôi bị kẹt và tôi thực sự đánh giá cao sự giúp đỡ nào.Chỉnh sửa máy ảnh chưa hiệu chỉnh, thông qua ma trận cơ bản

Tôi đã chọn thực hiện việc này thông qua ma trận cơ bản, tức là hình học epipolar. Nhưng kết quả không như tôi mong đợi. Hình ảnh kết quả có màu đen hoặc không có ý nghĩa gì cả. Các điểm Mapx và Mapy thường là tất cả bằng vô hạn hoặc vô hạn, hoặc tất cả bằng 0,00 và hiếm khi có giá trị thông thường.

Đây là cách tôi đã cố gắng để làm cải chính:

1.) điểm Find ảnh nhận được hai mảng của các điểm ảnh (một cho mỗi camera) từ tập hợp các hình ảnh. Tôi đã làm điều này với bàn cờ và chức năng FindChessboardCorners.

2.) Tìm ma trận cơ bản

CvInvoke.cvFindFundamentalMat(points1Matrix, points2Matrix, 
_fundamentalMatrix.Ptr, CV_FM.CV_FM_RANSAC,1.0, 0.99, IntPtr.Zero); 

Tôi vượt qua tất cả các điểm thu thập từ toàn bộ các hình ảnh, hoặc chỉ từ hai hình ảnh cố gắng để khắc phục?

3.) ma trận Tìm homography

CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix, 
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold); 

4.) Nhận MapX và mapy

double scale = 0.02; 
CvInvoke.cvInvert(_M1.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 

CvInvoke.cvMul(_H1.Ptr, _M1.Ptr, _R1.Ptr,scale); 
CvInvoke.cvMul(_iM.Ptr, _R1.Ptr, _R1.Ptr, scale); 
CvInvoke.cvInvert(_M2.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 
CvInvoke.cvMul(_H2.Ptr, _M2.Ptr, _R2.Ptr, scale); 
CvInvoke.cvMul(_iM.Ptr, _R2.Ptr, _R2.Ptr, scale); 

CvInvoke.cvInitUndistortRectifyMap(_M1.Ptr,_D1.Ptr, _R1.Ptr, _M1.Ptr, 
mapxLeft.Ptr, mapyLeft.Ptr) ; 

Tôi có một vấn đề ở đây ... kể từ khi tôi không sử dụng hiệu chuẩn hình ảnh, ma trận máy ảnh của tôi và hệ số biến dạng là gì? Làm thế nào tôi có thể lấy nó từ ma trận cơ bản hoặc ma trận homography?

5.) Remap

CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight, 
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255)); 

Và điều này không trở lại kết quả tốt. Tôi sẽ đánh giá cao nếu có ai đó sẽ cho tôi biết tôi đang làm gì sai.

Tôi đã đặt 25 cặp hình ảnh và kích thước mẫu bàn cờ 9x6.

Trả lời

0

Cuốn sách "Học OpenCV", từ xuất bản O'Reilly, có hai chương đầy đủ dành cho chủ đề cụ thể này. Cả hai đều sử dụng nhiều các thói quen bao gồm OpenCV cvCalibrateCamera2() và cvStereoCalibrate(); Các thường trình này là các trình bao bọc cho mã rất giống với những gì bạn đã viết ở đây, với lợi ích bổ sung là đã được gỡ rối kỹ lưỡng hơn bởi những người duy trì các thư viện OpenCV. trong khi chúng được thuận tiện, cả hai yêu cầu khá một chút tiền xử lý để đạt được các đầu vào cần thiết cho các thói quen. Thực tế có thể là một chương trình mẫu, ở đâu đó sâu trong thư mục mẫu của bản phân phối OpenCV, sử dụng các thường trình này, với các ví dụ về cách chuyển từ hình ảnh bàn cờ sang ma trận hiệu chuẩn/nội tại. Nếu bạn nhìn sâu vào bất kỳ nơi nào trong số này, tôi chắc chắn bạn sẽ thấy cách bạn có thể đạt được mục tiêu của mình với lời khuyên từ các chuyên gia.

0

cv :: findFundamentalMat không thể hoạt động nếu tham số nội tại của điểm ảnh là ma trận nhận dạng, nói cách khác, nó không thể hoạt động với điểm ảnh không được dự đoán

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