Bollywood HungamaEXCLUSIVE: Samarth Jurel to make special appearance in Emraan Hashmi-starrer Gunmaaster G9The Jerusalem PostHackers hit Ukraine, Russia's emergency apps, send fake nuclear, chemical attack alertsPunchAccord asks court to dismiss suit seeking candidates’ disqualificationInquirerOver 9,000 passengers monitored in S. Tagalog ports on Nov. 2 – PCGDaily MaverickEl Niño threatens SA’s crops, but ample maize stocks cushion the blowInquirer EntertainmentAshtine Olviga, David Licauco say they are not competing with other love teamsTechCrunch42AI comes out of stealth with $62.5M and a world model that can ‘predict human behavior’The Hollywood ReporterTokyo: Industry Insiders Skeptical of Bold Japanese Government Plans for Overseas Content Sales PushZDF heuteEntdecken Sie das ZDF-Nachrichtenstudio20 MinutenEndlich gibts gestochen scharfe Bilder des GespensterfischsVanguardHow I met my wife 22 years ago – Actor Odunlade Adekolaعالم التقنيةسامسونج تبدأ إنتاج شاشة الخصوصية لهاتف Galaxy S27 Pro تمهيدًا للإطلاق مطلع 2027
The Daily Newsstand · Free, Always
Monday, November 2, 2026

Что видит фазовый автофокус

Translate

Выводим на экран то, что видит фазовый автофокус камеры Raspberry Pi Camera Module 3 на плате Luckfox Pico Ultra W, и по шагам разбираем, откуда берутся эти данные.

Это продолжение статьи про драйвер IMX708 для RV1106: там мы заставили сенсор работать на плате и вывели его embedded-данные в отдельное устройство. Здесь смотрим, что в этих данных лежит.

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

Мы делаем встраиваемую электронику и камеры, поэтому решили не гадать, а заглянуть внутрь. Фазовый автофокус сенсора IMX708 на плате Luckfox Pico Ultra W можно вывести на экран в виде цветной карты, и по ней видно, что именно камера «понимает» про сцену. Мы пройдём путь от двух половинок объектива до команды мотору линзы, а в конце поставим перед камерой лист с полосами и выясним, чего она не умеет видеть. Спойлер: горизонтальные жалюзи для неё всё равно что гладкая стена.

Автофокус смартфона или камеры мы привыкли считать чёрным ящиком: навёл, подождал, кадр резкий. Но у фазового автофокуса (PDAF, phase detection autofocus) внутри есть вполне наглядная картина. Это сетка чисел, по которой камера понимает, в какую сторону и насколько двигать линзу. Мы вывели эту сетку на экран.

Зачем на неё смотреть? Когда автофокус промахивается, по сетке сразу видно почему: например, он смотрит на гладкую стену, где ему не за что зацепиться, или в его поле зрения попали предметы на разных расстояниях. А ещё по ней удобно объяснять, как фазовый автофокус устроен. Этим и займёмся: от оптики до команды мотору линзы.

Стенд

  • Плата Luckfox Pico Ultra W на процессоре Rockchip RV1106.

  • Камера Raspberry Pi Camera Module 3 на сенсоре Sony IMX708, в который встроен фазовый автофокус.

  • Мотор фокуса: катушка, которая двигает линзу, с драйвером DW9807. Положение линзы задаётся числом от 0 до 64 — дальше это «код мотора»: 0 — фокус на бесконечность, 64 — на самое близкое расстояние.

  • Прошивка rkipc: штатное приложение Rockchip для IP-камеры с нашими патчами. Фазовый автофокус в ней — порт алгоритма автофокуса из libcamera Raspberry Pi.

  • Для демонстрации мы временно добавили в прошивку отвод данных автофокуса и выбор окна по клику, о них ниже.

  • На ноутбуке работает наш просмотрщик: он рисует данные автофокуса рядом с видео с камеры.

Что сенсор отдаёт кроме картинки

Вместе с каждым кадром изображения сенсор присылает несколько служебных строк (embedded data, EBD; в нашем режиме их четыре). Они приходят по тому же интерфейсу MIPI CSI-2, что и картинка, но с отдельным типом данных (0x12), и драйвер на плате выводит их в отдельное устройство /dev/video1 (как это сделано, раздел «Что пришлось добавить от себя: второй канал под данные автофокуса»). В одной из этих строк лежат результаты фазового измерения.

