Я использую 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]