Использование OpenCV для решения проблемы преобразования неплоских точек объекта и точек изображения - PullRequest
0 голосов
/ 01 декабря 2018

ВОПРОС, ПЕРЕСТАВЛЕННЫЙ ДЛЯ ДОБАВЛЕНИЯ ЯСНОСТИ

Я работаю с OpenCV, чтобы попытаться откалибровать лазерный сканер.

У меня есть набор 2d точек, снятых сканером,Для примера давайте представим эти точки следующим образом:

IMAGE POINTS
{(0.08017784, -0.08993121, 0)}
{(-0.1127666, -0.08712908, 0)}
{(-0.1117229, 0.1782855, 0)}
{(0.09053531, 0.198439, 0)}

Я знаю, что эти точки соответствуют следующим точкам реального мира:

OBJECT POINTS
{(0, 0, 0)}
{(190, 0, 0)}
{(190, 260, 0)}
{(0, 260, 122)}

Я былиспользование OpenCV Чтобы найти матрицу вращения и перемещения, которая позволит мне указать точку мира (например, 100, 200, 20) и вернуть 2-ю точку в захваченной системе координат.

Мои результаты пока что показали, что если точки объекта копланарны, тогда OpenCV находит результаты вращения / перемещения почти идеально.

Однако в задачах, подобных приведенному выше, где нетвсе точки лежат в одной плоскости, я получаю дико неправильные ответы.

Я знаю, что это возможно (не обязательно с openCV), потому что у меня есть другое коммерческое программное обеспечение, которое может сделать это.Для справки, решением вышеупомянутой проблемы является матрица:

SOLUTION
[-0.99668, 0.03056, 0.07543]
[ 0.05860, 0.91263, 0.40454]
[-0.05647, 0.40762,-0.91140]
[79.34385, -89.63855,-982.25938]

Я использую среднеквадратическую ошибку для определения достоверности результатов.Среднеквадратическая ошибка для предоставленного мной решения составляет 1,61560.В то время как результат OpenCV превышает 1000.

ВОПРОС:

Используя заданные ТОЧКИ ИЗОБРАЖЕНИЯ и ТОЧКИ ОБЪЕКТА, как можно использовать OpenCV (или другие методы) для полученияв решении.

Что я уже пробовал:

Я пробовал базовый SolvePNP из OpenCV, например:

Cv2.SolvePnP(objectPoints, imagePoints, camMatrix, dist, out double[] rvec, out double[] tvec, false, SolvePnPFlags.Iterative);

Документация по SolvePNPЗдесь

Как указано выше, это решение работает, если все точки моего объекта плоские.Но с точками на других плоскостях решение ломается и очень неправильно.

Заранее спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

(Извините, забыл следить за этим)

Рассчитать определитель матрицы вращения.Должно быть = 1 для «правильного» ответа и -1 для перевернутого.Затем просто умножьте вращение на матрицу identity , где последний член является определяющим.это ничего не делает, если det () = 1, но переворачивает его на правильный ответ, если det () = -1

. Вы можете найти код / ​​обсуждение в ОЦЕНКА ПОЗЫ ДЛЯ ПЛАНАРНОЙ ЦЕЛИ полезно

...