OpenCV стерео камера, определяет расстояние до объекта

Я новичок в OpenCV, я собрал openCV и установил Qt для успешного запуска примера http://code.google.com/p/opencvstereovision/source/checkout. В результате получаются левая и правая веб-камера, а после калибровки выпрямленное изображение как для карты глубины, так и для нее. Я хочу сделать следующее. Я нажму на объект, чтобы сфокусироваться на любом из этих левых или правых изображений. Затем я хочу обнаружить соответствующий пиксель в другом изображении и рассчитать расстояние до этого объекта. Я не знаю, что делать сейчас, и мне нужно руководство. Возможно, если я сначала вычислю соответствующую точку, я могу решить остальное. Как я могу это сделать?

2 ответа

Решение

Казалось бы, у вас есть хорошее представление о том, что требуется. Это что-то вроде банки червей - поэтому, как всегда, я бы порекомендовал достать знаменитую книгу Хартли и Циссермана для канонического объяснения. Вот ссылка на соответствующую главу.

Но вкратце...

Я не использовал класс обертки opencvstereovision напрямую, но похоже, что он снял головную боль при калибровке (внутренняя и внешняя камеры) и рассчитал выпрямление с помощью матрицы гомографии (H) для плоской геометрии или фундаментальной матрицы (F) для более сложной эпиполярной геометрии.

Вероятно, похоже на этот оригинальный пост.

Тогда это исправление означает, что оно установило математическое отображение между одной и той же точкой на каждом изображении.

В предыдущем ответе (от меня) вы можете затем сделать математику, используя фундаментальную матрицу для выполнения триангуляции - то есть рассчитать расстояние.

Однако обратите внимание, что это расстояние находится только в координатной рамке изображения (то есть в пикселях).

Что фактически требуется для выполнения измерений в "реальном мире" (т. Е. Фактического физического расстояния), так это вычисление основной матрицы (E), которая объединяет базовую матрицу и внутренние характеристики камеры (K), чтобы, если хотите, проецировать расстояния в реальный мир.

class StereoVar
{
StereoVar();
StereoVar(    int levels, double pyrScale,
                                int nIt, int minDisp, int maxDisp,
                                int poly_n, double poly_sigma, float fi,
                                float lambda, int penalization, int cycle,
                                int flags);
virtual ~StereoVar();

virtual void operator()(InputArray left, InputArray right, OutputArray disp);

int        levels;
double    pyrScale;
int        nIt;
int        minDisp;
int        maxDisp;
int        poly_n;
double    poly_sigma;
float    fi;
float    lambda;
int        penalization;
int        cycle;
int        flags;

...
};

См. http://docs.opencv.org/modules/contrib/doc/stereo.html

Другие вопросы по тегам