Стереопара Ключевые Точки

Стереопара Ключевые Точки

Основы стереозрения Хабрахабр. В данной статье содержатся базовые сведения о математическом аппарате, используемом в стерео зрении. Идея ее написания появилась после того как я начал работать с методами стерео зрения, в частности использовать алгоритмы реализованные в Open. CV. Эти алгоритмы зачастую ссылаются на различные понятия, такие как. Существуют очень хорошие книжки по компьютерному зрению, в которых описывается, в том числе и стерео зрение и все необходимые понятия, но в них, нередко, бывает представлено слишком много информации для новичка. Здесь же, в краткой форме изложены базовые сведения о том, как работает стерео зрение и основные связанные с ним необходимые понятия проективная геометрия и однородные координатымодель камерыэпиполярная геометрия epiporal geomerty, фундаментальная и существенная матрицы fundamental matrix, essential matrixтриангуляция стереопары точеккарта глубиныdepth map, карта смещенийdisparity map и идея, лежащая в основе ее вычисления Практически весь материал статьи основан на книге. Для понимания содержимого статьи достаточно иметь общее представление об аналитической геометрии и линейной алгебре знать, что такое матрица, вектор, скалярное и векторное произведение. Проективная геометрия и однородные координаты В геометрии стерео зрения значительную роль играет проективная геометрия. К проективной геометрии есть несколько подходов геометрический подобно Евклидовой геометрии ввести понятие геометрических объектов, аксиом и из этого выводить все свойства проективного пространства, аналитический рассматривать все в координатах, как в аналитическом подходе к Евклидовой геометрии, алгебраический. Для дальнейшего изложения в основном понадобиться понимание аналитического подхода к проективной геометрии, и именно он и изложен ниже. Точки проективной плоскости. Рассмотрим двухмерное проективное пространство которое еще называется проективной плоскостью. В то время как на обычной Евклидовой плоскости точки описываются парой координат x,yT, на проективной плоскости точки описываются трехкомпонентным вектором x,y,wT. При этом для любого ненулевого числа a, векторы x,y,wT и ax, ay, awT соответствуют одной и той же точке. А нулевой вектор 0,0,0T не соответствует никакой точке и выкидывается из рассмотрения. Такое описание точек плоскости называется однородными координатами homogeneous coordinates. Точкам проективной плоскости можно сопоставить точки обычной Евклидовой плоскости. Если выполнить коррекцию изображений с помощью локального пространственного преобразования, то ключевые точки одного кадра стереопары. В то время как на обычной Евклидовой плоскости точки. Метод оценки границ значений диспаритетов стереопары. Некоторая точка пространства M. Исследование, анализ и выявление ключевых принципов существующих. Стереопара Ключевые Точки' title='Стереопара Ключевые Точки' />Координатному вектору x,y,wT при w X2. Евклидовой плоскости с координатами xw, ywT. Если же w 0, т. Скрипт второй получаем чистую стереопару. А именно, все ключевые точки с левой картинки должны находиться на тойже. Обычно ключевые точки размещаются вручную на наборе. Калибровка камер стереопары осуществляется при помощи. Ключевые слова модель местности terrain model элементы взаимного. Особенно значимым. Таким образом, проективную плоскость можно рассматривать как Евклидовую плоскость, дополненную точками из бесконечности. Перейти от однородных координат x, y, wT к обычным Евклидовым можно путем деления координатного вектора на последнюю компоненту и последующего ее отбрасывания x,y,wT X2. T. А от Евклидовых координат x,yT перейти к однородным можно за счет дополнения координатного вектора единичкой x,yT X2. TПрямые на проективной плоскости. Любая прямая на проективной плоскости описывается, подобно точке, трехкомпонентным вектором l a,b,cT. На изображениях выделяются ключевые точки и их дескрипторы. Ключевые слова стереоскопическая система, обработка изображения. Совмещение изображений стереопары методом ключевых точек происходит менее. Предложенные методы формирования стереопары могут найти. Стереопара Ключевые Точки' title='Стереопара Ключевые Точки' />Опять же вектор, описывающий прямую, определен с точностью до ненулевого множителя. При этом уравнение прямой будет иметь вид l. Tx 0. В случае, когда a. X2. 26. 0 0 мы имеем аналог обычной прямой ax by c 0. А вектор 0,0,w соответствует прямой лежащей в бесконечности. Трехмерное проективное пространство. По аналогии с проективной плоскостью, точки трехмерного проективного пространства определяются четырехкомпонентным вектором однородных координат x,y,z,wT. Опять же для любого ненулевого числа a, координатные вектора x,y,z,wT и ax,ay,az,awT соответствуют одной и той же точке. Как в случае проективной плоскости, между точками трехмерного Евклидова пространства и трехмерного проективного пространства можно установить соответствие. Вектору однородных координат x,y,z,wT при w X2. Евклодова пространства с координатами xw,yw,zwT. А про точку с вектором однородных координат вида x,y,z,0T говорят, что она лежит в бесконечности. Проективное преобразование. Еще одна вещь, которая потребуется для дальнейшего изложения это проективные преобразования homography, projective transformation в англ. С геометрической точки зрения, проективное преобразование это обратимое преобразование проективной плоскости или пространства, которое переводит прямые в прямые. В координатах, проективное преобразование выражается в виде невырожденной квадратной матрицы H, при этом координатный вектор x переходит в координатный вектор x по следующей формуле x Hx. Модель проективной камеры. Рисунок 1 Модель камеры. C центр камеры, Cp главная ось камеры. Точка X трехмерного пространства проецируется в точку x на плоскости изображения. Проективная камера определяется центром камеры, главной осью лучом начинающимся в центре камеры и направленным туда, куда камера смотрит, плоскостью изображения плоскостью на которую выполняется проецирование точек, и системой координат на этой плоскости. В такой модели, произвольная точка пространства X проецируется на плоскость изображения в точку x лежащую на отрезке CX, который соединяет центр камеры C с исходной точкой X см. Формула проецирования имеет простую математическую запись в однородных координатах где X однородные координаты точки пространства, x однородные координаты точки плоскости, P матрица камеры размера 3 XD7 4. Матрица P выражается следующим образом P KR. Однако этот постоянный множитель обычно выбирается так, что бы матрица камеры имела вышеописанный вид. В самом простейшем случае, когда центр камеры лежит в начале координат, главная ось камеры сонаправлена оси Cz, оси координат на плоскости камеры имеют одинаковый масштаб что эквивалентно квадратным пикселям, а центр изображения имеет нулевые координаты, матрица камеры будет равна P K. В таком случае матрица внутренних параметров примет вид Коэффициенты f, X3. B1 x, X3. B1 y называются фокусными расстояниями камеры соответственно общим и вдоль осей x и y. Помимо этого, в силу неидеальности оптики, на изображениях, полученных с камер, присутствуют искажения дисторсии distortion. Данные искажения имеют нелинейную математическую запись где k. X2. 03. 3, y X2. Дисторсии не зависят от расстояния до объекта, а зависят только от координат точек, в которые проецируются пиксели объекта. Соответственно для компенсации дисторсий обычно выполняется преобразование исходного изображения полученного с камеры. Это преобразование будет одним и тем же для всех изображений, полученных с камеры, при условии постоянства фокусного расстояния математически одной и той же матрицы внутренних параметров. В ситуации, когда известны внутренние параметры камеры и коэффициенты дисторсии говорят, что камера откалибрована. Пара камер Об определении трехмерных координат наблюдаемых точек можно говорить, когда есть как минимум две камеры. Матрицы пары камер, калибровка. Пусть имеются две камеры, заданные своими матрицами P и P в некоторой системе координат. В таком случае говорят, что имеется пара откалиброванных камер. Если центры камер не совпадают, то эту пару камер можно использовать для определения трехмерных координат наблюдаемых точек. Зачастую, система координат выбирается так, что матрицы камер имеют вид P K. Это всегда можно сделать, если выбрать начало координат совпадающее с центром первой камеры, и направить ось Z вдоль ее оптической оси. Калибровка камер обычно выполняется, за счет многократной съемки некоторого калибровочного шаблона, на изображении можно легко выделить ключевые точки, для которых известны их относительные положения в пространстве. Далее составляются и решаются приближенно системы уравнений, связывающие координаты проекций, матрицы камер и положения точек шаблона в пространстве. Существуют общедоступные реализации алгоритмов калибровки, например, Matlab Calibration toolbox. Так же библиотека Open. Зрение для робота на Raspberry Pi карта глубин Geektimes. Нынче все технологии дроностроительства активно дешевеют. Кроме одной получение карты окружающего пространства. Тут есть две крайности либо дорогие лидары тысячи долларов и оптические решения для построения карты глубин много сотен долларов, либо совсем копеечные решения типа ультразвуковых дальномеров. Поэтому возникла идея на базе недорогой Raspberry Pi с одной камерой сделать решение, которое окажется в пустующей нише и позволит получать карту глубин за недорого. Причем сделать это на простом языке программирования типа Python, чтобы это было доступно новичкам для экспериментов. Собственно, о своих результатах я и хотел рассказать. Получившиеся скрипты с примерами фоток можно запускать и на десктопе. Карта глубин с одной камеры. Сначала пару слов об оптической части. Для построения карты глубин всегда используются две картинки с левой и правой камер. А у нас в наличии малина с одной камерой. Поэтому был разработан оптический разделитель, который в результате отдает на камеру уже стереопару. Тесты Девиантное Поведение. Простым языком если глянуть на фото, то из чрной коробочки на вас смотрят два глазка камеры. А на самом деле камера одна. Просто немного оптической магии. На фото представлена уже двенадцатая итерация устройства. Потребовалось немало времени, чтобы получить надежную стабильную конструкцию, которая при этом еще и обходилась бы недорого. Самой непростой частью являются внутренние зеркала, которые делались под заказ вакуумным напылением алюминия. Если использовать типовые зеркала, у которых отражающий слой находится под стеклом, а не над ним, то в месте их стыка образуется зазор, который радикально портит всю картину. На чем будем работать. За базу был взят малиновый образ Raspbian Wheezy, поставлен Python 2. Open. CV 2. 4, ну и требуемые пакеты по мелочи matplotlib, numpy и прочие. Все сорсы и ссылка на готовый образ карточки выложены в конце статьи. Описание скриптов в виде уроков можно посмотреть на сайте проекта. Готовим картинку к построению карты глубин. Так как решение у нас не из металла и без сверхточной оптики, то в результате сборки возможны небольшие отклонения от идеальной геометрии. Плюс еще камера у нас к устройству крепится винтиками, поэтому е положение может быть не идеальным. Вопрос с расположением камеры решается вручную, а компенсация кривизны сборки конструкции у нас будет делаться программно. Скрипт первый выравнивание камеры. Стык зеркал на картинке в идеале должен быть вертикальным и находиться по центру. Он просто захватывает картинку с камеры в режиме live preview, выводит е на экран, а по центру в overlay рисует белую полоску, по которой и идет выравнивание. После того как камера правильно сориентирована затягиваем винтики посильнее, и сборка закончена. Что интересного в коде первого скрипта. Код скрипта достаточно простой ссылка. Из интересного и полезного можно отметить работу с оверлеем на малине эта фича позволяет оперативно выводить на экран информацию, не прибегая к рисованию окошек через cv. В оверлей можно вывести как картинку, так и массив данных. Для рисования полоски просто я воспользовался массивом, заполнив одну колонку белыми точками. В последнем скрипте, где критична скорость, в оверлей будет выводиться уже карта глубин. Технический момент в нашей схеме используется однократное отражение картинки от зеркала, т. Поэтому мы разворачиваем е обратно, указав camera. True. Скрипт второй получаем чистую стереопару. Наша левая и правая картинки стыкуются в центре изображения. Стык на фото имеет ненулевую ширину от нее можно избавиться только удаляя зеркала от устройства, что увеличивает размер конструкции. Камера малины имеет настроенный на бесконечность фокус, и близко расположенные объекты в нашем случае это стык просто размываются. Поэтому нужно просто указать скрипту, что по нашему мнению является плохой зоной, чтобы стереопара резалась чистые на картинки. Был сделан второй скрипт, который выводит картинку и позволяет клавишами указать ту зону, которая будет вырезана. Вот как выглядит процесс Что интересного в коде второго скрипта. Вот исходники второго скрипта. Ловим клавиши, нажатые пользователем, и рисуем прямоугольник через cv. Сюрпризом оказалось то, что коды клавиш могут отличаться в зависимости от режима клавиатуры, ну и на маке есть свои особенности. В итоге, например, для обработки клавиши Enter ловятся три разных варианта кода. После настройки может оказаться, что левая и правая части фото имеют разную ширину. Поэтому скрипт выбирает наименьшую из них и дальше работает с ней, чтобы левое и правое изображения имели идентичные размеры. Для удобства чтения сохраненный данных добавил сохранение в формате JSON. Благо есть готовая либа, которая превращает форматирование, сохранение и чтение в сплошное удовольствие. Пришлось учесть человеческий фактор. Бывает, что запустишь скрипт на пробу, а он при сохранении результата затирает предыдущий файлик, сделанный с особой любовью и тщательностью. Поэтому результат настройки сохраняется в текущую директорию, а не в рабочую подпапку. Для дальнейшей работы нужно ручками перенести его в требуемое место. После этого случайные затирания у меня не повторялись. Файлик имеет имя вида pf. В этом случае скрипт не грузит библиотеки работы с камерой и можно работать. В коде для этих целей оставлены строчки load. Image. Path. А именно, все ключевые точки с левой картинки должны находиться на той же высоте и на правой картинке. При таком раскладе функция Stereo. BM, которая у нас единственная real time, может успешно делать свое дело. Для калибровки нам нужно напечатать эталонную картинку, сделать серию фотографий и отдать е алгоритму калибровки, который высчитает все искажения и сохранит параметры для приведения картинок в норму. Итак, печатаем шахматную доску и приклеиваем на твердую плоскую поверхность. Для простоты серийного фото был сделан скрипт с таймером обратного отсчета, который выводится поверх видео. Вот как выглядит скрипт серийного фотографирования в работе Что интересного в коде 3 го скрипта. Исходный код третьего скрипта. Был словлен неприятный сюрприз. Оказалось, что картинка на предпросмотре и захваченное фото сильно отличаются. То, что было видно на превьюшке, оказывается частично отрезано на фото. Причина в том, что захват малиновой камерой фото и видео сильно отличается как по работе с самим сенсором, так и по постобработке результата. Поэтому далее везде при захвате картинки мы принудим функцию camera. Экспериментально был подобран период 5 секунд за это время можно спокойно разместить шахматную доску в новом положении. Опять же, для борьбы со случайным затиранием предыдущей серии все фото сохраняются в текущую директорию, и для дальнейшей работы их надо перенести в папку. Надо особо отметить, что правильность сделанной серии критична для результатов калибровки. Чуть позже мы посмотрим на результат, который получается при неверно сделанных фотографиях. Скрипт 4 резка фото на стереопары. После того как серия фото сделана, сделаем еще один сервисный скриптик, который берет всю сделанную серию фото и режет е на пары картинок левые и правые, и сохраняет пары в папку. Просмотр нарезанных пар позволяет оценить, насколько хорошо мы настроили удаление расфокусированной зоны по центру картинки. Скрипт достаточно зауряден, поэтому видео я спрятал под спойлер. Пример работы и ссылка на исходники 4 го скрипта Самое интересное калибровка, скрипт пятый. Скрипт калибровки скармливает все стереопары из папки. После своей непростой работы для 1. Правда, в оригинальной версии она вываливалась с ошибкой, если не находила шахматную доску на картинке, поэтому я сделал свой форк и добавил игнорирование плохих стереопар. По умолчанию скрипт по очереди показывает каждую картинку с отмеченными на ней найденными точками на шахматной доске, и ждет нажатие клавиши пользователем. Это полезно при отладке.

Стереопара Ключевые Точки
© 2017