16.06.2019

Калибровка камеры. Анализ методов калибровки стереоскопических камер. Параметры внешней калибровки


Не так давно мы начали пару проектов, в которых необходима оптическая система с каналом дальности, и решили для этого использовать Kinect v2. Поскольку проекты реализуются на Python, то для начала нужно было заставить работать Kinect из Python, а затем откалибровать его, так как Kinect из коробки вносит некоторые геометрические искажения в кадры и дает сантиметровые ошибки в определении глубины.

До этого я никогда не имел дела ни с компьютерным зрением, ни с OpenCV, ни с Kinect. Исчерпывающую инструкцию, как со всем этим хозяйством работать, мне найти тоже не удалось, так что в итоге пришлось порядком повозиться. И я решил, что будет не лишним систематизировать полученный опыт в этой статье. Быть может, она окажется небесполезной для какого-нибудь страждущего, а еще нам нужна популярная статья для галочки в отчетности.


Минимальные системные требования : Windows 8 и выше, Kinect SDK 2.0, USB 3.0.

Таблица I. Характеристики Kinect v2:


Таким образом, передо мной стояли следующие задачи:

  1. завести Kinect на Python;
  2. откалибровать RGB и ИК камеры;
  3. реализовать возможность совмещения кадров RGB и ИК;
  4. откалибровать канал глубины.
А теперь подробно остановимся на каждом пункте.

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 камеры и датчика глубины, научились совмещать кадры и улучшили точность определения глубины. Код этого проекта можно найти

Теория предельного дохода гласит: если понемногу претворять в жизнь небольшие изменения в каждом аспекте вашей деятельности, то результирующее улучшение будет весьма впечатляющим. Эту теорию легко применить и к фотографическому рабочему процессу.

Travel-фотографу, коим я и являюсь, приходится делать огромное количество фотографий с совершенно разными сюжетами. Из недавней двухдневной поездки в Бельгию я привез около двух тысяч фото. И если вы любите вдумчиво просматривать и сортировать карточки на компьютере за чашечкой кофе, то даже нескольких дней вам может не хватить на то, чтобы обработать весь фотосет. В таком случае оптимальный вариант – добиться максимального сходства камерного JPEG с реальной картинкой, а на постобработку тратить минимум времени.

Один из способов такой экономии времени на обработке за компьютером – калибровка вашего фотоаппарата. Вы наверняка слышали о том, что в цифровой фотографии принято калибровать мониторы для того, чтобы добиться точной цветопередачи. Более того, некоторые скрупулезные личности калибруют даже принтеры - те, кому важно стопроцентное совпадение изображения на экране и на бумаге. Однако, далеко не все задумываются о такой вещи, как калибровка камеры.

Принцип калибровки, вне зависимости от устройства, одинаков. Вы создаете специальный профиль для своего устройства, и специальное программное обеспечение, предназначенное для управления цветом, вносит соответствующие поправки в изображение на выходе. Ведь что такое калибровка, скажем, монитора? Вы просто измеряете то, насколько цветопередача вашего экземпляра отклоняется от эталона, и вносите нужные поправки. Топовые модели могут быть довольно близки к профессиональным стандартам, в то время как цветопередача монитора для массового сегмента может быть весьма далека от идеала. Итоговый профиль исправляет отклонения по цвету, добиваясь корректной цветопередачи.

Разные модели камер видят цвет по-разному, поэтому, чтобы передать картинку так, как запомнил ее ваш глаз и мозг, при постобработке необходимо совершить набор определенных действий. Предварительная калибровка же дает вам весомое преимущество – вам нужно будет совершить эти телодвижения всего один раз для всех снимков. Таким образом, время, затрачиваемое на обработку, значительно сокращается.

Калибровка камеры, в общем, работает так: вы измеряете любые отклонения во «взгляде» камеры на окружающий мир, после чего создаете профиль, который устраняет эти отклонения на этапе создания камерного JPEG из RAW-файла.

