Найти ориентацию камеры и перевод из 2D-изображения

Цель ::

Я намерен использовать загруженное изображение в качестве статического фона и визуализировать 3D-объекты на указанной плоскости в этом изображении.

Мне нужно получить ориентацию камеры по отношению к плоскости. Таким образом, я могу правильно визуализировать 3D-модели на указанной плоскости.

Пользователь укажет длину и ширину плоскости. А также обведите плоскость, получив 4 угла плоскости (A,B,C,D на 2D-изображении).

диаграмма


Что я пробовал::

Я рассматривал использование OpenCV, портированного на webassembly, в частности solvePnP, но при тестировании я получал ошибку Uncaught TypeError: Cannot read property '$$' of undefined at RegisteredPointer.nonConstNoSmartPtrRawPointerToWireType

Код, который я использовал ниже:

// 3D world coords
var vv = cv.matFromArray( 4,3,cv.CV_32SC1,[
    0,0,0,
    0,4,0,
    8,4,0,
    8,0,0,
])

// 2D img coords
var imageP = cv.matFromArray( 4,2,cv.CV_8S,[
    292,272,
    72,379,
    487,530,
    701,470,
])

// camera internal params
var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())

var rvec
var tvec
cv.solvePnP( vv, imageP, cm, new cv.Mat(), rvec, tvec, false, cv.SOLVEPNP_P3P )

Можно ли с известными переменными получить какую-либо информацию об ориентации/положении/поле обзора камеры?


person Andrew Rockwell    schedule 21.05.2019    source источник
comment
вероятно, вам было бы проще начать иметь плоскость известного размера с каким-то уникальным идентификатором на ней, который не зависит от вращения и может быть найден на любом изображении. Оттуда у вас будет угол поворота, и вам, вероятно, нужно будет очертить плоскость оттуда, чтобы найти перекос. После того, как у вас есть угол поворота и наклон, вы можете сопоставить аффинный прямоугольник с известной плоскостью (либо с размерами, введенными пользователем, либо, предпочтительно, с предварительно определенными), и оттуда вы можете использовать аффинный прямоугольник, чтобы определить изменения, которые вам нужно сделать для отображаемый объект.   -  person Ryan    schedule 21.05.2019
comment
посмотри на SolvePnP   -  person Micka    schedule 21.05.2019


Ответы (1)


Ответ немного сложнее.

Во-первых, вам нужно откалибровать камеру, чтобы получить cameraMatrix. Вы также должны удалить искажение по пути,

var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())

В вашем коде вы просто объявляете его и не добавляете к нему никакого контента. и математика требует этого, как показано ниже введите здесь описание изображения введите здесь описание изображения, тогда вам нужно знать физический размер объекта, чтобы сделать это.

Самый простой способ начать — использовать образец калибровочного шаблона шахматной доски, размер которого можно предварительно ввести.

Вы можете следовать этому образцу, чтобы узнать, как найти ориентацию камеры и относительное положение к заранее определенным объектам.

https://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_dication/camera_dication.html

Исходный код для достижения того, что вы хотите, находится здесь https://github.com/opencv/opencv/blob/master/modules/calib3d/src/dication.cpp

Начните с строки 1400.

Пример результата с AR можно найти по этой ссылке https://www.youtube.com/watch?v=2hek-DmiGEw введите здесь описание изображения

введите здесь описание изображения

person Dr Yuan Shenghai    schedule 22.05.2019