SolvePnPRansa c всегда возвращает единичную матрицу вращения - PullRequest
0 голосов
/ 24 марта 2020

Я использую OpenCV 3.1 и пытаюсь оценить поворот между двумя кадрами камеры. Сначала я определяю некоторые ключевые точки, определяю их дескрипторы и сопоставляю их. Наконец, я должен увидеть поворот с помощью convertPnPRansa c (предположим, что все точки лежат на плоскости z = 0), но он всегда возвращает единичную матрицу в качестве поворота, даже если изображение поворачивается. Вот часть кода, которая не работает: (Get_Euler_angles - это функция, которую я создал и работает)

   ...
  std::vector< DMatch > good_matches;
  for( int i = 0; i < descriptors_object.rows; i++ )
  { if( matches[i].distance <= factor*min_dist )
     { good_matches.push_back( matches[i]); }
  }  


  std::vector<Point3f> obj3;
  std::vector<Point2f> scene2;
  Point3f aux3;
  Point2f aux2;

  for( size_t i = 0; i < good_matches.size(); i++ )
  {
    //-- Get the keypoints from the good matches
    aux3.x=keypoints_object[ good_matches[i].queryIdx ].pt.x;
    aux3.y=keypoints_object[ good_matches[i].queryIdx ].pt.y;
    aux3.z=0;
    obj3.push_back(aux3);
    aux2.x=keypoints_object[ good_matches[i].queryIdx ].pt.x;
    aux2.y=keypoints_object[ good_matches[i].queryIdx ].pt.y;
    scene2.push_back(aux2);
  }  

  Mat rvec, tvec, rmat;
  Mat cameraMatrix = (Mat_<float>(3,3) << 374.67,0,320.5,0,374.67,180.5,0,0,1);
  solvePnPRansac( obj3, scene2, cameraMatrix, noArray(), rvec, tvec);
  Rodrigues(rvec, rmat);

  std::vector<double> euler_angles (3);
  std::cout << "rvec from solvePnPRansac: " << std::endl << rvec << std::endl;
  std::cout << "rmat from solvePnPRansac: " << std::endl << rmat << std::endl;
  euler_angles=get_Euler_angles(rmat);
  std::cout << "euler angles from solvePnPRansac: " << std::endl << "[" << euler_angles[0] << " "<< euler_angles[1] << " " << euler_angles[2]  << "]" << std::endl;
  std::cout << "tvec  from solvePnPRansac: "  << std::endl << tvec  << std::endl;

Если я использую в качестве входных данных два изображения, я получаю совпадения и вектор перевода, но вектор вращения пуст:

rvec from solvePnPRansac: 
[0;
 0;
 0]
rmat from solvePnPRansac: 
[1, 0, 0;
 0, 1, 0;
 0, 0, 1]
euler angles from solvePnPRansac: 
[-0 0 0]
tvec  from solvePnPRansac: 
[-320.5000258050974;
 -180.4999954623273;
 374.6697010743459]
...