Несколько лет назад я понял на собственном опыте, что калибровка важна. Тогда я обрабатывал фото заката в Ирландии, снятого на Nikon D2x. Цвета в JPEG по умолчанию получились блеклыми и с явным наличием желтого оттенка, в то время как я отлично помнил яркие пурпурные краски этого заката. Вдруг, по какому-то наитию, я решил использовать калибровочное фото с эталонной цветопередачей, которое я по привычке делал перед каждой съемкой, но никогда до этого не использовал. Я создал с его помощью профиль, применил его ко всей съемке и с удивлением увидел, как каждое фото заиграло новыми, гораздо более реалистичными красками и оттенками.

Применение профиля не всегда заметно меняет цветопередачу, но, как мы уже упомянули выше, теория предельного дохода учит - незаметные улучшения имеют свойство накапливаться. Создание цветовых профилей под вашу камеру - довольно несложное дело. Я использую Xrite ColorChecker Passport и специальный плагин, который позволяет создавать профили прямо из файлов в Adobe Lightroom. Никто не запрещает использовать отдельное, обычно идущее в комплекте с камерой, ПО, чтобы создавать подогнанные под определённый экземпляр камеры профили для Adobe Camera Raw. Компания Adobe хранит эти профили в файлах с DNG расширением, но у вас нет нужды конвертировать гигабайты ваших RAW-архивов в DNG (аббревиатура для Adobe Digital Negative) для применения этих профилей.


Классический вариант эталонной мишени для калибровки состоит из 24 цветов .

Создание профиля камеры

Для начала просто сфотографируйте эталонную мишень в том освещении, при котором будет вестись съемка. Если у вас несколько камер – сделайте снимок каждой, желательно одним и тем же объективом. Я, как правило, использую для этого зум со средним диапазоном фокусных расстояний (вроде 24-70) - чаще всего я снимаю именно им. С учетом того, что я снимаю не в JPEG, а строго в RAW, нет разницы в том, какое выставлять цветовое пространство – AdobeRGB или sRGB. Лично я всегда использую AdobeRGB при обработке – таким образом обеспечивается более широкий цветовой охват. Запомните – для калибровочного фото и для всей последующей съемки важно использовать одно и то же цветовое пространство.

В Lightroom выберите предварительно импортированный калибровочный снимок. В меню File выберите команду Export и далее загрузите пресет ColorChecker Passport, который был установлен автоматически вместе с ПО для корректной работы калибратора. Вам нужно только решить, как назвать новый профиль - автоматика сделает остальное.

После перезапуска Lightroom, получившийся профиль может быть применен к снимку в выпадающем списке Profile панели Camera Calibration. Однако стоит помнить, что вам будут доступны только профили той камеры, которой вы сделали обрабатываемый RAW-файл. Продвинутые пользователи могут сохранить данный профиль как часть профиля Developer Preset и применить его сразу к нескольким фото при импорте.

Есть один нюанс. Теоретически, калибровать камеру, то бишь делать калибровочный снимок, нужно при каждой смене объектива, изменении источника освещения или даже смене значения ISO.

На практике же, за исключением очень специфичных условий работы с дотошно выставленным освещением и т.п., эти постоянные калибровки не нужны и сильно замедляют ваш рабочий процесс. «Фишка» здесь в том, чтобы найти нужный баланс между необходимостью подготовки и применения огромного количества разнообразных профилей и тем фактом, что ваш единственный профиль может не «лечь» корректно на все ваши кадры. Но, как и в большинстве других случаев, когда сравниваются калиброванный и некалиброванный прибор, даже одна единственная калибровка камеры очень сильно помогает в процессе работы фотографа.

Использование индивидуальных профилей

Мне, как travel-фотографу, удобно под каждое место съемки иметь специально заточенный профиль. Если я снимаю в индийском Ладакхе, что близ Гималай, я использую калибровочные снимки оттуда. Если в этой же поездке я отправляюсь в совершенно другой район, например, пышно цветущий Керал в Южной Индии, я повторяю всё заново.

