Калибровка камер состоит в определении значений элементов внутреннего ориентирования камеры и систематических ошибок оптической системы, вызванных главным образом дисторсией объектива.
Элементами внутреннего ориентирования являются фокусное расстояние (f ) и координаты главной точки (x o , y o ).
Для камер имеющих координатные метки, определяют также их координаты.
Систематические ошибки оптической системы определяют отличия реальной физической системы от ее математической модели. Дисторсия объектива влияет на геометрию проектирования, и как следствие не выполняется принцип коллинеарности (нарушается центральная проекция изображения)
Различают два типа дисторсии объектива: радиальную и тангенциальную. Радиальная дисторсия намного превышает тангенсальную, поэтому, как правило, определяют только радиальную дисторсию. На практике, современные метрические камеры имеют объективы с очень маленькой дисторсией, поэтому в процессе калибровки достаточно бывает определить только элементы внутреннего ориентирования. Для неметрических камер, главной проблемой является низкое качество изготовления объектива, связанное с большой дисторсией (может достигать 100мкм и более) и не центрирование отдельных элементов объектива, что приводит к неперпендикулярности главного оптического луча к плоскости изображения. Поэтому при калибровке таких камер целесообразно определять не только радиальную дисторсию, но и децентрацию оптической системы (нецентрированная или тангенциальная дисторсия объектива).
Дисторсия объектива может быть описана различными уравнениями, например:
Где d x , d y – поправки в координаты точек снимка за дисторсию объектива; x,y – координаты точек снимка; k 1 ,k 2 ,k 3 – коэффициенты радиальной дисторсии; p 1 ,p 2 – коэффициенты нецентрированной дисторсии объектива; r 0 – радиус- вектор, соответствующий нулевой дисторсии; r – расстояние от главной точки x o , y o :
Существует три метода калибровки камер:
Калибровка с помощью многокалиматорного калибратора
Калибровка с помощью тест объекта.
Самокалибровка.
Калибровка с помощью многокалиматорного калибратора выполняется на специальном устройстве, которое позволяет определить элементы внутреннего ориентирования камеры в лабораторных условиях. Этот метод в настоящее время редко используется, из-за необходимости иметь дорогостоящее оборудование.
Калибровка с помощью тест-объекта основана на вычислении параметров калибровки по результатам измерений координат точек снимков тест-объекта. Тест-объект представляет собой специальный объект с множеством точек с известными координатами.
Самокалибровка это метод калибровки камеры, который позволяет определять параметры калибровки в процессе фототриангуляции, выполняемой по снимкам реальной съемки.
Рассмотрим более подробно два последних метода, как наиболее употребимых.
8.2. Калибровка с помощью тест-объекта
Этот метод основан на съемке тест-объекта. На рис.8.1 показан пример в виде пространственной фигуры, на которой маркируются точки. Координаты этих точек определяются с необходимой точностью одним из геодезических методов.
Не так давно мы начали пару проектов, в которых необходима оптическая система с каналом дальности, и решили для этого использовать Kinect v2. Поскольку проекты реализуются на Python, то для начала нужно было заставить работать Kinect из Python, а затем откалибровать его, так как Kinect из коробки вносит некоторые геометрические искажения в кадры и дает сантиметровые ошибки в определении глубины.
До этого я никогда не имел дела ни с компьютерным зрением, ни с OpenCV, ни с Kinect. Исчерпывающую инструкцию, как со всем этим хозяйством работать, мне найти тоже не удалось, так что в итоге пришлось порядком повозиться. И я решил, что будет не лишним систематизировать полученный опыт в этой статье. Быть может, она окажется небесполезной для какого-нибудь страждущего, а еще нам нужна популярная статья для галочки в отчетности.
Минимальные системные требования
: Windows 8 и выше, Kinect SDK 2.0, USB 3.0.
Таблица I. Характеристики Kinect v2:
Таким образом, передо мной стояли следующие задачи:
- завести Kinect на Python;
- откалибровать RGB и ИК камеры;
- реализовать возможность совмещения кадров RGB и ИК;
- откалибровать канал глубины.
1. Kinect v2 и Python
Как я уже говорил, до этого я с компьютерным зрением дел не имел, но до меня доходили слухи, что без библиотеки OpenCV тут никуда. А поскольку в ней есть целый модуль для калибровки камер, то первым делом я собрал OpenCV с поддержкой Python 3 под Windows 8.1. Тут не обошлось без некоторой мороки, обычно сопровождающей сборку open-sourсe проектов на Windows, но все прошло без особых сюрпризов и в целом в рамках инструкции от разработчиков.С Kinect-ом же пришлось повозиться несколько подольше. Официальный SDK поддерживает интерфейсы только для C#, С++ и JavaScript. Если зайти с другой стороны, то можно увидеть, что OpenCV поддерживает ввод с 3D камер, но камера должна быть совместима с библиотекой OpenNI. OpenNI поддерживает Kinect, а вот сравнительно недавний Kinect v2 - нет. Впрочем, добрые люди написали драйвер для Kinect v2 под OpenNI. Он даже работает и позволяет полюбоваться на видео с каналов устройства в NiViewer, но при использовании с OpenCV вылетает с ошибкой. Впрочем, другие добрые люди написали Python-обертку над официальным SDK. На ней я и остановился.
2. Калибровка камер
Камеры не идеальны, искажают картинку и нуждаются в калибровке. Чтобы использовать Kinect для измерений, было бы неплохо устранить эти геометрические искажения как на RGB камере, так и на датчике глубины. Поскольку ИК камера является одновременно и приемником датчика глубины, то мы можем использовать ИК кадры для калибровки, а затем результаты калибровки использовать для устранения искажений с кадров глубины.Калибровка камеры осуществляется с целью узнать внутренние параметры камеры, а именно - матрицу камеры и коэффициенты дисторсии.
Матрицей камеры называется матрица вида:
где
(с u , c v ) - координаты принципиальной точки (точки пересечения оптической оси с плоскостью изображения, в идеальной камере находиться точно в центре изображения, в реальных немного смещена от центра);
f u , f v - фокусное расстояние f , измеренное в ширине и высоте пикселя.
Существуют два основных вида дисторсии: радиальная дисторсия и тангенциальная дисторсия.
Радиальная дисторсия - искажение изображения в результате неидеальности параболической формы линзы. Искажения, вызванные радиальной дисторсией, равны 0 в оптическом центре сенсора и возрастают к краям. Как правило, радиальная дисторсия вносит наибольший вклад в искажение изображения.
Тангенциальная дисторсия - искажения изображения, вызванные погрешностями в установки линзы параллельно плоскости изображения.
Для устранение дисторсии координаты пикселей можно пересчитать с помощью следующего уравнения :
Где (u,v
) - первоначальное расположение пикселя,
(u corrected ,v corrected
) - расположение пикселя после устранения геометрических искажений,
k 1 , k 2 , k 3
- коэффициенты радиальной дисторсии,
p 1 , p 2
- коэффициенты тангенциальной дисторсии,
r 2 =u 2 +v 2 .
Точность измерения параметров камеры (коэффициенты дисторсии, матрица камеры) определяется средней величиной ошибки перепроэцирования (ReEr, Reprojection Error ). ReEr - расстояние (в пикселях) между проекцией P" на плоскость изображения точки P на поверхности объекта, и проекцией P"" этой же точки P , построенной после устранения дисторсии с использованием параметров камеры.
Стандартная процедура калибровки камеры состоит из следующих шагов:
1) cделать 20-30 фотографий с разными положениями объекта с известной геометрией шахматной доски;
2) определить ключевые точки объекта на изображении;
Found, corners = cv2.findChessboardCorners(img, #изображение
PATTERN_SIZE,#сколько ключевых точек, в нашем случае 6x8
flags)#параметры поиска точек
3) найти такие коэффициенты дисторсии которые минимизирует ReEr .
ReEr, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(obj_points,#координаты ключевых точек в системе координат объекта
#(х", y", z"=0)
img_points,#в системе координат изображения (u,v)
(w, h),#размер изображения
None,#можно использовать уже известную матрицу камеры
None, #можно использовать уже известные коэффициенты дисторсии
criteria = criteria,#критерии окончания минимизации ReEr
flags = flags)#какие коэффициенты дисторсии мы хотим получить
В нашем случае, для RGB камеры среднее значение ReEr
составило 0.3 пикселя, а для ИК камеры - 0.15. Результаты устранения дисторсии:
Img = cv2.undistort(img, camera_matrix, dist_coefs)
3. Совмещение кадров с двух камер
Для того чтобы получить для пикселя как глубину (Z координату), так и цвет, для начала необходимо перейти из пиксельных координат на кадре глубины в трехмерные координаты ИК камеры :
Где (x 1 ,y 1 ,z 1
) - координаты точки в системе координат ИК камеры,
z 1
- результат возвращаемый датчиком глубины,
(u 1 ,v 1
) - координаты пикселя на кадре глубины,
c 1,u , c 1,v
- координаты оптического центра ИК камеры,
f 1,u , f 1,v
- проекции фокусного расстояния ИК камеры.
Затем нужно перейти из системы координат ИК камеры к системе координат RGB камеры. Для этого требуется переместить начало координат с помощью вектора переноса T и повернуть систему координат с помощью матрицы вращения R :
После чего нужно перейти из трехмерной системы координат RGB камеры к пиксельным координатам RGB кадра:
Таким образом, после всех этих преобразований, мы можем получить для пикселя (u 1 , v 1 ) кадра глубины значение цвета соответствующего пикселя RGB кадра (u 2 , v 2 ).
Как видно на результирующей картинке, изображение местами двоится. Такой же эффект можно наблюдать и при использовании класса CoordinateMapper из официального SDK. Впрочем, если на изображении нас интересует только человек, то можно воспользоваться bodyIndexFrame (поток Kinect, позволяющий узнать, какие пиксели относятся к человеку, а какие к фону) для выделения области интереса и устранения двоения.
Для определения матрицы вращения R и вектора переноса T необходимо провести совместную калибровку двух камер. Для этого нужно сделать 20-30 фотографий объекта с известной геометрий в различных положениях как RGB, так и ИК камерой, лучше при этом не держать объект в руках, чтобы исключить возможность его смещения между снятием кадров разными камерами. Затем нужно воспользоваться функцией stereoCalibrate из библиотеки OpenCV. Данная функция определяет позицию каждой из камер относительно калибровочного объекта, а затем находит такое преобразование из системы координат первой камеры в систему координат второй камеры, которое обеспечивает минимизацию ReEr.
Retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F = cv2.stereoCalibrate(pattern_points, #координаты ключевых
#точек в системе координат объекта (х", y", z"=0)
ir_img_points,#в системе координат ИК камеры (u1, v1)
rgb_img_points, #в системе координат RGB камеры (u2, v2)
irCamera["camera_matrix"],#матрица камеры ИК (брать из calibrateCamera),
irCamera["dist_coefs"], #коэф. дис. ИК камеры (брать из calibrateCamera)
rgbCamera["camera_matrix"], #матрица RGB камеры (брать из calibrateCamera)
rgbCamera["dist_coefs"], #коэф. дис. RGB камеры (брать из calibrateCamera)
image_size) #размер изображения ИК камеры (в пикселях)
И в итоге мы получили ReEr
= 0.23.
4. Калибровка канала глубины
Датчик глубины Kinect возвращает глубину (именно глубину, т.е. Z-координату, а не расстояние) в мм. Но насколько точны эти значения? Судя по публикации , ошибка может cоставлять 0.5-3 см в зависимости от дистанции, так что есть смысл провести калибровку канала глубины.Эта процедура заключается в том, чтобы найти систематическую ошибку Kinect (разницу между эталонной глубиной и глубиной, выдаваемой сенсором) в зависимости от расстояния до объекта. А для этого необходимо знать эталонную глубину. Наиболее очевидный путь - расположить плоский объект параллельно плоскости камеры и измерить расстояние до него линейкой. Постепенно сдвигая объект и делая серию измерений на каждом расстоянии, можно найти среднюю ошибку для каждой из дистанций. Но, во-первых, это не очень удобно, во-вторых, найти идеально плоский объект относительно больших размеров и обеспечить параллельность его расположения относительно плоскости камеры сложнее, чем может показаться на первый взгляд. Поэтому в качестве эталона, относительно которого будет рассчитываться ошибка, мы решили взять глубину, определяемую по известной геометрии объекта.
Зная геометрию объекта (например размеры клеток шахматной доски) и расположив его строго параллельно плоскости камеры можно определить глубину до него следующим образом:
Где f
- фокусное расстояние,
d
- расстояние между проекциями ключевых точек на матрице камеры,
D
- расстояние между ключевыми точками объекта,
Z
- расстояние от центра проекции камеры до объекта.
В случае если объект расположен не строго параллельно, а под некоторым углом к плоскости камеры, глубину можно определить на основе решения задачи Perspective-n-Point (PnP) . Решению этой проблемы посвящен ряд алгоритмов, реализованных в библиотеке OpenCV, которые позволяют найти преобразование |R, T | между системой координат калибровочного объекта и системой координат камеры, а значит, и определить глубину с точностью до параметров камеры.
Retval, R, T = cv2.solvePnP(obj_points[:, ],#крайние точки в координатах объекта
img_points[:, ], #крайние точки в координатах изображения
rgbCameraMatrix,#матрица камеры
rgbDistortion,#коэффициенты дисторсии
flags= cv2.SOLVEPNP_UPNP)#метод решения PnP
R, jacobian = cv2.Rodrigues(R)#переходим от вектора вращения к матрице вращения
for j in range(0, numberOfPoints): # цикл по ключевым точкам
point = numpy.dot(rgb_obj_points[j], R.T) + T.T # Важно! В документации нигде об этом не сказано,
#но по итогам экспериментов с модельными изображениями, выяснилось, что нужно транспонировать матрицу вращения
computedDistance[j] = point * 1000 # Z-координата в мм
Для калибровки канала глубины мы произвели серию съемок калибровочного объекта на расстояниях ~0.7-2.6 м с шагом ~7 cм. Калибровочный объект располагался в центре кадра параллельно плоскости камеры, на сколько это возможно сделать «на глазок». На каждом расстоянии делался один снимок RGB камерой и 100 снимков датчиком глубины. Данные с датчика усреднялись, а расстояние, определенное по геометрии объекта на основе RGB кадра, принималось за эталон. Средняя ошибка в определении глубины датчиком Kinect на данной дистанции определилась следующем образом:
Где z i RGB
- расстояние до i-й ключевой точки по геометрии,
z i depth
- усредненное по 100 кадрам расстояние до i-й ключевой точки по данным датчика глубины,
N - количество ключевых точек на объекте (в нашем случае 48).
Затем мы получили функцию ошибки от расстояния путем интерполяции полученных результатов.
На рисунке ниже показано распределение ошибок до и после коррекции на калибровочных кадрах. Всего было сделано 120000 измерений (25 дистанций, 100 кадров глубины на каждой, 48 ключевых точек на объекте). Ошибка до коррекции составила 17±9.95 мм (среднее ± стандартное отклонение), после - 0.45±8.16 мм.
Затем было сделано 25 тестовых кадров (RGB и глубина) калибровочного объекта в различных положениях. Всего 1200 измерений (25 кадров, 48 ключевых точек на каждом). Ошибка до коррекции составила 7.41±6.32 мм (среднее ± стандартное отклонение), после - 3.12±5.50 мм. На рисунке ниже представлено распределение ошибок до и после коррекции на тестовых кадрах.
Заключение
Таким образом, мы устранили геометрические искажения RGB камеры и датчика глубины, научились совмещать кадры и улучшили точность определения глубины. Код этого проекта можно найтиКалибровка камеры
- это задача получения внутренних и внешних параметров камеры по имеющимся фотографиям или видео, отснятым ей.
Калибровка камеры часто используется на начальном этапе решения многих задач компьютерного зрения и в особенности дополненной реальности . Кроме того, калибровка камеры помогает исправлять дисторсию на фотографиях и видео .
Параметры модели камеры
Как правило, для представления 2D-координат точки на плоскости используется вектор-столбец вида , а для задания положения 3D-точки в мировых координатах - . Нужно отметить, что эти выражения записаны в расширенной нотации однородных координат , которая является самой распространённой в робототехнике и задачах трансформации твёрдых тел. В частности, в модели камеры-обскуры матрица камеры используется для проецирования точек трёхмерного пространства на плоскость изображения:
Параметры внутренней калибровки
Матрица внутренней калибровки A содержит 5 значимых параметров. Эти параметры соответствуют фокусному расстоянию , углу наклона пикселей и принципиальной точке. В частности, и соответствуют фокусному расстоянию, измеренному в ширине и высоте пикселя, и - координатам принципиальной точки, а , где - угол наклона пикселя . Нелинейные параметры внутренней калибровки, такие как коэффициенты дисторсии , также имеют важное значение, хотя и не могут быть включены в линейную модель, описываемую матрицей внутренней калибровки. Большинство современных алгоритмов калибровки камеры определяет их вместе с параметрами линейной части модели.
Параметры внутренней калибровки относятся только к камере, но не к сцене, поэтому они изменяются только в том случае, когда меняются соответствующие настройки камеры.
Параметры внешней калибровки
(где - вектор 3 × 1 или матрица 3 × 3 поворота, - вектор 3 × 1 переноса) - параметры внешней калибровки
, определяющие преобразование координат, переводящее координаты точек сцены из мировой системы координат в систему координат, связанную с камерой . Или, что эквивалентно предыдущему определению, параметры внешней калибровки задают положение камеры в мировой системе координат.
Параметры внешней калибровки связаны непосредственно с фотографируемой сценой, поэтому (в отличие от параметров внутренней калибровки) каждой фотографии соответствует свой набор этих параметров.
Модель камеры
При использовании камеры свет из снимаемой сцены фокусируется и захватывается. Этот процесс уменьшает число измерений у данных, получаемых камерой, с трёх до двух (свет из трёхмерной сцены преобразуется в двухмерное изображение). Поэтому каждый пиксель на полученном изображении соответствует лучу света исходной сцены. Во время калибровки камеры происходит поиск соответствия между трёхмерными точками сцены и пикселями изображения.
В случае идеальной камеры-обскуры для задания такого соответствия достаточно одной матрицы проекции. Однако в случае более сложных камер искажения, вносимые линзами, могут сильно повлиять на результат. Таким образом, функция проецирования принимает более сложный вид и часто записывается как последовательность преобразований, например:
, где
Алгоритмы калибровки камеры
Существует несколько различных подходов к решению задачи калибровки.
Алгоритм калибровки одной камеры, а также алгоритм стереокалибровки реализован в библиотеке OpenCV .
Автокалибровка
Основные шаги данного метода:
- Поиск особых точек на всех изображениях. Для этой цели может использоваться, например, уголковый детектор Харриса.
- Поиск точечных соответствий между изображениями. Для этого можно, например, воспользоваться сравнением SIFT-дескрипторов найденных особых точек. В результате на каждом изображении находится набор пикселей, которые соответствуют одним и тем же трёхмерным точкам сцены.
- После этого с помощью алгоритма Bundle Adjustment на основе данных о точечных соответствиях производится одновременный поиск и параметров калибровки, и 3D-координат этих особых точек в сцене.
Задачи и методы калибровки камер
Калибровка камер состоит в определении значений элементов внутреннего ориентирования камеры и систематических ошибок оптической системы, вызванных главным образом дисторсией объектива.
Элементами внутреннего ориентирования являются фокусное расстояние (f ) и координаты главной точки (x o , y o ).
Для камер имеющих координатные метки, определяют также их координаты.
Систематические ошибки оптической системы определяют отличия реальной физической системы от ее математической модели. Дисторсия объектива влияет на геометрию центрального проектирования, и как следствие не выполняется принцип коллинеарности (нарушается центральная проекция изображения)
Различают два типа дисторсии объектива: радиальную и тангенциальную. Радиальная дисторсия намного превышает тангенсальную, поэтому, как правило, определяют только радиальную дисторсию. На практике, фотокамеры, изготовленные специально для фотограмметрических измерений имеют объективы с очень маленькой дисторсией, поэтому в процессе калибровки достаточно бывает определить только фокусное расстояние и координаты главной точки. Для современных цифровых камер, главной проблемой является низкое качество изготовления объектива, связанное с большой дисторсией (может достигать 100мкм и более) и не центрирование отдельных элементов объектива, что приводит к неперпендикулярности главного оптического луча к плоскости изображения. Поэтому при калибровке таких камер целесообразно определять не только радиальную дисторсию, но и децентрацию оптической системы (нецентрированная или тангенциальная дисторсия объектива).
Дисторсия объектива может быть описана различными уравнениями, например:
Где d x , d y – поправки в координаты точек снимка за дисторсию объектива; x,y – координаты точек снимка; k 1 ,k 2 ,k 3 – коэффициенты радиальной дисторсии; p 1 ,p 2 – коэффициенты нецентрированной дисторсии объектива; r 0 – радиус- вектор, соответствующий нулевой дисторсии; r – расстояние от главной точкиx o , y o :
Существует три метода калибровки камер:
· Калибровка с помощью многокалиматорного калибратора
· Калибровка с помощью тест объекта.
· Самокалибровка.
Калибровка с помощью многокалиматорного калибратора выполняется на специальном устройстве, которое позволяет определить элементы внутреннего ориентирования камеры в лабораторных условиях. Этот метод в настоящее время редко используется, из-за необходимости иметь дорогостоящее оборудование.
Калибровка с помощью тест-объекта основана на вычислении параметров калибровки по результатам измерений координат точек снимков тест-объекта. Тест-объект представляет собой специальный объект с множеством точек с известными координатами.
Самокалибровка это метод калибровки камеры, который позволяет определять параметры калибровки в процессе фототриангуляции, выполняемой по снимкам реальной съемки.
Рассмотрим более подробно два последних метода, как наиболее употребимых.
Калибровка камер с помощью пространственного тест-объекта
Этот метод основан на съемке тест-объекта. На рис.8.1 показан пример в виде пространственной фигуры, на которой маркируются точки. Координаты этих точек определяются с необходимой точностью одним из геодезических методов.
Рис.8.1
После съемки этого объекта исследуемой камерой решается обратная засечка, на основе расширенных уравнений коллинеарности:
(8.3)
где d x ,d y – поправки в координаты точек снимка за дисторсию объектива, вычисляемые по (8.1) или (8.2). В качестве неизвестных в уравнениях (8.3) выступают элементы внутреннего f,x o ,y o , и внешнего ориентирования X S ,Y S ,Z S , w,a,k и коэффициенты дисторсии k 1 ,k 2 ,k 3, p 1 ,p 2 . Для их определения составляют эти уравнения по измеренным координатам точек снимка x,y и координатам X,Y,Z соответствующих точек тест-объекта.Задача решается по способу наименьших квадратов, методом последовательных приближений.
Для камер, в которых происходит преобразование видеосигнала в цифровую форму, рекомендуется добавить к уравнениям (8.3) коэффициенты аффинного преобразования а 1 иа 2 , то есть:
(8.4)
Чтобы решить проблему калибровки камеры корректно и надежно на основе уравнений (8.3) и (8.4) большое значение имеет тест-объект (размеры, количество точек и точность их координат) и метод его съемки. Съемку следует выполнять таким образом, чтобы точки объекта покрывали всю площадь снимка (рис. 8.5)
|
Размеры тест-объекта зависят от типа камеры, подлежащей калибровке, т.е. зависят от оптимальных отстояний Y S съемки, для которых предназначена данная камера. Если приблизительно известно это отстояние и фокусное расстояние камеры, то можно вычислить размеры тест-объекта из рис. 8.5. В качестве теста можно использовать фасад здания, на котором маркируются с большой густатой опорные точки. Что касается распределения точек, то их следует располагать равномерно по всей площади в плоскости, параллельной плоскости снимка (так, чтобы покрыть весь снимок точками для надежного определения коэффициентов дисторсии объектива) и в перпендикулярном направлении (по глубине) для определения фокусного рассояния камеры.
На рис. 8.6 показаны примеры тест-объектов.
Если опорные точки тест-объекта будут находиться в одной плоскости, то в следствии корреляции фокусного расстояния f с отстоянием Y S при решении обратной засечки приводит к неопределенности решения. Это обстоятельство поясняет рис. 8.7.
Рис.8.8
Очевидно, что чем больше третье измерение объекта (h ), тем более надежно решение. Из экспериментальных исследований известно, что отношение h/Y S не должно быть меньше чем 1/5.
Точность координат точек тест-объекта с которой их следует определять, можно подсчитать по простой формуле:
где d x – точность с которой необходимо определить параметры калибровки. Предположим, что d x =0.001mm, фокусное расстояние камеры примерно равно f =100mm, съемка будет выполняться с расстояния Y S =30m, тогда d X = 0.1mm
Кадры