Кадр поделён на сетку 12×16 — 12 строк по 16 зон, всего 192 прямоугольные зоны. Для каждой зоны сенсор присылает два числа:

  • фазу: насколько и в какую сторону расфокусирован этот участок кадра;

  • уверенность: насколько этой фазе можно верить.

Для демонстрации в прошивку добавили отвод: служебные строки каждого кадра rkipc дополнительно пишет в именованный канал (FIFO) на плате. Просмотрщик на ноутбуке читает этот канал с платы по SSH и рисует сетку.

Дальше разберём, что значат эти два числа и как сенсор их получает.

Две половины объектива

Начнём с оптики. Посмотрим на камеру сверху и мысленно разделим объектив на левую и правую половины. Какую из них считать левой — условность, важно лишь, что их две. Свет от каждой точки предмета проходит через обе половины. На схемах свет из левой половины нарисован синим, из правой — красным.

Если предмет в фокусе, лучи от одной его точки сходятся ровно в одну точку на сенсоре, и неважно, через какую половину объектива они прошли. Камера всегда наведена на какое-то расстояние, и всё, что на нём, получается резким. Плоскость на этом расстоянии назовём плоскостью фокуса. Двигая линзу, мотор переносит эту плоскость ближе или дальше — так камера и фокусируется. Если предмет дальше плоскости фокуса, его лучи сходятся перед сенсором и к сенсору снова расходятся. Если ближе, лучи не успевают сойтись до сенсора. В обоих случаях свет из левой и правой половин падает на сенсор в разные места, только порядок разный: в одном случае синее пятно оказывается по одну сторону от красного, в другом — по другую. Чем сильнее расфокус, тем дальше пятна друг от друга.

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

Вид сверху. Меняется расстояние между линзой и сенсором — то же самое делает мотор, когда двигает линзу. Справа сенсор крупно: пока лучи не сошлись на нём, синее и красное пятна разнесены, в фокусе они совпадают, а за фокусом меняются местами. Все схемы и анимации в статье — учебная модель с тонкой линзой. Данные с платы — только запись и снимки в разделах «Клик по карте» и «Опыт с полосами».

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

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

Пиксели, которые видят половину объектива

Сенсор не видит пятна по отдельности: обычный пиксель собирает свет со всего объектива сразу. Чтобы разделить две половины, используют специальные пиксели.

Пиксель состоит из фотодиода — светочувствительной части — и крошечной линзы над ним, микролинзы. Свет из левой половины объектива приходит к пикселю наискосок слева, и микролинза отводит его на правую часть фотодиода. Свет из правой половины приходит справа и попадает на левую часть. Поэтому если закрыть левую часть фотодиода непрозрачной маской, пиксель будет видеть только левую половину объектива. Такие пиксели называют PDAF-пикселями. Назовём его левым: он видит левую половину объектива. У правого PDAF-пикселя маска справа, и он видит только правую половину. На схемах левые PDAF-пиксели и их сигнал нарисованы синим, правые — красным, по цвету своей половины объектива. С обычными пикселями под синим и красным фильтрами цветной мозаики их не путайте: о мозаике речь пойдёт ниже.

Сигналы всех левых PDAF-пикселей вместе дают одно изображение сцены, а сигналы всех правых — второе. Это одна и та же сцена, только снятая через разные половины объектива. В фокусе изображения совпадают, при расфокусе сдвинуты друг относительно друга ровно на фазу. Левые и правые PDAF-пиксели стоят в разных местах строки, поэтому соседние столбики попарно не сравнивают. Сравнивают изображения целиком: каждый набор пикселей даёт свою выборку пятна, и в фокусе обе выборки ложатся на одно место. Как ищут сдвиг между ними, разберём ниже.

Строка пикселей сенсора, вид сверху, по вертикали увеличено в 3 раза. Расстановка как на схеме ниже: PDAF-пиксели на зелёных местах, между ними обычные. Анимация идёт по кругу: предмет дальше плоскости фокуса, в фокусе, ближе. Ширина пятна в модели постоянная; в реальной оптике при расфокусе пятна ещё и расплываются.

Как такие пиксели расставлены на IMX708, неизвестно: документация Sony закрыта. Поэтому покажем основные подходы.