Программа из комплекта ColorChecker Passport позволяет объединить два калибровочных изображения в одно, создавая при этом так называемый двойной профиль Dual-Illuminant DNG Profile. Таким образом можно обеспечить более точную цветопередачу в случае, если вы снимаете при постоянно меняющемся освещении, отличающемся от того, при котором сделан первый калибровочный кадр. Для создания такого двойного профиля необходимо сделать два калибровочных фото в кардинально разных условиях освещения. Затем из этих двух снимков создается двойной профиль, который обладает более точной цветопередачей, чем первоначальный вариант с одиночным снимком.

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

Если вы не пользуетесь Lightroom, можно использовать отдельное ПО для калибратора ColorChecker Passport, чтобы с его помощью создавать DNG профили. Эти DNG профили читаются множеством программ для RAW-процессинга, в том числе Adobe Camera Raw и Capture One. К сожалению, на данный момент Apple Aperture не поддерживает такие профили.

Об авторе. Стив Дэйви – фотограф и писатель из Лондона. Большую часть времени путешествует по самым экзотическим и живописным уголкам этой планеты. Недавно выпустил второе издание книги Footprint Travel Photography, которая стала настольной книгой любого путешественника с камерой в руках.

Если Вам понравился этот материал, то мы будем рады, если Вы поделитесь им со своими друзьями в социальной сети:


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

Параметры модели камеры

Как правило, для представления 2D-координат точки на плоскости используется вектор-столбец вида , а для задания положения 3D-точки в мировых координатах - . Нужно отметить, что эти выражения записаны в расширенной нотации однородных координат , которая является самой распространённой в робототехнике и задачах трансформации твёрдых тел. В частности, в модели камеры-обскуры матрица камеры используется для проецирования точек трёхмерного пространства на плоскость изображения:

Параметры внутренней калибровки

Матрица внутренней калибровки A содержит 5 значимых параметров. Эти параметры соответствуют фокусному расстоянию , углу наклона пикселей и принципиальной точке. В частности, и соответствуют фокусному расстоянию, измеренному в ширине и высоте пикселя, и - координатам принципиальной точки, а , где - угол наклона пикселя . Нелинейные параметры внутренней калибровки, такие как коэффициенты дисторсии , также имеют важное значение, хотя и не могут быть включены в линейную модель, описываемую матрицей внутренней калибровки. Большинство современных алгоритмов калибровки камеры определяет их вместе с параметрами линейной части модели.
Параметры внутренней калибровки относятся только к камере, но не к сцене, поэтому они изменяются только в том случае, когда меняются соответствующие настройки камеры.

Параметры внешней калибровки

(где - вектор 3 × 1 или матрица 3 × 3 поворота, - вектор 3 × 1 переноса) - параметры внешней калибровки , определяющие преобразование координат, переводящее координаты точек сцены из мировой системы координат в систему координат, связанную с камерой . Или, что эквивалентно предыдущему определению, параметры внешней калибровки задают положение камеры в мировой системе координат.
Параметры внешней калибровки связаны непосредственно с фотографируемой сценой, поэтому (в отличие от параметров внутренней калибровки) каждой фотографии соответствует свой набор этих параметров.

Модель камеры

При использовании камеры свет из снимаемой сцены фокусируется и захватывается. Этот процесс уменьшает число измерений у данных, получаемых камерой, с трёх до двух (свет из трёхмерной сцены преобразуется в двухмерное изображение). Поэтому каждый пиксель на полученном изображении соответствует лучу света исходной сцены. Во время калибровки камеры происходит поиск соответствия между трёхмерными точками сцены и пикселями изображения.
В случае идеальной камеры-обскуры для задания такого соответствия достаточно одной матрицы проекции. Однако в случае более сложных камер искажения, вносимые линзами, могут сильно повлиять на результат. Таким образом, функция проецирования принимает более сложный вид и часто записывается как последовательность преобразований, например:
, где

Алгоритмы калибровки камеры

Существует несколько различных подходов к решению задачи калибровки.

Алгоритм калибровки одной камеры, а также алгоритм стереокалибровки реализован в библиотеке OpenCV .

