Emgu (OpenCV для C #) - построение карты диспаратности с помощью cvStereoRectify - PullRequest
7 голосов
/ 29 сентября 2010

Я использовал замечательную оболочку Emgu C # для OpenCV для сбора изображений с домашней стереосистемы.Две веб-камеры скреплены болтами с куском дерева, на расстоянии 35 см друг от друга, что, я надеюсь, позволит мне составить карты глубины на расстоянии 10-20 м.Я установил их так, чтобы они были максимально параллельными (около 89,3 градуса из теста триангуляции).

Я пытаюсь сделать карту несоответствия из них, и хотя процесс работает как код, результаты очень случайны.Под этим я подразумеваю, что каждый раз, когда я пытаюсь запустить стерео выпрямление, я получаю очень разные результаты, и изображение часто настолько сильно искажено, что на экране почти ничего не видно.

Как я понимаю, как это сделатьвыглядит следующим образом:


1) Распечатайте рисунок шахматной доски (например, 6 на 8 внутренних углов) - наклейте на что-нибудь плоское.

2) Сделайте набор из 10 фотографий изкамера 1 держит шахматную доску в полный обзор, но в разных положениях.

3) используйте CameraCalibration.FindChessboardCorners, чтобы найти внутренние углы (6 на 8)

4), используйте img.FindCornerSubPix () дляуточните эти угловые местоположения до уровня субпикселя

5) используйте CameraCalibration.CalibrateCamera () для вычисления внутренних данных камеры и сохраните его как файл XML

6) Повторите выше для камеры 2.

7) Теперь у вас есть информация о внутреннем искажении камеры, которую вы можете взять стереофоническую пару и использовать CameraCalibration.StereoCalibrate () с предопределенными внутренними данными.лукаво рассчитывается для обработки внешней информации (смещения и повороты между камерой 1 и 2).

8) Используйте CvInvoke.cvStereoRectify () и CvInvoke.cvInitUndistortRectifyMap (), а затем CvInvoke.cvRemap () для создания выходных данных.изображение, которое должно быть выстроено в Y, чтобы вы могли запустить один из тестов соответствия стерео.

Я обнаружил, что вам нужно использовать Emgu 2.1 ver 806, чтобы cvStereoRectify работал без ошибки Access Violation.


Я предполагаю, что мои вопросы:

A) Мой процесс правильный?Я выполняю внутреннюю калибровку камеры как отдельный процесс, потому что, когда камеры находятся на расстоянии 35 см друг от друга, нелегко увидеть шахматную доску в поле зрения обоих в офисе и много ее перемещать ... так как она скоро уходит в сторонуодного из видов камеры.Я полагал, что, поскольку значения являются внутренними, они относятся к камере и, следовательно, должны перейти к стерео процедуре ОК.Это правильно?

Кажется, что внутренние значения изменяются во время процесса cvStereoRectify и делаются очень разными.

Например.Значения искажения от первой стадии = 0,22, -1,2,0.01, -0,01,2,6 после cvStereoRectify значения были изменены на = 10, -489, -0,03, -0,09,13208

Я не эксперт, нопервый набор кажется больше похожим на то, что я видел в комментариях других людей, а второй набор выглядит довольно неплохо!

B) Есть ли способ остановить обновление значений intrinsic + distortion во время cvStereoRectify?

C) Это кажется правильным для внутренних значений (937,0,290,0,932,249,0,0,1)?

Большое спасибо за любые подсказки ... Я застрялоб этом на некоторое время сейчас ... и я действительно не уверен, какая часть процесса выбрасывает ошибки.Любые советы или предложения будут приветствоваться ...

1 Ответ

0 голосов
/ 24 марта 2014

Я не использовал EMGU пару лет, но использовал его для калибровки камеры и Kinect.

Я обнаружил, что может быть некоторая путаница с упорядочением углов прямоугольника, если прямоугольник полностью горизонтален - я так и не понял, почему, и это, похоже, сработало для меня. Попробуйте установить доску так, чтобы прямоугольник был повернут на 45 градусов (т. Е. Спереди вы бы посмотрели на более ромбовидную форму, если это имеет смысл).

Мое базовое понимание состоит в том, что обеим камерам будет легко гарантировать, что они выберут тот же угол, что и первый угол, с которого начнется отсчет.

Я не могу гарантировать, что это решит вашу проблему - возможно, в моем коде было что-то глубоко неправильное, и именно поэтому он не давал регулярных результатов, когда шахматная доска была плоской. Опять же, тестирование не займет у вас много времени и может просто сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...