Пиксели с масками. Левые PDAF-пиксели с маской слева и правые с маской справа стоят среди обычных. Оба пикселя пары должны видеть один и тот же цвет, а в обычной байеровской мозаике соседние пиксели разного цвета. Поэтому в такой мозаике PDAF-пиксели размещают на местах одного цвета, например на зелёных, через один. Если сделать их вовсе без цветного фильтра, их можно ставить и вплотную. Часто они идут отдельными строками, левые и правые по очереди, — тогда одна такая строка сразу даёт оба изображения. Сигналы хранятся раздельно: левые идут в одно изображение, правые — в другое. Сравнивают не отдельные пиксели, а все PDAF-пиксели строки сразу. Точная раскладка у каждого сенсора своя. В готовой фотографии наполовину закрытый пиксель дал бы неверную яркость, поэтому его значение обычно восстанавливают по соседям.

Цветные клетки — обычные пиксели с красным, зелёным и синим фильтрами, как в байеровской мозаике. В трёх строках все зелёные места заняты PDAF-пикселями, по очереди с маской слева и справа: чёрное — маска, зелёное с точкой — открытая часть. Пунктир — кусок одной зоны. Плотность PDAF-пикселей увеличена для наглядности. Схема нарисована по образцу из работы Śliwiński и Wachel, 2013.

Расстановки у разных производителей разные. В патенте Sony описаны варианты, где PDAF-пиксели стоят парами плотно вдоль одной линии, несколькими линиями или вразброс, а пары вообще не обязательны (US 10212332 B2). У Śliwiński и Wachel PDAF-пикселем сделан каждый второй зелёный. В сенсорах Samsung с мелкими пикселями такой пиксель закрыт наполовину и стоит под прозрачным фильтром вместо цветного (Fontaine, IISW 2019). Различается и плотность: чем больше PDAF-пикселей, тем больше данных для фазы, но тем больше пикселей приходится восстанавливать в готовой фотографии. Общий принцип при этом один: пиксели с маской слева дают одно изображение, с маской справа — другое.

Dual Pixel. Здесь маски нет: каждый пиксель разделён на два фотодиода, левый и правый, под одной микролинзой. Каждый фотодиод видит свою половину объектива, причём из-за микролинзы противоположную: правый фотодиод получает свет из левой половины и работает как левый PDAF-пиксель, а левый — наоборот. Цвет на схеме — та же условность, что и раньше: синим отмечен фотодиод, который видит левую половину объектива, красным — тот, что видит правую. Для автофокуса фотодиоды читают раздельно. Получается та же пара, только внутри одного пикселя, и фазу можно мерить в любом месте кадра. Для самой фотографии два сигнала складывают, и пиксель работает как обычный.

Каждый пиксель разделён на два фотодиода под общей микролинзой: синий видит левую половину объектива, красный — правую.

Есть и промежуточный вариант: одна общая микролинза над двумя соседними пикселями одного цвета (2×1 OCL). Принцип тот же, что у Dual Pixel, только «половинки» — это два целых пикселя.

Про IMX708 точно известно одно: в нашем режиме фазу считает сам сенсор и отдаёт уже готовую сетку, а сырых сигналов PDAF-пикселей мы не видим. Поэтому дальше мы показываем, как такой расчёт обычно устроен, на той же учебной модели.

Как из двух изображений получается число

Возьмём одну строку сенсора. Левые PDAF-пиксели вдоль неё дают профиль яркости — кривую, как меняется яркость слева направо. Правые PDAF-пиксели дают второй профиль той же сцены. При расфокусе это одна и та же кривая, сдвинутая на фазу. На анимации ниже профили — это верхний график.

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

Важно: все пробные сдвиги — это расчёт по одному кадру, его делает сам сенсор, а линза при этом стоит на месте. Перебирают числа в памяти, а не положения линзы. Поэтому фазовому автофокусу не нужно ездить туда-обратно, как контрастному: одно измерение сразу говорит, в какую сторону и примерно насколько двигать линзу.

Вверху профили яркости двух изображений; пунктиры отмечают один и тот же перепад яркости на обоих профилях. Внизу кривая различия: по горизонтали пробный сдвиг в пикселях, по вертикали — насколько профили расходятся при таком сдвиге; зелёная точка — минимум, то есть найденная фаза. Каждый кадр анимации — отдельное измерение при новом положении линзы: линза движется только для того, чтобы показать кривую при разном расфокусе, от +5.5 px через ноль к отрицательным значениям. Такой график называют SAD-вектором, см., например, рис. 10–12 в патенте Qualcomm US 10387477 B2: там же сказано, что в фокусе минимум почти ноль, а при расфокусе кривая у минимума расширяется. Это учебная модель: у реального сенсора кривая неровнее, в расфокусе её минимум не доходит до нуля, а на повторяющемся узоре минимумов бывает несколько. Саму кривую IMX708 наружу не отдаёт — только найденный сдвиг и уверенность.

