2011-07-26 23 views
5

Tôi đang cố khôi phục chuyển động của máy ảnh bằng cách sử dụng ma trận cơ bản và thuật toán như được đưa ra trên Wikipedia [1]. Đối với điều này tôi cần phải tìm ma trận cơ bản. Tôi đang sử dụng OpenCV :: findFundamentalMat cho việc này.FindFundamentalMatrix không tìm thấy ma trận cơ bản

Hai hành vi không mong muốn: 1) Sử dụng các thuật toán kết hợp khác nhau tạo ra các kết quả khác nhau, đặc biệt là FM_8POINT là khác nhau. 2) Cho một tập hợp các cặp điểm (y, x), yFx = 0 không được đáp ứng và là luôn lớn hơn 0.

Tôi chưa hiểu điều gì ở đây? Ví dụ của tôi là sai hay là đang diễn ra là gì? Bất cứ ai có thể đề xuất một ví dụ thử nghiệm tốt hơn?

Dưới đây là ví dụ tối thiểu. Tạo 12 điểm nhân tạo, dịch từng điểm những điểm đó 10 pixel sang phải, tìm ma trận cơ bản từ hai bộ điểm này và in yFx cho mỗi điểm.

Ví dụ:

int main(int argc, const char* argv[]) 
{ 
    // Create two sets of points. Points in pts2 are moved 10pixel to the right of the points in pts1. 
    std::vector<cv::Point2f> pts1, pts2; 
    for(double y = 0; y < 460; y+=150) 
    { 
      for(double x= 0; x < 320; x += 150) 
      { 
        pts1.push_back(cv::Point2f(x, y)); 
        pts2.push_back(cv::Point2f(x+10.0, y)); 
      } 
    } 

    cv::Mat F = cv::findFundamentalMat(pts1, pts2); 

    for(int i = 0; i < pts1.size(); i++) 
    { 
      // Creating p1, p2, the two points. Please let me know if this can be done in fewer lines. 
      cv::Mat p1(3,1, CV_64FC1), p2(3,1, CV_64FC1); 

      p1.at<double>(0) = pts1.at(i).x; 
      p1.at<double>(1) = pts1.at(i).y; 
      p1.at<double>(2) = 1.0; 

      p2.at<double>(0) = pts2.at(i).x; 
      p2.at<double>(1) = pts2.at(i).y; 
      p2.at<double>(2) = 1.0; 

      // Print yFx for each pair of points. This should be 0 for all. 
      cout << p1.t() * F * p2 << endl; 
    } 
} 

Đối FM_RANSAC tôi nhận được [1,999], [2], [2], [1,599], [1,599], [1,599], [1,198], [1,198], [1.198], [0.798], [0.798], [0.798]

Đối với FM_8POINT ma trận cơ bản là 0 (3,3) và do đó yFx là 0 cho tất cả y, x.

Tôi chỉ tìm thấy: T and R estimation from essential matrix nhưng điều đó không giúp được gì nhiều.

EDIT: yFx là vòng sai (p1/p2 được chuyển trong dòng cout). Đây là ví dụ cũng không hoạt động vì tất cả các điểm nằm trên mặt phẳng.

Trả lời

3

Tôi tin rằng ma trận cơ bản giải phương trình p2.t() * F * p1 = 0, tức là bạn đã đảo ngược p1 và p2 trong mã của mình. Tại sao thuật toán 8 điểm lại trả về ma trận 0, tôi không biết, xin lỗi.

Chỉnh sửa: OK, tôi tin rằng tôi nhớ lại lý do tại sao thuật toán 8 điểm tạo ra kết quả kém ở đây. Chuyển động của bạn giữa hai tập điểm là dịch thuần túy mà không xoay vòng, tức là nó chỉ có ba bậc tự do. Ma trận cơ bản có 7 bậc tự do, vì vậy không thể ước lượng được; đây được gọi là trường hợp thoái hóa. Xem this paper để biết thêm mô tả về các trường hợp thoái hóa trong ước tính ma trận cơ bản/thiết yếu. Nó cũng có thể là trường hợp không có sự chuyển đổi cứng nhắc giữa hai quan điểm bạn nhận được bởi các tọa độ điểm ảnh chuyển động giả tạo, do đó không có ma trận cơ bản nào thỏa mãn các yêu cầu. Một trường hợp thử nghiệm tốt hơn có thể là sử dụng một hàm như cv :: warpPerspective với một ma trận warp đã biết.

+0

Được rồi, tôi đã có p2 và p1 một cách sai lầm quanh. Cảm ơn vì đã phát hiện ra điều đó. Bây giờ tôi sẽ xem tờ báo, và rồi Hartley & Zisserman ngay trước cửa nhà tôi, có lẽ họ có thể giúp. – Unapiedra

1

1) Sử dụng các thuật toán kết hợp khác nhau tạo ra các kết quả khác nhau, đặc biệt là FM_8POINT là khác nhau.

phương pháp khác nhau không cho kết quả tương tự, đó là sự thật:

  • ví dụ RANSAC (Random mẫu đồng thuận) là phương pháp mặc định trong findFundamentalMat(), nó ước tính các thông số của biến đổi với một thiết lập các điểm có chứa một số điểm ngẫu nhiên là các ngoại lệ trước đó, nó tạo ra một kết quả chính xác với một xác suất nhất định.
  • khi FM_8POINT được thiết kế để tìm các thông số với 8points và sử dụng một hệ thống với phương trình tuyến tính độc lập ..

2) Cho một tập các cặp điểm (y, x), yFx = 0 không phải là hoàn thành và là luôn lớn hơn 0.

nó có nghĩa là fundamentalMatrix bạn tìm thấy là không đúng (với một ước tính xấu), đó là do bản dịch tinh khiết mà bạn đã như một đầu vào, mà trong thực tế, là không thể (đó là trường hợp thoái hóa của 2 hình ảnh với một quan điểm nằm ở vô cùng ... (see epipolar geometry)

Tôi hy vọng nó giúp bạn ... Julien,

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