Jump to content
Compvision.ru
Sign in to follow this  
Штепсель

Понимание solvePNP и повышение точности вычислений

Recommended Posts

Приветствую!

Нужно с точностью хотя бы в десятые градуса найти поворот объекта относительно оригинала на изображении. 
Что бы исключить влияние вешней среды все изображения для опытов создаю в Blender`е (разумеется рендер с одинаковыми настройками и положением камеры, размер кадра 1600х1200).  Из него же взял и cameraMatrix. На всякий случай так же пробовал в нём же рендерить шаблон шахматной доски под разными ракурсами, потом cameraCalibrate для получения cameraMatrix и distortionCoefficient в общем всё как по примерам OpenCV. Проверял perViewErrors  - для каждого изображения доски в пределах 0.1-0.2 пикселя.

Для начала рендерю изображение просто квадрата, который будет использоваться как оригинальный, под неким углом наклона камеры, в OpenCV нахожу положение 4 углов на изображении - imagePoints.
Знаю, размер стороны квадрата и задаю координаты 3D точек, к примеру:

std::vector<cv::Point3d> objectPoints;
objectPoints.push_back(cv::Point3d(0.0f, 0.0f, 0.0f));
objectPoints.push_back(cv::Point3d(50.0f, 0.0f, 0.0f));
objectPoints.push_back(cv::Point3d(50.0f, 50.0f, 0.0f));
objectPoints.push_back(cv::Point3d(0.0f, 50.0f, 0.0f));

Дальше загоняю это в solvePnP:

cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec, false, cv::SOLVEPNP_ITERATIVE);

Я правильно понимаю, что при расчёте все методы solvePnP исходят из того, что все 4 точки objectPoints то же должны оказаться лежащими на одной 3D плоскости?  Я пытался вникнуть хотя бы в метод ITERATIVE, но трудновато.

Получаю rvec, tvec.  Пробовал разные методы (более лучший результат даёт AP3P).

Теперь, я так понимаю, если применить rvec (точнее, получить матрицу трансформации из вектора сначала) и tvec к objectPoints  я получу их 3D положение в системе координат камеры? 

А как быть, в случае, если точки imagePoints вычисляются с какими-либо погрешностями? К примеру, в 2-5 пикселей?

Имею ввиду, что можно предпринять, что бы скорректировать результаты solvePnP до более правильных? 

Может увеличить количество точек до 5-6 ? Пробовал solve RANSAC, результат то же неоднозначный, но, возможно, нужно ещё больше точек?

Может быть в сами координаты точек на изображение заложить какую-либо информацию? Имею ввиду, к примеру, угол между ними должен быть 90 градусов, либо расстояния определённые...

В общем, ищется способ повышения точности rvec (в особенности) и tvec, когда уже невозможно точнее вычислить положение imagePoints.

Либо какая-либо отдельная библиотека для solvePnP, что бы можно было задать дополнительные ограничения, из разряда - угол между 3D точками на плоскости после применения rvec и tvec должны быть 90 градусов и т.д.

 

Share this post


Link to post
Share on other sites

Как раз лучше когда не в одной плоскости.

По поводу PnP есть неплохой пример здесь: https://learnopencv.com/head-pose-estimation-using-opencv-and-dlib/

Для плоских объектов лучше использовать что то вроде: https://github.com/arthur1026/RobustPlanarPose

Вот, как то делал что то такое: MarkerTracker.rar

  • Thanks 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×