Я делаю обнаружение штрих-кода, используя библиотеку zbar
с opencv
в C ++. Обнаружение штрих-кода работает хорошо, и я получаю такие результаты
Теперь я хочу использовать cv::solvePnP
, чтобы получить позу моей камеры (уже откалиброванной). В качестве 3D-точек я использую шаблон, в котором при запуске программы я вычисляю то же обнаружение штрих-кода и беру верхний левый угол и нижний правый угол. Затем я вычисляю мировые координаты этих двух точек относительно центра штрих-кода следующим образом:
(pt.x - imageSize.width / 2) * px_to_mm,
(pt.y - imageSize.height / 2) * px_to_mm,
0.
imageSize
- это размер штрих-кода (в пикселях), px_to_mm
- это соотношение «длина в метрах высоты штрих-кода, деленная на общее количество пикселей высоты штрих-кода», а pt
- это точка (вверху слева или внизу справа).
Шаблон
Я проверил правильность полученной точки обнаружения штрих-кода. Мировые координаты top_left =[0.054160003, 0.025360001, 0], bottom_right = [0.085200004, 0.046080004, 0]
. Я предполагаю, что они правильные, поскольку размеры в пикселях штрих-кода 388 x 200
, а высота в метрах 0.016
.
Когда я запускаю cv::solvePnP
, я получаю эти результаты
translation: [-nan, -nan, -nan]
rotation: [-nan, nan, -nan;
-nan, -nan, nan;
nan, -nan, -nan]
Входные данные метода - две точки изображения для обнаружения штрих-кода и две точки мира, вычисленные с использованием шаблона. В чем проблема?