Я использовал отличную оболочку 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)?
Большое спасибо за любые советы ... Я застрял на этом некоторое время ... и я действительно не уверен, какая часть процесса вызывает ошибки. Любые советы или предложения будут очень кстати...