Автокалибровка

Основные шаги данного метода:

  1. Поиск особых точек на всех изображениях. Для этой цели может использоваться, например, уголковый детектор Харриса.
  2. Поиск точечных соответствий между изображениями. Для этого можно, например, воспользоваться сравнением SIFT-дескрипторов найденных особых точек. В результате на каждом изображении находится набор пикселей, которые соответствуют одним и тем же трёхмерным точкам сцены.
  3. После этого с помощью алгоритма Bundle Adjustment на основе данных о точечных соответствиях производится одновременный поиск и параметров калибровки, и 3D-координат этих особых точек в сцене.

Большинство современных цифровых камер отличаются корректной цветопередачей. Ушли в прошлое времена, когда цветные фотографии выглядели так, как будто их снимали через цветные фильтры. Более того, если снять цветовую мишень с установками в камере JPEG -sRGB или JPEG -AdobeRGB , то попадание в цвет при лабораторном контроле будет довольно точным.

Многие студийные камеры и ПО для них позволяют использовать технологию управление цветом. Для конкретного источника освещения управление цветом с помощью профиля можно без особого труда реализовать, как постпроцесс для любой камеры (допускающей ручные установки экспозиции, баланса белого и контраста). Для этого надо лишь построить профиль камеры так, как это описано в статье «Профили для цифровых камер. Пакет XLProfiler»). А затем «присвоить» профиль файлу-снимку в графическом редакторе.

Одно из основных препятствий для внедрения управления цветом в съемочную технику - непостоянство источника освещения. Если требуется точное попадание в цвет, то калибровать камеру нужно, фактически, под каждую конкретную съемку (под каждый конкретный источник света). С другой стороны, при оперативной съемке точное попадание в цвет редко является важным критерием качества. Заложенные в камеру или ПО алгоритмы коррекции баланса белого и «пересчета» фильтров на матрице в RGB-цвета файлов JPEG/TIFF/RAW, как отмечалось выше, работают вполне корректно. Калибровка камеры в Adobe Camera RAW

В модуле есть подменю «Калибровка камеры» :

Подменю называется «Калибровка» и вообще не предназначено для выполнения задач управления цветом. В этом подменю всего семь «движков»: для коррекции цветового оттенка теней и трех основных цветов в координатах «оттенок-насыщенность». Фактически, это дополнительная возможность цветокоррекции изображений, получаемых с помощью конкретной камеры, для которой профиль «заложен» в Camera RAW или содержится в файле TIFF/JPEG/DNG (Camera RAW теперь открывает и эти файлы, а в поле «Имя - Профиль камеры» можно выбрать внедренный в них профиль, RAW-файлы пока не поддерживают профили). Целью такой цветокоррекции может быть как более точная цветопередача, так и намеренное искажения цветов, к примеру, для имитации съемки в ИК-диапазоне.

В общих чертах процесс выглядит так:
съемка мишени в определенных условиях освещения в RAW,
обработка RAW-файла в Camera RAW в подменю «Основной» для коррекции экспозиции, контраста, баланса белого и оттенка/насыщенности,
калибровка в окне «Калибровка камеры» по цветовым координатам мишени,
сохранение построенного калибровочного набора параметров, как «пользовательского набора» или «набора по умолчанию».

Методика, предложенная Брюсом Фрезером , предполагает калибровку по трем полям R, G, B мишени Macbeth Color Checker. Ручная калибровка

Опишем процесс калибровки, предложенный Брюсом Фрезером .

Прежде чем приступить к калибровке, нужно снять в RAW мишень Macbeth Color Checker. Затем приготовить цифровую идеализированную мишень, преобразовав ее исходник в пространстве LAB (ссылка на файл приведена выше) в то цветовое пространство, в котором вы привыкли работать (поддерживаемые Camera RAW пространства Adobe RGB или ProPhoto , к примеру). Для ручной калибровки удобно нанести на цветовые поля мишени их цифровые значения и распечатать такую мишень или вывести в независимом окне на дисплей, если он достаточно большой.