Фаза измеряется в пикселях, потому что сдвиг считается вдоль сенсора. Результат не обязан быть целым: минимум можно уточнить интерполяцией между пробными сдвигами, и сенсор передаёт фазу с шагом 1/16 пикселя — целым числом со знаком, которое делят на 16. Даташита на IMX708 у нас нет, этот формат известен по разбору тех же данных в libcamera.

Но в каких именно пикселях, сенсор не уточняет. Проще всего считать, что это обычные пиксели матрицы, но это не обязательно так. Сравнивает сенсор только PDAF-пиксели, а они стоят в строке не подряд, а с промежутками — допустим, каждый восьмой. Сдвинуть сигнал на один шаг для сенсора значит перейти к соседнему PDAF-пикселю, то есть сразу на 8 пикселей матрицы. Если фаза считается в таких шагах, то «+5» на деле означает сдвиг на 40 пикселей матрицы. Документации, где это было бы сказано, у нас нет. Автофокусу это не мешает: как переводить фазу в движение линзы, всё равно находят опытом, и этот опыт учитывает единицу, какой бы она ни была. Разница важна, только если хочется по фазе понять, насколько размыто изображение.

Та же кривая различия объясняет второе число, уверенность. Если минимум глубокий и острый, сдвиг определён надёжно. Если кривая пологая, минимум может оказаться где угодно, и верить ему нельзя. Как именно IMX708 считает уверенность, неизвестно, но ведёт она себя так, как подсказывает эта картинка: на сцене с текстурой высокая, на гладкой стене или с закрытым объективом равна нулю.

Зона — это много строк

Одна строка — мало: шум сенсора делает её кривую рваной, и минимум прыгает. Но в зоне много строк PDAF-пикселей. Можно, например, для каждой строки построить свою кривую различия, кривые усреднить и искать минимум уже у средней.

Вверху сигналы левых и правых PDAF-пикселей зоны, по восемь строк. Внизу тонкие линии — кривые отдельных строк, толстая — их среднее. Чёрный треугольник отмечает истинный сдвиг. Линза движется, поэтому сдвиг меняется.

В кадре, где истинный сдвиг +5.47 px, минимумы отдельных строк разбросаны от 4.00 до 6.25 px. Минимум средней кривой — +5.48 px. Каждая строка по отдельности может ошибиться больше чем на пиксель, а восемь вместе дают почти точный ответ.

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

Кривая плоская. Зелёная точка — случайный минимум шума, к истинному сдвигу (треугольник) он отношения не имеет.

Как устроены половины у IMX708, мы не знали. Если они разделены не слева направо, а сверху вниз, то слепыми будут уже вертикальные полосы. А если сенсор сравнивает в обе стороны, слепых полос нет вовсе. Это легко проверить: показать камере сначала горизонтальные полосы, потом вертикальные. Мы так и сделали; что получилось, покажем в конце статьи, когда разберёмся с картой и окном автофокуса.

Карта 12×16

Теперь соберём всё вместе. Каждая из 192 зон даёт фазу и уверенность, и просмотрщик на ноутбуке раскрашивает их в одну картинку — карту фазы.

На карте у синего и красного свой смысл: здесь они показывают уже не половины объектива, а знак фазы.

  • Цвет показывает знак и величину фазы. Синий — фаза отрицательная, предмет ближе плоскости фокуса. Красный — положительная, предмет дальше. Белый — в фокусе.

  • Яркость показывает уверенность. На сцене с текстурой уверенность лежит в диапазоне от 0 до 266, в среднем около 40. Чем она ниже, тем сильнее цвет смешан с серым. Поэтому тусклая зона около нуля почти серая: сверяйтесь с легендой.

  • Тёмно-серая зона значит, что уверенность ниже порога 16. Какое-то число фазы сенсор присылает и здесь, но верить ему нельзя, и просмотрщик его не показывает. По этому же порогу автофокус отбрасывает зоны; подробнее в следующем разделе. Это не «в фокусе», а «надёжного измерения нет».

Шкала ±8 px задаёт только насыщенность цвета и ничего не говорит о пределе сенсора. На нашей плате фаза измерена примерно от −38 до +42 px: всё, что больше 8 по модулю, просто закрашено полным цветом. Насколько можно верить значениям в десятки пикселей, мы не проверяли: при сильном расфокусе оба изображения размыты, и минимум кривой различия становится пологим.

