ВОПРОС, ПЕРЕСТАВЛЕННЫЙ ДЛЯ ДОБАВЛЕНИЯ ЯСНОСТИ
Я работаю с 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Здесь
Как указано выше, это решение работает, если все точки моего объекта плоские.Но с точками на других плоскостях решение ломается и очень неправильно.
Заранее спасибо!