Q-матрица для функции reprojectImageTo3D в opencv

Я делаю проект в opencv для обнаружения препятствий на пути слепого с помощью стереокалибровки. Я правильно рассчитал карту несоответствия. Теперь, чтобы найти расстояние от препятствия до камеры, мне нужны его трехмерные координаты [X, Y, Z], которые, как я предполагаю, можно найти с помощью reprojectImageTo3D (), но у меня нет матрицы Q для использования в этой функции, потому что Q-матрица, которую я получаю от stereoRectify (), становится нулевой, вероятно, потому, что я использовал предварительно откалиброванные изображения. Хотя у меня есть внутренние и внешние параметры моей камеры. Итак, мой вопрос в том, как я могу вручную создать матрицу Q для непосредственного использования в функции reprojectImageTo3D (), если я знаю фокусное расстояние, базовую линию и все остальное о моей камере? Каков основной формат Q-матрицы?


person g.alisha12    schedule 09.12.2014    source источник
comment
Краткое описание трехмерной реконструкции для стереозрения приведено ниже на следующем рисунке. Вы можете получить матрицу Q и лучше понять ее из процесса. ! [введите описание изображения здесь] (i.stack.imgur.com/LrDRD.jpg)   -  person Gavin Gao    schedule 21.01.2019


Ответы (2)


Форма Q-матрицы задается следующим образом:

Q Matrix Image

На этом изображении c x и c y - координаты главной точки в левой камере (если вы выполнили стерео-сопоставление с доминирующей левой камерой), c 'x - координата x главной точки в правой камере (c x и c 'x будут одинаковыми, если вы указали флаг CV_CALIB_ZERO_DISPARITY для stereoRectify()), f - это фокусное расстояние и T x - длина базовой линии (возможно, отрицательная величина базовой длины, я думаю, это перевод одного оптического центра в другой).

Я бы посоветовал взглянуть на книгу Изучение OpenCV для получения дополнительной информации. Он по-прежнему основан на более старом интерфейсе C, но хорошо объясняет лежащую в основе теорию, и именно отсюда я взял форму Q-матрицы.

person Andrew W    schedule 04.02.2015
comment
хорошая работа. если вы можете упомянуть способ вычисления матрицы Q - person VenushkaT; 19.04.2015
comment
Привет, я знаю, что cx и cy измеряются в пикселях. Какова единица измерения f и Tx? - person Employee; 21.08.2019
comment
@Employee: f выражается в пикселях пикселей. Tx в метрах (или миллиметрах) - person ianinini; 24.01.2020

если вы хотите создать непосредственно Q-матрицу:

cv::Mat Q;
Q.at<double>(0,0)=1.0;
Q.at<double>(0,1)=0.0;
Q.at<double>(0,2)=0.0;
Q.at<double>(0,3)=-160; //cx
Q.at<double>(1,0)=0.0;
Q.at<double>(1,1)=1.0;
Q.at<double>(1,2)=0.0;
Q.at<double>(1,3)=-120;  //cy
Q.at<double>(2,0)=0.0;
Q.at<double>(2,1)=0.0;
Q.at<double>(2,2)=0.0;
Q.at<double>(2,3)=348.087;  //Focal
Q.at<double>(3,0)=0.0;
Q.at<double>(3,1)=0.0;
Q.at<double>(3,2)=1.0/95;    //1.0/BaseLine
Q.at<double>(3,3)=0.0;    //cx - cx'

Но вы должны откалибровать обе камеры, а затем получить Q-матрицу из cv :: stereoRectify. Будьте осторожны, считайте матрицу Q как двойные значения.

person Javier Abellán Ferrer    schedule 02.07.2015
comment
Откуда берутся эти цифры? - person Atnas; 29.11.2018
comment
Эта QMatrix является результатом процесса, называемого калибровкой. - person DrunkenMaster; 17.05.2019
comment
Разве это не должно быть Q.at<double>(3,2) = -1.0/95 для координат T_x - person Lxrd-AJ; 23.05.2019
comment
Как получить Q.at<double>(2,3)=348.087; //Focal значение? - person decadenza; 16.04.2020