Карта в учебной модели. Зелёная рамка — окно автофокуса, здесь 3×3 зоны, как при выборе кликом; об окне подробнее в следующих разделах. Окно переезжает на предмет в центре, на ближний предмет и на дальний фон, и линза каждый раз наводится на выбранное. Тёмно-серый верх — гладкая стена, данных нет. Фон тусклее предмета в центре: у него в модели ниже уверенность, поэтому в фокусе он становится не белым, а серым. Движение линзы здесь сглажено для наглядности: на плате она двигается шагами.

На карте видно главное: у предметов на разных расстояниях фазы разные. Когда камера сфокусирована на предмет в центре, он белый, ближний предмет синий, а дальний фон красный. Стоит навести фокус на ближний предмет, и белым становится он, а центр и фон краснеют: теперь они оба дальше плоскости фокуса.

От карты к команде для линзы

Автофокус не использует всю карту сразу. Он берёт окно — несколько соседних зон, на которые надо навести фокус (зелёная рамка). Стандартное окно — 32 зоны в центре кадра, 8 по ширине и 4 по высоте: центральная половина кадра по ширине и средняя треть по высоте. Зоны с уверенностью ниже порога он отбрасывает, остальные усредняет: чем выше уверенность зоны, тем больше её вес. По этой средней фазе автофокус и двигает линзу.

Дальше фазу надо перевести в код мотора. Чтобы узнать, сколько кодов приходится на пиксель фазы, линзу прогнали по всему ходу, от 0 до 64, перед сценой с текстурой (книга в 55 см) и на каждом коде записали резкость кадра и фазу. Ноль фазы пришёлся на пик резкости с точностью до шага, с которым прогоняли линзу, хотя никаких поправок к фазе мы не вносили: сенсор отдаёт её уже готовой. Проверено это на одном модуле. По наклону фазы на линейном участке около пика вышло 1.05–1.18 кода на пиксель. Дальше от пика фаза перестаёт расти, поэтому брали только линейный участок.

Одного расстояния для такого замера достаточно. На линейном участке фаза пропорциональна тому, на сколько надо сдвинуть линзу, а катушка сдвигает линзу примерно пропорционально току. Ток задаётся кодом линейно, примерно от 8 до 96 мА: шкалу 0–64 вводит драйвер ядра из SDK Rockchip, сама микросхема DW9807 принимает 10-битное значение. Линейна эта шкала именно по току, а не по расстоянию до плоскости фокуса. Поэтому для предмета на другом расстоянии кодов на пиксель выходит примерно столько же: от расстояния зависит только, на каком коде окажется фокус.

Прошивка использует один коэффициент: шаг мотора равен фазе, умноженной на −1.2. Это чуть больше измеренного, но в непрерывном режиме шаг ещё уменьшается при низкой уверенности (об этом ниже), и действующий коэффициент выходит меньше. Минус нужен потому, что положительная фаза означает «предмет дальше плоскости фокуса», а чтобы навести фокус дальше, код надо уменьшить. Коэффициент подобран под нашу оптику, на другом модуле его нужно мерить заново.

Чтобы линза не дёргалась, у шага есть ограничения:

  • за один кадр линза сдвигается не больше чем на 8 кодов, то есть на восьмую часть хода;

  • в непрерывном режиме, когда автофокус всё время следит за сценой, а не наводится один раз по команде, шаг дополнительно уменьшается при низкой уверенности окна;

  • там же шаг меньше 3 кодов дополнительно гасят: около фокуса фаза шумит на доли пикселя, и без этого линза качалась бы вслед за шумом.

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

Если надёжной фазы нет 6 кадров подряд, прошивка, как и оригинал из libcamera, переключается на запасной контрастный автофокус: прогоняет линзу по ходу и ищет пик резкости по статистике, которую считает ISP — блок обработки изображения в процессоре. В непрерывном режиме так бывает, только пока фокус ещё ни разу не найден: уже наведённая камера не начинает поиск из-за короткого пропадания фазы. Контрастный поиск медленнее, а на совсем гладкой поверхности не помогает и он: резкости там тоже не за что зацепиться.

Клик по карте

Чтобы показать это на живой камере, мы добавили в просмотрщик на ноутбуке выбор окна. Клик мышью по карте делает зону под курсором центром окна размером 3×3 зоны. Новое окно уходит с ноутбука на плату через второй FIFO строкой «x y w h» — положение и размер окна в долях кадра. rkipc принимает её, ставит новое окно и запускает новый цикл фокусировки.