Когда подготовительные операции выполнены, открываем в Camera RAW снимок мишени и начинаем калибровку:

Первый этап

Открыв мишень в Camera RAW , устанавливаем «пипетки цветов» на серые поля и настраиваем параметры изображения в подменю «Основной» . Сначала, по второму серому полю устанавливаем «баланс белого», затем по первому «экспозицию», по третьему и четвертому - «яркость», по второму, пятому и шестому полю «контраст» и «точку черного». Возможно, потребуется два-три этапа регулировок всех параметров для того, чтобы координаты снимка с точностью до ошибки (неоднородность полей на снимке в пределах трех единиц R, G, B можно считать такой ошибкой) совпали с координатами не цветных полей на идеализированной мишени.

После настройки «контраста/яркости» по шести нецветным полям переходим к настройке координат «синего», «зеленого» и «красного» полей. Рекомендуется с помощью регулятора «насыщенности» добиться максимально близкого идеальному значения цвета для «зеленого» поля.

Второй этап

Следующий этап - собственно калибровка:

Калибровка начинается с настройки «Тени», если у «черного» поля имеется цветной оттенок (напомним, баланс белого настраивался пипеткой баланса белого по «второму серому» полю и «черное» поле может иметь посторонний оттенок). Далее переходим к настройке цветового тона и насыщенности для «синего», «зеленого» и «красного» полей.

После нескольких десятков минут калибровки и нескольких исписанных заметками листов бумаги, удается приблизиться к идеалу, но не очень близко - ошибка по отдельной компоненте цвета достигает 10-15 единиц (при начальной ошибке до 20-30 единиц) при калибровке конкретной камеры Canon PowerShot G2 .

Полезно изначально пользоваться рекомендациями Брюса Фрезера . Начинать с «зеленого» поля, «привыкнуть» к тому, что движок «цветовой тон» почти не влияет на тот цвет, которым именуется, и сильно «раздвигает» два других цвета (к примеру, увеличение красного «цветового тона» почти не меняет красную компоненту цвета, но увеличивает зеленую и почти всегда уменьшает синюю ), а движок «насыщенность» синхронно меняет содержание в «смеси цветов» двух компонент, кроме той, которой сам именуется (к примеру, при увеличении насыщенности красного синхронно уменьшаются обе компоненты зеленого и синего ).

Третий этап

Столкнувшись с невозможностью настроить вручную цвета лучше, чем с точностью в десяток единиц, я отказался от использования инструмента «Калибровка». Но в новой версии Camera RAW , кроме калибровки есть еще подменю выборочной коррекции цветов «HSL» . Если к настройке привлечь его возможности, то удается попасть в цвет не только для трех, но для большего числа полей мишени:

Отметим, что подменю Camera RAW «HSL» и «Разбиение тона » вообще более эффективный инструмент калибровки, чем сама «Калибровка».

Использование калибровки

Когда нужная точность калибровки достигнута, остается сохранить «калибровку» и применять ее, если это потребуется или вообще сохранить ее как настройку «по умолчанию» для конкретной камеры и конкретного осветителя:

Полуавтоматический процесс калибровки с помощью AcrCalibrator

Ручная калибровка трудоемкий рутинный процесс. Для его автоматизации можно воспользоваться модулем для Photoshop AcrCalibrator , созданным Томом Форсом (Thomas Fors) . С его можно загрузить сам модуль и инструкцию по применению. Когда готовилась статья, корректно работала с ACR версиями до 4.1. Тем, кто будет пробовать модуль, загрузив с сайта Adobe пробный Photoshop и последний ACR к нему, следует скачать так же ACR 4.1 и установить его на место более свежих конверторов RAW файлов.

