doc - Нижегородский государственный университет

реклама
Нижегородский государственный университет им. Н.И. Лобачевского
Факультет вычислительной математики и кибернетики
Учебный курс
«Разработка мультимедийных приложений
с использованием библиотек OpenCV и IPP»
Лекция
Проективная геометрия в компьютерном зрении
____________________
Ерухимов В.Л., Лысенков И.Д.
При поддержке компании Intel
Нижний Новгород
2013
Содержание
1.
ПРОЕКТИВНАЯ
ГЕОМЕТРИЯ
В
КОМПЬЮТЕРНОМ
ЗРЕНИИ .............................................................................................................. 3
1.1.
1.2.
1.3.
1.4.
1.5.
1.6.
1.7.
1.8.
2.
ПРИЛОЖЕНИЯ ....................................................................................... 4
PINHOLE-КАМЕРА ................................................................................. 6
МОДЕЛЬ ИСКАЖЕНИЙ ЛИНЗ ................................................................. 9
ОПРЕДЕЛЕНИЕ ПОЗЫ ОБЪЕКТА. ЗАДАЧА PNP.................................... 11
КАЛИБРАЦИЯ КАМЕРЫ. ...................................................................... 16
ПЛАНАРНЫЕ ОБЪЕКТЫ. ГОМОГРАФИЯ. ............................................. 19
СТЕРЕО-ЗРЕНИЕ. ................................................................................. 23
ФУНКЦИИ В OPENCV. ........................................................................ 29
ЛИТЕРАТУРА .................................................................................... 30
1. Проективная геометрия в компьютерном зрении
Данный раздел посвящен проективной геометрии в компьютерном зрении.
Начнем с примера использования проективной геометрии. На рисунке
можно
увидеть
интересный
эффект:
фотографию
можно
проинтерпретировать как будто перед вами дыра в асфальте и вы смотрите
в нее. Понятно, что на самом деле на асфальте лишь изображение,
нарисованное с помощью законов проективной геометрии.
Kurt Wenner, Disaster. Suso Streetwear Music Video Installation, London, England.
Предположим, что для этого рисунка мы попытаемся решить задачу
компьютерного зрения, т. е. по данному изображению понять, что здесь:
картина, нарисованная на асфальте, или дыра в асфальте. Если не
использовать знания об окружающем мире (всѐ-таки маловероятно, что это
отверстие в асфальте из которого пытаются выбраться люди), то по одному
изображению эту задачу сложно разрешить и восстановить реальную
трехмерную структуру. С такими двусмысленностями мы в настоящем
разделе будем часто сталкиваться. Для их разрешения мы будем
использовать второе изображение сцены и, уже имея два изображения
сцены, мы сможем понять, какова же ситуация на самом деле.
Прежде всего, необходимо сказать о литературе. В проективной геометрии
есть своя библия – источник, в котором вы сможете найти ответ почти на
любой вопрос по проективной геометрии – Richard Hartley and Andrew
Zisserman “Multiple View Geometry in Computer Vision”.
1.1.
Приложения
Поговорим о приложениях и мотивации – зачем вообще используется
геометрия в компьютерном зрении. Рассмотрим одно из приложений. Вы
хотите сконструировать машину, которая могла бы ездить без водителя,
используя компьютерное зрение: она ориентировалась бы в мире по
изображению. Или, говоря более обще, вы хотите, чтобы робот мог
автоматически определять курс в пространстве, и перемещаться из точки A
в точку B. Такой машине или роботу нужно не просто знать изображения –
нужно понимать, какая структура мира за этими изображениями стоит: где
дорога и можно ехать, а где уже дома и ехать нельзя. Нужно восстановить
трехмерную структуру. Если не так глобально рассматривать задачу
навигации, а только ситуацию, когда робот работает в ограниченных
условиях, то все равно нужно понимать, как устроен трехмерный мир.
Если мы хотим, чтобы робот мог распознать объект, взять его, отнести и
что-нибудь с ним сделать, то недостаточно просто найти его на двумерном
изображении – нужно понять, где этот объект расположен в пространстве.
Willow Garage, PR2 Robot Cleans Up with a Cart
Нужно знать его трехмерные координаты, его ориентацию. Только после
этого робот сможет понять, как двигать рукой в пространстве для того,
чтобы этот объект взять. Для этого нужно понимать, по каким законам мир
отображается в изображение и обратно, чтобы восстановить эту
трехмерную структуру.
Вот еще один пример – мы хотим сконструировать систему помощи
водителю, которая автоматически детектирует пешеходов, и если пешеход
оказался достаточно близко к машине – впереди нее, то она начинает
автоматически тормозить.
Volvo, Crash-test dummy for Volvo Cars, http://bit.ly/162KtRZ
Требуется не просто продетектировать пешехода и остановиться – вновь
необходимо восстановить трехмерную структуру – определить на каком
расстоянии находится пешеход, оценить, что произойдет кризис, если мы
не остановимся и только после этого уже начать тормозить.
Еще один пример – встраивание в изображение виртуальных объектов. Мы
не можем просто нарисовать их поверх всего: как правило, это будет
выглядеть весьма неестественно. Мы должны встроить его с учетом
геометрии сцены для того, чтобы этот объект был физически корректно
расположен.
Garfield: The Movie
Кот Гарфилд на рисунке не просто нарисован поверх всего изображения,
он корректно встроен в сцену.
Существует целая технология – дополненная реальность: вы снимаете
картинку с мобильного телефона и у вас на эту картинку встраивается
какой-нибудь виртуальный объект. Для того чтобы это все было
естественно – нужно использовать геометрию сцены. Сначала мы снимаем
сцену и восстанавливаем ее трехмерную структуру, например, используя
детекторы ключевых точек и дескрипторы. Для более правильного
восстановления трехмерной структуры используется много изображений.
После этого шага можно встраивать виртуальные объекты с учѐтом этой
трехмерной структуры.
1.2.
Pinhole-камера
В первую очередь, построим модель: как камера видит трехмерный мир?
по каким законам, геометрические структуры, которые в нем есть,
проецируются на изображение? Потом мы научимся решать обратную
задачу – по данному изображению понять какой трехмерный мир, какая
сцена могли его задать. Наиболее популярная модель – это проективная
модель камеры, или pinhole-камера (pinhole – булавочное отверстие).
Pinhole camera model (image from J. Sivic's presentation)
В этой модели камера представляет собой маленькое отверстие, сквозь
которое поступает свет. Соответственно, если взять точку наверху свечи,
то когда свет поступает через это отверстие, верхняя точка свечи будет
проецироваться на изображение уже вниз. Плоскость (image plane)
представляет собой матрицу камеры, на которой получается изображение
трѐхмерного мира – фотография. На этой плоскости верх объекта
проецируется вниз, а для низа получается наоборот, и объект получается
перевернутым. Если смотреть, как именно устроен глаз, то у него такая же
модель и в нѐм получается проекция перевернутая, а затем мозг уже ее
правильно интерпретирует. Кстати говоря, можно провести следующий
забавный эксперимент. Существуют специальные очки, надев которые вы
будете все видеть в перевернутом виде. Если вы походите в таких очках
некоторое время (несколько дней), то ваш мозг приспособиться к этому и
будем сам переворачивать картинку обратно – вы в этих очках сможете все
нормально делать. Когда вы их снимете, то вам опять будет неудобно, но
через какое-то время вы вновь перестроитесь, и все восстановится обратно.
Перейдем теперь к формулам, описывающим преобразование,
осуществляемое камерой. Эти формулы самые важные в проективной
геометрии, и они будут использоваться на протяжении всего раздела.
В пространстве введем прямоугольную систему координат (X, Y, Z)
следующим образом. Пусть ее начало находится в том самом маленьком
отверстии – центре проекции (pinhole). Ось Z направлена по направлению
камеры – это так называемая оптическая ось. Оси X и Y можно задавать
по-разному. Обычно в математике ось Y направлена вверх, но в
компьютерной графике ось Y обычно направлена вниз.
Pinhole camera model (Wikipedia)
Напомним, что положение жесткого объекта (твердого тела) в
пространстве задается 6 параметрами, например, 3 координатами центра
масс и 3 эйлеровыми углами, отвечающими за поворот тела вокруг центра
масс. Пусть – центр масс объекта, а – матрица поворота, которую
можно построить по эйлеровым углам. Тогда формула пересчета
координат имеет вид
( )
(
)
где
– начальные координаты точки, принадлежащей твердому
телу (в системе координат, связанной с этим объектом),
–
координаты этой точки в текущей сцене. Из подобия треугольников
получаются следующие формулы для координат этой точки на
изображении:
вычисленные в некоторых безразмерных единицах. Чтобы получить
координаты в пикселях, отмасштабируем и и произведем сдвиг:
где и
– масштабирующие коэффициенты, а
– коэффициенты
сдвига. Заметим, что масштабирующие коэффициенты
и
здесь не
обязательно равны, так как пиксели не обязательно квадратные. Смысл
коэффициентов
нетрудно понять, если в наши формулы подставить
точку с координатами
т. е. точку, находящуюся на
расстоянии от камеры на оптической оси. Легко видеть, что эта точка на
изображении будет иметь координаты
. Таким образом,
примерно совпадают с координатами центра изображения.
Приведенные формулы удобнее записывать в однородных координатах:
( )
( )
)
(
где
(
)
Матрица имеет размеры 3 × 4 и называется проекционной матрицей. Она
получается как произведение матрицы
содержащей внутренние
) , полученной приписыванием к
параметры камеры, и матрицы (
матрице
вектора сдвига .
Особенность однородных координат заключается в том, что умножение их
на одно и то же число, приводит, по существу, к той же точке – мы можем
умножать координаты на любое число
Поэтому для получения
непосредственно координат в пикселях, необходимо поделить полученный
вектор на такую величину, чтобы последняя координата была равна 1.
Однородные координаты возникают здесь очень естественным путем.
Рассмотрим точку (
) на изображении. В нее проецируются все точки
некоего луча. Таким образом, с точки зрения проекции все точки на луче
) (
)
для нас одинаковые. Например, это так для точек (
(
) и т. д. – для всех точек, полученных умножением (
) на
ненулевой скаляр.
Рассмотрим, как используются эти формулы на практике. Мы построили
).
матрицу , и хотим узнать в какой пиксель перешла точка (
Умножаем координаты точки на
– получаем вектор в однородных
координатах и нормируем его, таким образом, чтобы последняя координата
была равна 1. Получившиеся первые две координаты – это уже конкретные
координаты в пикселях на изображении.
1.3.
Модель искажений линз
Мы рассмотрели хорошую математическую модель, которая работает в
идеальном случае. Но это еще не все, что нам нужно. На практике у нас
возникают дополнительные эффекты из-за того, что мир неидеальный, и
линзы они тоже несовершенны – они вносят свои искажения. Например,
вы видите то, что в трехмерном мире было прямой линией на изображении
перешло в некую изогнутую кривую.
Fisheye lens room (Wikimedia)
На самом деле, в предыдущей математической модели прямые линии
должны переходят в прямые. На приведенном рисунке искажения вносят
непосредственно линзы. Их тоже нужно моделировать для того чтобы
корректно предсказывать, как трехмерный мир перейдет на изображение.
Для того чтобы это моделировать вводятся так называемые коэффициенты
дисторсии и рассматривается довольно сложная модель:
( )
(
(
( )
)
)
(
(
)
)
где
Отметим только, что все эти искажения мы приближаем неким полиномом.
У этого полинома есть некоторые коэффициенты – это и есть
коэффициенты дисторсии, которые моделируют искажения. Если мы
сможем для камеры посчитать эти коэффициенты, то, тем самым, мы
сможем предсказать, какие искажения вносит эта камера. В этом случае,
зная трехмерный мир, зная проекционную матрицу камеры и
коэффициенты дисторсии, мы можем корректно предсказать, куда именно
спроецируется трехмерная точка на изображение. Идея в том, что вместо
идеальной проективной проекции произойдет переход в какое-то
искаженное положение, которое мы должны здесь учесть.
1.4.
Определение позы объекта. Задача PnP.
Теперь рассмотрим конкретный пример того, как описанную модель
камеры можно использовать для получения каких-нибудь знаний о
трехмерном мире по его изображению. Сейчас мы попытаемся найти позу
объекта. Это как раз задача из примера с роботом: чтобы взять объект,
робот должен понять, как именно объект расположен в трехмерном мире.
Мы рассмотрим, как эту задачу можно решать.
Объект изначально имеет некие трехмерные точки в какой-то системе
координат, связанной с объектом (не так важно какую именно систему
координат брать). Также мы знаем координаты точек объекта на
изображении, и мы знаем, что эта точка изображения соответствует
конкретной трехмерной точке. Как этого добиться и как найти такие
соответствия – об этом вам должны были рассказывать в лекции про
детекторы и дескрипторы. Это как раз стандартный способ нахождения
таких соответствий. Если вы знаете дескрипторы, которые возможны для
трехмерной точки, то вы сможете найти соответствие этих дескрипторов с
точкой на изображении. И, таким образом, понять, что вот эта трехмерная
точка соответствует именно вот этой двухмерной точке. То есть если это
какая-то специфическая точка на объекте, с характерной текстурой, то
такое соответствие вы сможете построить. Когда есть такие соответствия
из 3d в 2d, мы можем поставить задачу поиска объекта. Нам нужно
определить позу объекта – то есть найти конкретные матрицы R и T,
которые характеризуют позу объекта. Например, если цилиндр расположен
в той же ориентации, что и изначально, то у него будет просто какой-то
вектор переноса. Если он еще повернут, то соответственно будет еще
какая-то матрица поворота. Это и будет поза объекта, которая нужна
роботу, чтобы его взять.
Для того чтобы эту задачу решать, мы можем на нее посмотреть как на
задачу оптимизации. Что мы хотим сделать? У нас есть трехмерные точки,
мы знаем, что для проекционной матрицы P точки (X,Y,Z) проецируются в
некие (u,v) при какой-то фиксированной позе
. И мы хотим взять такие
и , чтобы вот эти проекции совпадали с теми координатами, которые
мы на самом деле наблюдаем. Мы хотим, чтобы точка объекта
спроецировалась именно в соответствующую точку на изображении.
Таким образом, получаем задачу оптимизации: необходимо найти
минимум функции ошибки
( )
варьируя
∑ |( )
(
)|
и , при условиях
(
)
( )
Вообще говоря, можно рассматривать не только такую целевую функцию
для минимизации; можно было бы рассматривать какие-то другие функции
и соответственно получалось бы другое решение. Например, можно
рассматривать ошибку не в плоскости изображения, а в трѐхмерном мире:
– у нас есть камера C, оптическая ось и плоскость изображения, на
которую мы проецируем. Раньше она у нас была сзади – за камерой – но
мы ее можем перенести вперед, и это будет фактически тоже самое. Когда
у нас изображение находилось сзади камеры – с этим было не очень
удобно работать – так как все переворачивалось. Поэтому вводят
виртуальную плоскость, расположенную перед камерой, тогда точка
объекта, которая находилась вверху, будет и верхней точкой проекции. И
это уже то, что постоянно используется, и с чем удобно работать.
Соответственно, мы рассматриваем виртуальную плоскость (слайд 14), нам
известна точка Xi на изображении – мы спроецировали нашу точку модели
и мы можем рассматривать ошибку репроекции, то есть ошибку вот этого
расстояния на изображении. Вообще говоря, можно было бы
рассматривать расстояние в трехмерном пространстве – то есть точку
модели и реальные трехмерные координаты. И соответственно
рассматривать минимизацию такой целевой функции. Решение получилось
бы немножко другое, потому что ошибка на изображении будет
одинаковой (у точек общая проекция), а в трехмерном пространстве, если
мы их будем сдвигать – геометрическое расстояние в трехмерном мире оно
будет меняться. То есть можно рассматривать и другие целевые функции –
будет своя ошибка, которую мы будем минимизировать:
(
)
То, что мы здесь обсудили, называется проблемой PnP (perspective- -points
problem): у нас есть трехмерные точки, у нас есть двумерные соответствия
и внутренние параметры камеры. Проблема заключается в поиске позы
объекта
.
Рассмотрим один из самых простых способов ее решения – метод DLT
(Direct Linear Transformation). Идея метода очень красивая. Мы хотим,
чтобы трехмерные точки проецировались в известные точки на
изображении:
(
)
( )
Из-за однородных координат у нас получается коэффициент . В правой
части записан трехмерной вектор, и в левой части записан трехмерный
вектор, которому соответствует целая прямая. Мы хотим, чтобы при
правильно подобранном , они бы совпали. Но поскольку непонятно,
откуда этот брать, то мы можем задачу решать по-другому – мы можем
сказать, что эти векторы должны быть коллинеарны и поэтому векторное
произведение этих векторов должно быть равно нулю:
(
)
( )
Таким образом, мы получаем уравнение относительно матрицы P, которое
мы уже можем решать – получается просто система линейных уравнений.
Тем самым мы найдем позу объекта. Метод получается очень простой, но
тем не менее, есть другие методы, потому что, когда мы будем решать
систему линейных уравнений, то у нас будет минимизироваться вектор
невязки – сумма квадратов ошибок в этой системе – то есть мы
минимизируем некую алгебраическую ошибку – каков ее физический
смысл – так сразу и непонятно. На выходе мы что-то получим, но что
именно мы минимизировали проинтерпретировать физически сложно.
Поэтому методы, которые явно минимизируют ошибку репроекции в этом
отношении лучше, потому что мы четко понимаем, что мы минимизируем,
и наша целевая функция действительно осмысленная. Обычно
используются именно такие методы, но в явном виде решение в них не
выведешь, поэтому используются оптимизационные методы. Например,
метод Левенберга-Марквардта, который представляет собой смесь
градиентного спуска и метода Ньютона, в нем динамически определяются,
какой алгоритм лучше использовать. Есть другие методы, которые
используют три соответствия или четыре соответствия и находят позу.
Вообще говоря, для того чтобы решить задачу PnP нужно как минимум
четыре соответствия для того, чтобы не было неоднозначности. На
практике обычно берется больше соответствий для того чтобы убрать
влияние шумов и получить точную оценку. Есть очень важный момент, о
котором мы сейчас поговорим – то, что в этих соответствиях очень часто
бывают шумы. Если вы помните из детекторов-дескрипторов – когда мы
находим соответствия – то у нас не вот идеально находится один
дескриптор и соответствующий ему второй дескриптор – часто возникают
ложные соответствия. И поэтому в том методе, который мы обсудили –
ничего работать не будет, потому что мы будем пытаться минимизировать
ошибку репроекции там, где вообще у нас что-то проецируется совсем не
туда. Поэтому хорошего результата мы не получим. Для работы с большим
количеством ложных соответствий используется метод RANSAC. Это
очень популярная идея, которая используется в большом количестве задач.
Идея состоит в том, что мы не можем оптимизировать по всем
соответствиям сразу из-за наличия шумов – поэтому мы выберем 4
случайных соответствия – что позволит однозначно определить позу. И так
мы будем делать много-много раз. В какой-то момент нам повезет – мы
выберем такие 4 соответствия, что все они правильные. По этим 4
соответствиям мы оценим правильную позу. И чтобы понять, что
найденная поза действительно правильная мы делаем следующее –
рассчитаем количество так называемых инлайеров. Что такое инлайер? Вот
у нас есть трехмерные точки, мы нашли некоторую позу R и T, и для этих
точек применяет эту позу и смотрим, перешли ли они в соответствующие
точки. Если точки спроецировались близко – то это намек на то, что поза
правильная. Одно соответствие сработало – трехмерная точка перешла в
правильную двумерную. Соответственно, если большое количество точек
при найденной позе переходит в правильные точки, то мы почти уверены,
что поза правильная. Можно добавить еще один шаг. После того как мы
нашли лучшее преобразование, которое дает максимальное количество
инлайеров, мы уточняем его по всем найденным соответствиям. Мы позу
изначально нашли по 4 соответствиям, теперь, когда мы уже знаем, какие
соответствия правильные, а какие нет, мы посчитаем позу по всем
соответствиям. Как долго работает этот алгоритм? Нужно делать много
итераций, но каждая итерация довольно простая. Выборка случайных
точек – это просто; найти преобразование по 4 точкам – это тоже просто; с
нахождением количества инлайеров ситуация уже посложнее, потому что
нам нужно взять все трехмерные точки, спроецировать их, проверить
перешли ли они в соответствующие, но всѐ равно это не очень тяжелая
операция.
Рассмотрим еще один пример, чтобы лучше прочувствовать метод
RANSAC: как можно применять этот метод к поиску прямых. У нас есть
двумерные точки, где-то в них есть какая-то прямая, но при этом есть
очень много разных шумов. Прямая угадывается, на ней очень много
точек. Но как нам найти такую прямую? Если мы стандартно попытается
применить метод наименьших квадратов –то понятно, что ничего хорошего
не будет, шумы нам все испортят. Поэтому здесь можно применять метод
RANSAC. Мы случайно берем две точки, проводим прямую и смотрим,
сколько получилось инлайеров – то есть, сколько точек попало на эту
прямую. Сейчас мы очень неудачно выбрали точки – на этой прямой точек
почти нет. Если на следующей итерации мы возьмем другие две точки, то
одна точка на нее попала, и у нас есть три точки на прямой. Так мы будем
делать много-много раз, и в какой-то момент нам повезет, мы выберем
точки, которые действительно лежат на прямой. У нас будет очень много
инлайеров, и очень много точек лежат близко к этой прямой.
Давайте обсудим, сколько нам нужно итераций для того, чтобы все
получилось хорошо. Здесь все зависит от того, насколько много у нас
ложных соответствий и насколько много правильных. Если бы у нас все
соответствия были правильные, то мы бы сошлись за одну итерацию. Если
же у нас много ложных соответствий, то нам понадобится много итераций
для того чтобы найти правильное. Если вероятность выбрать правильное
соответствие равна p, например, 0.2, если у нас 20% соответствий
правильные. Для того чтобы метод нашел правильную модель –
правильную прямую или правильную позу – нам нужно чтобы все
соответствия были правильными – то есть нам нужно выбрать k
соответствий правильных. Грубо говоря, это будет pk – вероятность того,
что все k соответствий правильные. И если найти теперь мат. ожидание.
Сколько нам нужно сделать итераций n, чтобы событие с вероятностью pk
наступило? Легко выводится, что мат. ожидание количества операций
будет обратное – 1/pk . То есть если у нас 50% соответствий правильные, и
нам нужно найти 4 соответствия, то нам понадобится 1/24 итераций, то есть
не так уж и много. Формулу вы можете видеть на слайде 18.
Рассмотрим конкретный пример. Задача для робота – задача определения
позы объекта.
Вот у нас объекты были в тренировочном глазе, робот обучился, запомнил
их, и теперь, когда ему пришла новая картинка, где он хочет понять, где
какие объекты расположены, то это можно сделать, именно решая задачу
PnP. Мы находим соответствия, используя дескрипторы, потом запускаем
схему RANSAC, и находим позу для каждого из объектов.
1.5.
Калибрация камеры.
Мы обсудили, что у нас есть внутренние параметры камеры – fx, fx, cx, cy –
матрица K, и есть коэффициенты дисторсии. И если мы хотим эту
математику применять, чтобы понять, куда трехмерные точки переходят –
нам нужно эти коэффициенты откуда-то брать. Пока откуда их брать –
совершенно непонятно. И чтобы понять, какие у камеры внутренние
параметры, какие конкретно у нее коэффициенты, проводится процедура
калибрации камеры. Если мы много раз покажем камере объект, про
который мы знаем, как он устроен, то мы сможем найти эти параметры.
OpenCV test data
Например, шахматная доска – мы знаем, какие именно у нее точки – мы
можем посмотреть, в какие точки они перешли на изображении. Если мы
много раз покажем этот шаблон нашей камере и увидим, куда
проецируются точки, то мы сможем установить эти параметры. У нас
вновь возникает задача оптимизации. Мы знаем трехмерные координаты
углов (мы можем измерить размеры квадрата и записать трехмерные
координаты шахматной доски), мы можем продетектировать эти уголки на
изображении – это стандартная задача. Таким образом, у нас будет
соответствие между трехмерной точкой и двухмерной точкой. И нам
нужно найти такие параметры, чтобы трехмерные точки переходили
именно в эти двухмерные точки. То есть нам нужно оптимизировать
параметры камеры так, чтобы у нас получалась правильная проекция.
Имеет ли значение положение доски и то, что она расположена
перпендикулярно камере? Для калибровки нам нужно показывать доску
под разными углами – ее можно поворачивать, ее нужно показать во всех
частях камеры для того, чтобы надежно установить ее параметры. Потому
что если вы будете показывать шаблон в одной и той же позиции в одном
углу, то мы хорошо выясним, как камера проецирует этот угол, но во всей
остальной части изображения все может быть очень плохо.
OpenCV test data
Помимо шахматной доски можно использовать и другие шаблоны –
например, шаблон из нарисованных кружков, он показывает более точные
результаты, потому что центра круга можно найти с большей точностью,
чем угол шахматной доски. Соответственно, калибрация получается более
точной. Можно использовать более сложные шаблоны, например,
трехмерные.
Рассмотрим за счѐт чего именно происходит калибрация. Допустим, мы
поместили в какую-то часть камеры доску. Для шахматной доски мы знаем
все углы и все соответствия, у нас здесь задача простая – все соответствия
есть и все соответствия правильные. Проекция каждой точки дает нам
уравнение, ограничение, как должна проецировать камера. Мы составляем
эти ограничения из всех изображений – обычно это несколько десятков – и
решаем задачу оптимизации. В обычных условиях достаточно одной
калибровки для одной камеры. Предоставляют ли производители камер
какие-либо технические данные? Проблема в том, что для одной модели
эти параметры будут немножко отличаться. Можно предоставить какие-то
параметры по умолчанию и такие камеры существуют, для которых они
посчитаны – для модели. Но для конкретной вашей камеры данной модели
они могут немного отличаться. Потому что если бы они не отличались, это
означало бы, что матрица расположена абсолютно на одном и том же
месте, абсолютно такие же линзы. На практике такое невозможно. У вас
всегда будут небольшие отклонения, следовательно, ваши параметры
калибрации тоже будут немного другими. Поэтому для более точных
параметров необходимо делать калибровку самому. Можно пытаться
делать автокалибрацию – снимать камерой обычное изображение – без
шаблонов шахматной доски, и при этом пытаться понять, какие у нее
внутренние параметры. Автоматически, без шаблонов, пытаться понять,
как она искажает. Но на практике получается, что иногда это работает,
иногда это не работает. В алгоритме автокалибрации есть несколько
параметров – эти параметры нужно подбирать для того, чтобы запустить
алгоритм, потому что при одних параметрах алгоритм сработает хорошо,
при других сработает плохо. Есть статьи на эту тему о том, как это можно
делать. Но пока эта задача не решена. В ситуации же с использованием
шаблонов – вы с гораздо большей надѐжностью получите хорошую
калибрацию камеры.
1.6.
Планарные объекты. Гомография.
Следующее, что нужно рассмотреть – это работа с планарными (плоскими)
объектами. В компьютерном зрении часто возникают планарные объекты –
это особый важный случай, который нужно обсудить отдельно, и
рассмотреть какие именно преобразования получаются для плоских
объектов. Это преобразование называется гомографией. Пусть у нас есть
какой-то плоский объект, у него какие-то точки p1,p2,p3,p0 –
расположенные в одной плоскости.
Planar object (Homography, Wikipedia)
Мы снимаем их камерой с одной точки, а потом снимаем их камерой с
другой позиции. Также можно говорить, что у нас камера фиксирована, и
мы снимаем шаблон в одной позе, а потом объект переместился, и мы
снимаем его в другой позе. Оказывается, что координаты точек на
изображении – на первом и на втором – они будут связаны
преобразованиями гомографии:
̃
̃
Это преобразование мы сейчас выведем.
Рассмотрим проекцию на первом изображении и проекцию на втором
изображении. Во втором случае у нас другая проекционная матрица,
потому что поза другая, соответственно точка тоже будет другая. Мы
хотим найти преобразование между пикселями на изображении. Идея
получения этого преобразования состоит в следующем: так как объект
плоский, то мы можем выбрать такую систему координат, в которой
начало координат расположено где-то на этой плоскости, ось Z будет
направлена по нормали к этой плоскости. И как-то направлены оси X, Y. В
этой системе координат будут новые проекционные матрицы, которые
всегда можно пересчитать. Главное, что координаты нашего объекта
теперь вместо (X,Y,Z,1) будут (X,Y,0,1). При умножении такого вектора
(X,Y,0,1) на проекционную матрицу размерности 3*4, то третий столбец
будет все время умножаться на ноль. Поэтому на плоскости в качестве
проекционной матрицы мы можем использовать матрицу P без третьего
столбца и умножать ее на вектор (X,Y,1). Тоже самое верно для второго
изображения. Теперь новые проекционные матрицы P1’ и P2’ имеют
размерность 3*3, дальнейшее просто. Мы можем слева умножить на
обратную матрицу, получим, что
̃
(̃ )
( )
Получается, что если мы знаем координаты первого изображения на
плоскости, то существует такая матрица 3×3, умножив на которую, мы
получим координаты на втором изображении.
Матрица Н и есть преобразование гомографии. Поскольку все происходит
в однородных координатах, то можно умножить на любой ненулевой
коэффициент w, и все будет тоже самое. Для перехода от однородных
координат к пикселям, необходимо поделить на w.
̃
̃
Теперь посмотрим, как матрицу гомографии можно использовать для
нахождения плоского объекта на изображении.
У нас есть плоский объект, который мы хотим найти,
OpenCV features2d tutorial
и есть тестовое изображение, на котором он где-то расположен.
OpenCV features2d tutorial
Мы применяем стандартную схему. Мы находим ключевые точки, находим
дескрипторы, и мы находим соответствия между дескрипторами.
У нас есть много ложных соответствий, поэтому сразу непонятно, где
находится объект.
OpenCV features2d tutorial
Но мы вновь можем применить схему RANSAC. Случайно выберем четыре
соответствия, по ним найдем матрицу гомографии. И генерировать до тех
пор, пока не получится много инлайеров. И после применения этой схемы
мы уже находим искомый объект.
OpenCV features2d tutorial
Это очень мощная идея – геометрическая валидация соответствий. У нас
очень много соответствий, но мы знаем, что правильные соответствия
переводят плоский объект в плоский объект, поэтому они должны
подчиняться гомографии. Таким образом, выкидывая те соответствия,
которые не соответствуют гомографии, мы оставляем только правильные
и, тем самым, находим объект на изображении.
1.7.
Стерео-зрение.
До сих пор мы в основном обсуждали, что у нас получается, если есть
только одно изображение. Сейчас мы детально поговорим о
математических моделях для случая, когда у нас есть два изображения
одной и той же сцены: какая здесь есть геометрия и что нам это дает. На
самом деле получается, что если у нас есть два изображения сцены, то мы
сможем восстановить трехмерную структуру. Имея только одно
изображение, мы можем сказать лишь, что пиксель соответствует какой-то
трехмерной точке на луче, проходящем через этот пиксель. Если же у нас
есть второе изображение, то мы сможем точно установить трехмерные
координаты этой точки.
Пусть у нас есть две камеры:
Epipolar Geometry, Wikipedia
левая и правая, при этом они немного повернуты друг относительно друга.
Пусть мы знаем плоскости первой и второй камер. Пусть есть какая-то
трехмерная точка, которую мы наблюдаем. Тогда для первой камеры она
спроецируется по лучу, как и было раньше, а для второй камеры она
спроецируется по другому лучу. Мы знаем координаты PL – на левом
изображении, и нас интересует вопрос, где на правом изображении может
располагаться проекция этой точки, то есть вопрос о нахождении
соответствующей точки. Легко сообразить, что здесь получается. По PL мы
понимаем, на каком луче она находится, соответственно на правом
изображении она находится на проекции этого луча. Проецируем луч на
правое изображение и получаем некую прямую. И на этой прямой
находится искомая проекция точки P. Мы получили эпиполярную линию –
это та линия, на которой может находиться соответствующая точка.
Раньше, когда мы рассматривали соответствия, мы брали точку на одном
изображении, брали второе изображение и искали по всему изображению,
где же может находиться соответствующая точка. Когда у нас две камеры
смотрят на одну и ту же сцену, у нас получается, что соответствующая
точка будет находиться не на всем изображении – она находится всего
лишь на одной линии – эпиполярной линии. Понятно, что всегда есть
шумы, поэтому точка будет не в точности на этой линии, а на небольшом
расстоянии. Заметим, что если мы рассмотрим какую-то другую точку P2 и
опять спроецируем луч, то проекция вновь пройдет через точку ER. Все
лучи проходят через эту точку – проекция центра другой камеры (левой).
Соответственно все прямые, при проекции, будут проходить через
проекцию центра левой камеры на правом изображении. Такая же ситуация
будет при проецировании точек с правой камеры на левую. Тоже будут
свои эпиполярные линии, и тоже будет общая точка всех эпиполярных
линий – она называется эпиполь.
Это преобразование (закон) можно записать с помощью фундаментальной
матрицы:
(
) (
)
Здесь u1, v1 – координаты точки на одном изображении: u2, v2 – проекции
той же трехмерной точки, но на другое изображение.
Если нам удобно работать не в координатах-пикселях, а в трехмерных
координатах – (X,Y,Z), то вводится так называемая существенная
матрица:
(
) ( )
где (x1,y1,1) – нормированные трехмерные координаты, то есть x1=x/z,
y1=y/z.
Возникает вопрос, как находить фундаментальную матрицу? Ответ
следующий: если у нас есть много соответствий между двумя
изображениями, то фундаментальная матрица – это такая матрица
размерности 3× 3, которая удовлетворяет соотношению
Если мы запишем несколько таких уравнений и решим систему, то мы
найдем фундаментальную матрицу. Поскольку фундаментальная матрица
определена с точностью до умножения на константу, то восьми
соответствий будет достаточно.
Есть еще несколько деталей – ранг матрицы F равен двум. Поэтому чтобы
получить матрицу ранга 2, мы заменяем полученное решение на
сингулярную матрицу, используя SVD.
Если в уравнении мы зафиксируем u2, v2 и матрицу F, то получим
уравнение эпиполярной линии. Если же в уравнение подставить
координаты эпиполя – то это будет как раз вырожденный случай.
Если мы знаем, как именно в пространстве расположены камеры
относительно друг друга и если мы знаем, как они откалиброваны, то есть
мы знаем их внутренние параметры, тогда мы можем написать формулу,
по которой матрица F будет вычисляться. Если же камеры не
откалиброваны, у нас просто есть изображения с камеры, то по этому пути
мы уже не сможем пойти, и фундаментальную матрицу нужно находить
через соответствия, как описывалось раньше.
По соответствиям мы можем вычислить фундаментальную матрицу и, как
и раньше, мы можем использовать это для геометрической валидации. Как
в случае на плоскости, когда мы хотели найти плоский объект, мы
пользовались матрицей гомографии. Но если мы хотим найти неплоский
объект, то матрица гомографии нам уже не поможет. Но нам поможет
фундаментальная матрица. Когда у нас получается много соответствий по
дескрипторам и, в том числе, ложных, мы можем проверить для
соответствия выполнение уравнения с фундаментальной матрицей. Если
для соответствия произведение не обращается в ноль, то следовательно,
оно является ложным. И запуская геометрическую валидацию, мы сможем
отбросить ложные соответствия и найти произвольный жѐсткий объект.
Обсудим, как по двум изображениям можно восстанавливать трехмерные
координаты точек. Примерно также работает человеческое зрение: у нас
есть два глаза, соответственно, у нас есть два изображения одной и той же
сцены. И используя два изображения одной и той же сцены, мы можем
восстановить трехмерную структуру. Рассмотрим, в чем состоит идея. Вот
у нас есть две камеры, которые смотрят на одну и ту же точку. Мы знаем
пиксель проекции с первой камеры и пиксель проекции со второй камеры.
Если мы пересечем лучи, на которых эти пиксели лежат, то их пересечение
и является рассматриваемой трехмерной точкой. Проблема в том, что когда
мы будем искать соответствия, то нам нужно искать соответствия вдоль
эпиполярных линий. Эти эпиполярные линии, вообще говоря,
расположены как-то под углом, что не очень удобно. Но есть особый
случай. Если у нас камеры параллельны друг другу, то эпиполярные линии
будут горизонтальные. Если мы попытаемся в таком расположении
спроецировать центр второй камеры на изображение, то он у нас не
спроецируется, потому что у нас луч из первой камеры и из второй камеры
– не пересекутся - так как они параллельны. То есть, по сути точка
проецируется в бесконечность, эпиполь у нас находится в бесконечности и
эпиполярные линии пересекаются в бесконечности. То есть они все
параллельны друг другу, и можно сообразить, что они будут именно
горизонтальны. Поэтому для восстановления трехмерной структуры сцены
мы будем применять такое преобразование, которое сведѐт нашу
произвольную задачу к этому особому случаю и переведѐт произвольные
эпиполярные линии в горизонтальные.
Итак, у нас есть камеры в произвольном положении, которые могут быть
повернуты относительно друг друга. Сначала мы строим преобразование
обратное к преобразованию дисторсии. То есть из искривленного
изображения получаем неискривленное.
Stereo rectification (G. Bradski, A. Kaehler, Learning OpenCV)
Прямые линии они слева в b изогнуты, а после преобразования становятся
действительно прямыми. И теперь для неискаженного изображения мы
поворачиваем камеры таким образом, чтобы они стали параллельны друг
другу – выполняем стерео-ректификацию. После этого соответствующие
друг другу точки (в ректифицированном изображении) теперь находятся на
одной линии.
Stereo rectification (G. Bradski, A. Kaehler, Learning OpenCV)
И теперь прямые линии соответствуют в точности прямым. И находить
соответствия теперь гораздо проще.
Теперь, когда есть два выровненных изображения, полученных
относительно друг друга просто сдвигом, можно находить соответствия.
Example of stereo data (University of Tsukuba)
Пусть есть точка на изображении, у нее есть какая-то окрестность. И нам
нужно найти соответствующую точку на другом изображении, причем уже
не на всем изображении, а просто на горизонтальной линии.
То есть мы получаем какую-то полоску пикселей и находим такое место,
которое наиболее похоже на то, что было у нас раньше:
Для этого можно просто посчитать евклидово расстояние – сумму
квадратов ошибок в каждом пикселе – для какого-то текущего положения.
Потому что мы взяли участок – положили его в какое-то место на нашей
полоске, посчитали ошибку, запомнили, сдвинули – посчитали следующую
ошибку и так далее. В результате мы найдем то место, где ошибка
достигает минимума. Таким образом, мы найдем, так называемое,
смещение (disparity) для этой точки. И зная смещение, мы уже сможем
восстановить трехмерные координаты. Шаблон – это некоторая
окрестность 8*8 или 16*16.
Получается, что для точек, которые расположены близко к камерам, это
смещение будет большое. Вы рассмотрели изображение с одного места,
потом передвинулись, рассматриваете изображение из другого места. Если
объект у вас располагался близко, то его координаты сместятся очень
сильно. А тот объект, который был у вас далеко – например, гора на заднем
фоне – он останется примерно на том же самом месте. Соответственно, это
смещение как раз показывает, насколько близко расположен объект. Из
подобия треугольников можно вывести формулу. Если известно
расстояние между камерами - D, известны внутренние параметры fx, то
можно найти уже трехмерную координату Z:
Формула показывает следующее: чем больше смещение, тем ближе точка к
нам находится.
Рассмотрим изображение.
И карта смещения для него
Светлым показаны области с большим смещением, а темным – со
смещением поменьше. И видим, что лампа к нам ближе всех, за ней голова,
и потом уже идет какой-то фон.
Используя этот принцип и карту смещения, мы можем корректно
восстановить трехмерную структуру нашей сцены. По этому же принципу
работает и наше зрение.
1.8.
Функции в OpenCV.
Все, что мы обсуждали – все это есть в OpenCV в модуле calib3d.
Если у вас есть трехмерные точки, параметры камеры и поза объекта, то
используя функцию projectPoints вы можете получить точки на
изображении в пикселях.
solvePnP – это решение проблемы PnP – по заданным соответствиям и
параметрам камеры найти позу объекта.
calibrateCamera – Калибрация камеры – если у вас есть много изображений
шахматной доски, то вы сможете найти ее и откалибровать камеру по
найденному шаблону.
Также есть функции для работы с двумя камерами. Эти функции
позволяют находить гомографию, фундаментальную матрицу, калибровать
две камеры вместе, делать ректификацию и т.п.
2. Литература
Hartley R., Zisserman A. Multiple View Geometry in Computer. Cambridge
University Press, 2004
Скачать