Запись с реальной платы. Слева карта фазы, справа видео с камеры, зелёная рамка на карте и на видео — окно автофокуса. В углу карты: фаза в окне (AF window phase), средняя фаза по всему кадру (whole frame phase), число зон с уверенностью выше порога в окне и во всём кадре (strong zones) и счётчик служебных строк (EBD frame counter). Реальная карта пестрее учебной: тёмные клетки — однотонные участки, где данных нет.

В кадре три предмета на разных расстояниях: слева брошюра компании, справа калибровочная карта цветов для настройки оттенков камеры, сзади осциллограф. Окно по очереди переезжает между ними. После каждого клика линза доезжает до нового предмета, и фаза в окне приходит к нулю: дальше она колеблется около него, на кадрах записи обычно в пределах ±1 px. Карта при этом перекрашивается: зоны в окне светлеют, а остальные меняют цвет в зависимости от того, ближе они или дальше нового фокуса. На кадрах видно и то, почему окно нужно: когда фаза в окне +0.47 px, средняя по всему кадру +2.43 px. Будь окном весь кадр, фокус встал бы между предметами.

Опыт с полосами

Вернёмся к вопросу из раздела про зоны: какие полосы IMX708 не видит. Ставим перед камерой лист с полосами. Сначала полосы лежат горизонтально, потом стоят вертикально. Окно автофокуса обычное — 32 зоны в центре.

Снимки с платы. Слева карта фазы, справа видео с камеры. Зелёная рамка — окно автофокуса.

Горизонтальные полосы. Внутри окна карта тёмная: ни в одной зоне сенсор не смог измерить фазу. Фазовому автофокусу не на что опереться. Цветные клетки есть только по краям листа и у угла коробки внизу. Там яркость меняется слева направо: белая бумага переходит в серую стену. Края листа синие, то есть лист ближе плоскости фокуса и резким не стал.

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

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

Какие именно PDAF-пиксели стоят в сенсоре, опыт не говорит. И пиксели с масками, и Dual Pixel, и 2×1 OCL можно устроить так, чтобы они делили объектив на левую и правую половины, и на полосах все они поведут себя одинаково. Опыт исключает только варианты, которые сравнивают ещё и сверху вниз.

Что остаётся неизвестным

Сенсор отдаёт наружу только готовый результат: фазу и уверенность для каждой зоны. Как он к ним пришёл, по этим данным не видно. Поэтому несколько вещей мы так и не знаем.

  • Какие именно PDAF-пиксели стоят в IMX708 — с масками, Dual Pixel или 2×1 OCL: опыт с полосами показал только, что объектив делится на левую и правую половины.

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

  • В каких пикселях измеряется фаза — в обычных пикселях матрицы или в шагах между PDAF-пикселями.

  • До какого расфокуса фазе можно верить: значения в десятки пикселей мы не проверяли.

Что получилось

Фазовый автофокус сравнивает два изображения сцены, снятые через разные половины объектива. Сдвиг между ними — фаза: ноль означает фокус, знак показывает направление, величина — насколько надо сдвинуть линзу. Сенсор считает фазу отдельно для каждой из 192 зон и к каждой прикладывает уверенность. Карта показывает всё это сразу: что резкое, что ближе, что дальше и где данных нет вовсе.

Автофокус берёт из карты только окно. Поэтому многие его промахи объясняются тем, что в окно попало: гладкая поверхность или горизонтальные полосы без данных, повторяющийся узор, на котором у кривой различия может быть несколько минимумов, или предметы на разных расстояниях. Пустые зоны и предметы на разных расстояниях видны на карте сразу, без догадок.

Схемы и анимации в статье — учебная модель: они показывают принцип, а не точные данные IMX708. Остальное в статье взято из трёх источников:

  • измерено на нашей камере: знак фазы, диапазоны фазы и уверенности, нулевая уверенность на гладкой стене, совпадение нуля фазы с пиком резкости, 1.05–1.18 кода мотора на пиксель фазы, запись с кликами и опыт с полосами;

  • известно по разбору данных IMX708 в libcamera: сетка 12×16 и шаг фазы 1/16 пикселя;

  • настройки прошивки: окно автофокуса, порог уверенности 16, коэффициент −1.2, ограничения шага и переход на контрастный поиск.

Если вы знаете, как устроены PDAF-пиксели в IMX708 или как сенсор считает уверенность, расскажите в комментариях. Это как раз те пробелы, которые нам закрыть не удалось.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.