Работать с AcrCalibrato r не сложно. Его (файл AcrCalibrator.jsx) нужно загрузить в папку PhotoshopCS3/Presets/Scripts и перегрузить Photoshop . Снимок мишени открывается в Camera RAW в режиме 8 бит/цвет, ProPhoto RGB, наименьшего разрешения (для ускорения обработки). Баланс белого устанавливается по второму слева «серому» полю. Файл открывается в Adobe Photoshop . Инструментом «перо» на мишени нужно нарисовать прямоугольник, выставив его углы в центры полей мишени: «темная кожа» - «белый» - «черный» - «зелено-голубой» (угловые поля нужно выбрать именно в такой последовательности). Затем запустить скрипт и подождать. В моем случае скрипт выдал на экран данные калибровки примерно через полтора часа.


На иллюстрации приведено окно отчета AcrCalibrator, идеализированная мишень и окно Adobe Camera RAW с введенными установками, полученными с помощью AcrCalibrator. Если сравнить цветовые координаты «синего», «зеленого» и «красного» полей идеальной мишени и мишени, полученной с установками AcrCalibrator, станет ясно, что и автомат не может уменьшить ошибку цветопередачи до менее чем десяти единиц.



Чтобы убедиться в том, что при работе AcrCalibrator не произошло ошибки, можно запустить его повторно. Повторный обсчет, как видно по фрагментам, приведенным выше, дает результат с точностью до ошибки идентичный первому измерению.


Для сравнения приведем данные о настройках, полученных при ручном режиме калибровки:


Чтобы сравнить эффективность различных вариантов калибровки приведем фрагменты мишени, полученные разными способами. Настройки «Основной» - одинаковые для всех способов и соответствуют тем, которые были найдены при калибровке в ручном режиме, так как именно они обеспечивают наиболее близкие идеальным координаты «серых» полей. Отличаются настройки в окнах подменю «Калибровка» и «HSL» (установки «HSL» отличаются от «по умолчанию» только в случае «ручной калибровки» по методу Брюса Фрезера ).

Левая верхняя четверть - идеализированная мишень. Правая верхняя - результат обработки снимка в Camera RAW с установками «по умолчанию» для камеры Canon PowerShot G2. Левая нижняя четверть - обработка в Camera RAW с ручными установками «калибровки» и «HSL» для трех основных цветов R, G, B, насыщенных желтого и пурпурного. Правая нижняя четверть - обработка в Camera RAW с установками калибровки, полученными с помощью AcrCalibrator.


Как только появился Photoshop CS с Camera RAW и вышла книга Брюса Фрезера , я испытал методику для камеры Canon PowerShot G2 . Оказалось, что вручную добиться хорошего (с некоторой небольшой ошибкой) попадания «в цвет» по координатам не просто. Но еще хуже то, что и после калибровки остальные поля (те, по которым калибровка не производилась) мишени не приводятся к своим числовым значениям. Стоит ли тратить на такую калибровку время? Есть задачи, при решении которых точное попадание в определенные цвета может быть актуально. Для таких калибровка подходит. Но просто «улучшать» цветопередачу с помощью «Калибровки», скорее всего, не очень хорошая идея.

Заметим сразу, что поскольку фокусное расстояние и масштабные коэффициенты и входят в матрицу только в комбинациях и , то раздельно оценить все три этих параметра невозможно. Введем новые параметры и , которые и будут подлежать оцениванию.

Пусть камера регистрирует сцену, содержащую опорных точек, и трехмерные координаты точек известны в глобальной системе координат. Задача состоит в том, чтобы по трехмерным координатам опорных точек и координатам их проекций в плоскости изображений камеры , оценить элементы матрицы .

Если положение камеры относительно этой системы известно (т.е. известны матрица и вектор в выражении (6.3)), можно сразу пересчитать координаты опорных точек в стандартную систему камеры и для оценивания внутренних параметров воспользоваться соотношениями (6.1), подставив вместо и и соответственно. Перепишем (6.1) в виде

, .

Для опорных точек получим две системы, состоящие из линейных уравнений каждая, относительно неизвестных , и , :

где , , , , , .

Очевидно, достаточно двух опорных точек, чтобы получить оценки внутренних параметров камеры:

, ,

, .

Обратим внимание на необходимость выполнения условий и , которые формально выражают требование, чтобы в плоскости изображения камеры проекции опорных точек не лежали на прямых, параллельных осям координат.

