16.06.2019

Матрица внутренних параметров камеры. Калибровка камеры. Использование индивидуальных профилей


Одна из основных задач теории точечных множеств - изучение свойств различных типов точечных множеств. Мы познакомим читателя с этой теорией на двух примерах. Именно, мы изучим здесь свойства так называемых замкнутых и открытых множеств.

Множество называется замкнутым, если оно содержит все свои предельные точки. Если множество не имеет ни одной предельпой точки, то его тоже принято считать замкнутым. Кроме своих предельных точек, замкнутое множество может также содержать изолированные точки. Множество называется открытым, если каждая его точка является для него внутренней.

Приведем примеры замкнутых и открытых множеств. Всякий отрезок есть замкнутое множество, а всякий интервал - открытое множество. Несобственные полуинтервалы

замкнуты, а несобственные интервалы открыты. Вся прямая является одновременно и замкнутым и открытым множеством. Удобно считать пустое множество тоже одновременно замкнутым и открытым. Любое конечное множество точек на прямой замкнуто, так как оно не имеет предельных точек. Множество, состоящее из точек

замкнуто; это множество имеет единственную предельную точку которая принадлежит множеству.

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

1. Пересечение любого числа замкнутых множеств замкнуто.

2. Сумма любого числа открытых множеств есть открытое множество.

3. Если замкнутое множество ограничено сверху, то оно содержит свою верхнюю грань. Аналогично, если замкнутое множество ограничено снизу, то оно содержит свою нижнюю грань.

Пусть Е - произвольное множество точек на прямой. Назовем дополнением множества Е и обозначим через множество всех точек на прямой, не принадлежащих множеству Е. Ясно, что если х есть внешняя точка для Е, то она является внутренней точкой для множества и обратно.

4. Если множество F замкнуто, то его дополнение открыто и обратно.

Предложение 4 показывает, что между замкнутыми и открытыми множествами имеется весьма тесная связь: одни являются дополнениями других. В силу этого достаточно изучить одни замкнутые или одни открытые множества. Знание свойств множеств одного типа позволяет сразу выяснить свойства множеств другого типа. Например, всякое открытое множество получается путем удаления из прямой некоторого замкнутого множества.

Приступаем к изучению свойств замкнутых множеств. Введем одно определение. Пусть F - замкнутое множество. Интервал обладающий тем свойством, что ни одна из его точек не принадлежит множеству а точки а и принадлежат называется смежным интервалом множества . К числу смежных интервалов мы будем также относить несобственные интервалы или если точка а или точка принадлежит множеству а сами интервалы с F не пересекаются. Покажем, что если точка х не принадлежит замкнутому множеству то она принадлежит одному из его смежных интервалов.

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

Каждое из множеств F замкнуто. Поэтому, в силу предложения 1, множество замкнуто. Если множество пусто, то весь полуинтервал принадлежит множеству Допустим теперь, что множество не пусто. Так как это множество целиком расположено на полуинтервале то оно ограничено снизу. Обозначим через его нижнюю грань. Согласно предложению а значит . Далее, так как есть нижняя грань множества , то полуинтервал лежащий левее точки не содержит точек множества и, следовательно, не содержит точек множества Итак, мы построили полуинтервал не содержащий точек множества причем либо либо точка принадлежит множеству Аналогично строится полуинтервал не содержащий точек множества причем либо либо а Теперь ясно, что интервал содержит точку х и является смежным интервалом множества Легко видеть, что если - два смежных интервала множества то эти интервалы либо совпадают, либо не пересекаются.

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

В силу предложения 4, отсюда сразу вытекает, что всякое открытое множество на прямой представляет собой не более чем счетную сумму непересекающихся интервалов. В силу предложений 1 и 2, ясно также, что всякое множество, устроенное, как указано выше, действительно является замкнутым (открытым).

Как видно из нижеследующего примера, замкнутые множества могут иметь весьма сложное строение.

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

Из каждого из оставшихся двух отрезков удалим его среднюю треть. Этот процесс удаления средних третей у остающихся отрезков продолжим неограниченно. Множество точек на прямой, остающееся после удаления всех этих интервалов, называется канторовым совершенным множеством; мы будем обозначать его буквой Р.

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

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

Множество Р не содержит ни одного интервала. В самом деле, допустим, что некоторый интервал целиком принадлежит множеству Р. Тогда он целиком принадлежит одному из отрезков, получающихся на шаге построения множества Р. Но это невозможно, так как при длины этих отрезков стремятся к пулю.

Можно показать, что множество Р имеет мощность континуума. В частности, отсюда следует, что канторово совершенное множество содержит, кроме концов смежных интервалов, еще и другие точки. Действительно, концы смежных интервалов образуют лишь счетное множество.

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

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

Математическая дисциплина, занимающаяся изучением строения точечных множеств, называется дескриптивной теорией множеств. Весьма большие заслуги в деле развития дескриптивной теории множеств принадлежат советским математикам - Н. Н. Лузину и его ученикам П. С. Александрову, М. Я. Суслину, А. Н. Колмогорову, М. А. Лаврентьеву, П. С. Новикову, Л. В. Келдыш, А. А. Ляпунову и др.

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

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

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, которая стала настольной книгой любого путешественника с камерой в руках.

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


Большинство современных цифровых камер отличаются корректной цветопередачей. Ушли в прошлое времена, когда цветные фотографии выглядели так, как будто их снимали через цветные фильтры. Более того, если снять цветовую мишень с установками в камере 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 . Оказалось, что вручную добиться хорошего (с некоторой небольшой ошибкой) попадания «в цвет» по координатам не просто. Но еще хуже то, что и после калибровки остальные поля (те, по которым калибровка не производилась) мишени не приводятся к своим числовым значениям. Стоит ли тратить на такую калибровку время? Есть задачи, при решении которых точное попадание в определенные цвета может быть актуально. Для таких калибровка подходит. Но просто «улучшать» цветопередачу с помощью «Калибровки», скорее всего, не очень хорошая идея.

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