Emgu (OpenCV для C#) — построение карты несоответствий с использованием cvStereoRectify

Я использовал отличную оболочку 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 версии 806, чтобы заставить cvStereoRectify работать без ошибки нарушения прав доступа.


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

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

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

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

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

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

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

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


person timemirror    schedule 28.09.2010    source источник
comment
Я только что обнаружил, что все работает лучше, если вы одновременно собираете набор изображений с камер L и R, а затем решаете все точки объектной модели (т.е. угловые координаты шахматной доски) и два набора угловых координат изображения. (т.е. координаты субпикселя левой и правой камеры).   -  person timemirror    schedule 29.09.2010
comment
Также кажется, что лучше работать, когда шахматная доска находится довольно близко к камере... моя проблема в том, что это не дает мне много места для работы, так как мои камеры так далеко друг от друга. Поэтому я только что сделал большую шахматную доску (200%) и держу ее подальше... что дает мне точность в сопоставлении углов, а также больше места для ее перемещения. Кажется, помогает ... все еще работаю над этим!   -  person timemirror    schedule 29.09.2010
comment
@timemirror: Вы проверили набор инструментов калибровки Matlab (www.vision.caltech.edu/bouguetj/calib_doc/) или инструменты калибровки камеры Данила Стоёнова (ubimon.doc.ic.ac.uk/dvs/m581.html), оба являются отличными инструментами для калибровки. Кстати, каковы ваши выводы с библиотекой emguCV, вы получили удовлетворительные результаты?   -  person Kevin Boyd    schedule 02.12.2010
comment
Вы можете проверить свои выводы из библиотеки emguCV с помощью этих инструментов, вы также можете найти множество ссылок на другие наборы инструментов для калибровки по этой ссылке vision.caltech.edu/bouguetj/calib_doc/htmls/links.html   -  person Kevin Boyd    schedule 02.12.2010
comment
@Kevin Boyd - спасибо за ссылки и комментарии. К сожалению, у меня нет доступа к Matlab. Я обнаружил, что Emgu очень хорош. Я обнаружил, что при калибровке моей камеры было две основные проблемы: а) мне приходилось калибровать обе камеры в стереофонической установке одновременно; ручная фокусировка, и одно из колец фокусировки было немного ослаблено, поэтому, когда камеры перемещались после калибровки, фокус немного менялся, но этого было достаточно, чтобы выполнить мои предыдущие калибровки. В итоге я перешел на более качественные видеокамеры, и Эмгу работала без нареканий.   -  person timemirror    schedule 03.12.2010
comment
Я пытаюсь сделать то же самое, и у меня был один вопрос о функции Emgu CameraCalibration.CalibrateCamera(). Приходилось ли вам (или кому-либо еще здесь) выполнять какую-либо предварительную обработку аргументов IntrinsicCameraParameters? Например, начать с присвоения определенного значения? Кроме того, функция принимает ExtrinsicCameraParameters[] вместо (мого ожидаемого) объекта ExtrinsicCameraParameters в качестве аргумента «out». Может ли кто-нибудь дать представление о том, как справиться с этими двумя аргументами? Или подскажите, есть ли с ними дело? Я получаю значение «NaN» в качестве возврата. Мир.   -  person sparkFinder    schedule 06.05.2011


Ответы (1)


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

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

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

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

person mike1952    schedule 24.03.2014