Для увеличения точности оценок внутренних параметров следует использовать большее количество опорных точек. Системы (6.13) в этом случае становятся переопределенными, и для их решения можно применить МНК. Минимизируя норму вектора невязки получим оценки внутренних параметров

, .

Рассмотрим теперь задачу калибровки в более общей постановке. Пусть неизвестны не только матрица , но и положение камеры относительно глобальной системы координат (т.е. матрица и вектор в выражении (6.3)). Такая постановка обусловлена тем, что технически довольно сложно выполнить точные измерения положения камеры и особенно ее ориентации относительно произвольной системы координат. Используя (6.2) и (6.3) и вводя вектор , связь между глобальными координатами опорной точки и координатами ее изображения можно представить в виде

. (6.14)

Матрица имеет размер и называется калибровочной. Обозначим

, ,

, , (6.15)

, .

Отметим два важных свойства этой матрицы, которые легко получить из (6.15), учитывая (6.4) и (6.5):

. (6.16)

Оказывается, что если элементы калибровочной матрицы известны, через них можно вычислить матрицы , и вектор . Действительно, учитывая (6.4), легко показать, что

Кроме того, непосредственно из (6.14) следует, что

,

, (6.18)

,

.

Задача калибровки, следовательно, сводится к предварительному оцениванию элементов матрицы .

Рассмотрим сначала линейный метод оценивания матрицы . Запишем матричное уравнение (6.14) как систему трех обычных уравнений

или, подставляя в два первых уравнения значение из третьего,

Зная координаты опорных точек в трехмерном пространстве и координаты их проекций в плоскости изображения камеры, получим однородную систему из линейных уравнений относительно 12 неизвестных элементов калибровочной матрицы :

. (6.19)

Представим эту систему в матрично-векторном виде:

, .

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

Первый – когда ранг матрицы на единицу меньше размера вектора . Тогда существует только одно (с точностью до произвольного скалярного множителя) решение. Именно этот случай и представляет практический интерес. Для реализации этого условия необходимо (но недостаточно), чтобы количество уравнений в (6.20) было не менее 11, следовательно, количество опорных точек должно быть не менее шести. Ограничить множество решений можно, воспользовавшись первым из условий (6.16). Действительно, определив некоторое решение , в качестве оценки компонент калибровочной матрицы выберем такое, чтобы Такая нормировка определяет калибровочную матрицу с точностью до знака. Выбрать правильный знак матрицы можно, например, зная, с какой стороны от плоскости глобальной системы координат находится камера, и учитывая первое из соотношений (6.18). Знак должен совпадать со знаком компоненты вектора трансляции.

Второй случай реализуется, если ранг меньше размера вектора на два и более. Здесь может существовать множество различных решений системы, среди которых осуществить правильный выбор без привлечения дополнительных данных невозможно. Показано , что такая ситуация возникает, в частности, если все опорные точки лежат в одной плоскости. Чтобы избежать этой ситуации, в качестве тестового объекта часто используют объект, приведенный на рис. 6.5.

Рис.6.5. Калибровочный объект

Рассмотрим теперь непосредственно метод решения системы (6.20). Обычно, чтобы уменьшить влияние ошибок измерений трехмерных координат опорных точек и координат их изображений в камере, используют больше, чем шесть опорных точек. Тогда система (6.20) становится переопределенной. Кроме того, как и в разделе 6.2, из-за ошибок в измерениях координат реально система (6.20) принимает вид

При условии

Другой подход к оцениванию матрицы основан на минимизации расстояний между измеренными проекциями опорных точек и вычисленными в соответствии с (6.14). Определим величину

которая представляет сумму квадратов этих расстояний, и минимизируем ее по с учетом ограничений (6.16). Решить эту задачу можно посредством методов условной минимизации , изложение которых выходит за рамки данного учебника. Следует отметить только, что такой подход обычно дает результаты оценивания, более устойчивые к ошибкам измерений, чем рассмотренный выше линейный.