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.
Đượ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