Найти ориентацию камеры && перевод с 2d изображения - PullRequest
0 голосов
/ 21 мая 2019

Цель ::

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

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

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

diagram


То, что я пробовал: *

Я смотрел на использование веб-сборки, портированной OpenCV, особенно 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 )

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

1 Ответ

0 голосов
/ 22 мая 2019

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

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

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

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

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

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

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

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

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

Пример выборки с ARможно найти по этой ссылке https://www.youtube.com/watch?v=2hek-DmiGEw enter image description here

enter image description here

...