5

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

ответ

9

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

Q Matrix Image

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

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

+1

хорошо произведение. если вы можете упомянуть способ вычисления Q-матрицы – VenushkaT

1

, если вы хотите создать непосредственно 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 от сорта :: stereoRectify. Будьте осторожны, прочитайте Q-матрицу как двойные значения.