Я делаю проект в opencv для обнаружения препятствий на пути слепого с помощью стереокалибровки. Я правильно рассчитал карту несоответствия. Теперь, чтобы найти расстояние от препятствия до камеры, мне нужны его трехмерные координаты [X, Y, Z], которые, как я предполагаю, можно найти с помощью reprojectImageTo3D (), но у меня нет матрицы Q для использования в этой функции, потому что Q-матрица, которую я получаю от stereoRectify (), становится нулевой, вероятно, потому, что я использовал предварительно откалиброванные изображения. Хотя у меня есть внутренние и внешние параметры моей камеры. Итак, мой вопрос в том, как я могу вручную создать матрицу Q для непосредственного использования в функции reprojectImageTo3D (), если я знаю фокусное расстояние, базовую линию и все остальное о моей камере? Каков основной формат Q-матрицы?
Q-матрица для функции reprojectImageTo3D в opencv
Ответы (2)
Форма Q-матрицы задается следующим образом:
На этом изображении c x и c y - координаты главной точки в левой камере (если вы выполнили стерео-сопоставление с доминирующей левой камерой), c 'x - координата x главной точки в правой камере (c x и c 'x будут одинаковыми, если вы указали флаг CV_CALIB_ZERO_DISPARITY
для stereoRectify()
), f - это фокусное расстояние и T x - длина базовой линии (возможно, отрицательная величина базовой длины, я думаю, это перевод одного оптического центра в другой).
Я бы посоветовал взглянуть на книгу Изучение OpenCV для получения дополнительной информации. Он по-прежнему основан на более старом интерфейсе C, но хорошо объясняет лежащую в основе теорию, и именно отсюда я взял форму Q-матрицы.
если вы хотите создать непосредственно 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 как двойные значения.
Q.at<double>(3,2) = -1.0/95
для координат T_x
- person Lxrd-AJ; 23.05.2019
Q.at<double>(2,3)=348.087; //Focal
значение?
- person decadenza; 16.04.2020