FindFundamentalMatrix не находит основная матрица

Я пытаюсь восстановить движение камеры с помощью фундаментальная матрица и алгоритм, приведенный в Википедии . Для это мне нужно найти фундаментальную матрицу. Я использую OpenCV :: findFundamentalMat для этого.

Два неожиданных поведения:

  1. Использование разных алгоритмов подбора дает разные результаты, особенно FM_8POINT отличается.
  2. Учитывая набор пар точек (y, x), yFx = 0 не выполняется и всегда больше 0.

Я что-то тут не понял? Мой пример ложный, или что такое продолжается? Может ли кто-нибудь предложить лучший тестовый пример?

Ниже приведен минимальный пример. Создайте 12 искусственных точек, сдвиньте каждую из эти точки на 10 пикселей вправо, найти фундаментальную матрицу из эти два набора точек и выведите yFx для каждой точки.

Пример:

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 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(0) = pts1.at(i).x;
           p1.at(1) = pts1.at(i).y;
           p1.at(2) = 1.0;

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

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

Для FM_RANSAC я получаю

[1.999], [2], [2], [1.599], [1.599], [1.599], [1.198], [1.198], [1.198], [0.798], [0.798], [0.798]

Для FM_8POINT фундаментальную матрицу равно нулей (3,3) и, следовательно, yFx равно 0 для всех y , x .

Я только нашел: Оценка T и R из основной матрицы , но это не сильно помогло.

Править : yFx неверный путь ( p1 / p2 переключены в cout-line). Этот пример тоже не работает, потому что все точки лежат на плоскости.

5
задан Georgy 21 March 2018 в 17:36
поделиться