4.17. Налаштування датчика

Окрім pixformat() і framesize(), клас CSI надає набір елементів керування конкретним датчиком, до яких рано чи пізно звертається майже кожна програма: орієнтація монтажу, витримка, підсилення, баланс білого та кілька допоміжних засобів налагодження. Кожен із них безпосередньо відповідає концепції датчика, розглянутій раніше; API просто надає дескриптор Python для запису в регістр, який виконує драйвер.

Усі наведені нижче методи діють на базовий датчик. Вони надсилають записи до регістрів через шину керування I2C датчика, тому затримка становить мікросекунди, а нове налаштування набирає чинності на наступній витримці — зазвичай при наступному виклику snapshot().

4.17.1. Орієнтація

Камера не знає, в якому положенні вона змонтована. Два прапори відображення, застосовані на рівні датчика, повертають зображення в правильний бік ще до того, як будь-який піксель залишить мікросхему:

csi0.hmirror(True)
csi0.vflip(True)

hmirror() відображає зображення по горизонталі, а vflip() — по вертикалі. Разом вони охоплюють всі практичні ситуації: плата змонтована догори ногами (обидва прапори True), плата за дзеркалом із переднім посрібленням (тільки hmirror) або плата, що дивиться знизу на відображену сцену (тільки vflip).

Оскільки відображення відбувається в логіці зчитування датчика, воно не потребує процесорного часу і не збільшує використання пам’яті — кадр потрапляє до кадрового буфера вже у правильній орієнтації.

4.17.2. Витримка

Витримка — це час інтегрування: скільки мікросекунд фотодіод кожного пікселя збирає заряд до зчитування рядка. Драйвер за замовчуванням запускає цикл автоматичного керування витримкою, тому камера намагається утримувати середнє значення пікселя біля заданого рівня. Вимкнення циклу фіксує витримку на значенні, обраному програмою:

csi0.auto_exposure(False, exposure_us=8000)

Фіксована витримка — правильний вибір, коли яскравість сцени стабільна і програма потребує передбачуваного розмиття руху або стабільної міжкадрової інтенсивності для порогової обробки. Зчитування поточного значення витримки — незалежно від того, чи встановив його цикл або програма — виконується окремим викликом:

us = csi0.exposure_us()

Виклик auto_exposure() зі значенням True і без вказання витримки повертає керування циклу.

4.17.3. Підсилення

Підсилення — це коефіцієнт підсилювача, що застосовується до напруги пікселя перед її подачею на АЦП, у децибелах. Як і витримка, драйвер за замовчуванням вмикає цикл автоматичного підсилення. Часто використовуються два підходи. Обмеження верхньої межі дозволяє циклу адаптуватися до освітлення, але запобігає нескінченному підсиленню шуму в темних сценах:

csi0.auto_gain(True, gain_db_ceiling=16)

Фіксування підсилення — правильний вибір, коли програма також фіксує витримку; стабільність підсилення важлива для програм, що порівнюють значення пікселів між кадрами, наприклад для відстеження кольору:

csi0.auto_gain(False, gain_db=0)

Поточне значення підсилення зчитується через gain_db(). Щоразу, коли програма вимикає автоматичне підсилення, слід також вимикати автоматичний баланс білого та автоматичну витримку — інакше цикли керування, які залишаються активними, будуть змінювати зображення в способи, що зводять нанівець фіксоване підсилення.

4.17.4. Баланс білого

Баланс білого — це підсилення на канал, яке ISP застосовує до червоного, зеленого і синього каналів після етапу деbayvering, щоб білий об’єкт виглядав білим за будь-якого кольору освітлення. Цикл автоматичного балансу білого обчислює три коефіцієнти підсилення на основі статистики по регіонах, яку ISP збирає для кожного кадру, і застосовує їх до наступного кадру.

Більшість програм залишають цикл активним. Відстеження кольору — типовий виняток: ті самі коефіцієнти підсилення, які цикл намагатиметься підлаштувати, переслідуючи кольоровий об’єкт, і якщо програма шукає червону пляму, цикл тихо знизить підсилення червоного каналу, і пляма перестане відповідати критеріям. Фіксування циклу вирішує цю проблему:

csi0.auto_whitebal(False)

Передайте явний кортеж (r, g, b) у децибелах для відтворюваного калібрування кольору — однакові коефіцієнти підсилення на різних платах і між сеансами:

csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))

Поточні коефіцієнти підсилення зчитуються як кортеж через rgb_gain_db().

4.17.5. Обмеження частоти кадрів

За замовчуванням датчики працюють на своїй нативній частоті кадрів — від 30 до 60 кадрів на секунду на більшості моделей, значно вище на швидкісних датчиках, коли розмір кадру достатньо малий. Обмеження частоти кадрів дозволяє програмі знизити швидкість камери до темпу, який може витримати подальша обробка:

csi0.framerate(15)

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

4.17.6. Тестовий шаблон

Кольоровий тест-шаблон у вигляді смуг вбудований у більшість датчиків і корисний для розмежування проблем формування зображення від проблем виведення. Його увімкнення обходить масив фотодіодів і надсилає фіксований шаблон тим самим каналом передачі даних пікселів:

csi0.colorbar(True)

Якщо тест-шаблон виглядає правильно, а живе зображення — ні, несправність у оптиці або аналоговому фронтенді датчика; якщо навіть тест-шаблон спотворений, проблема десь на шині даних пікселів або в конфігурації pixformat() / framesize(). Передайте False, щоб повернутися до живого зображення.

Дивіться csi.CSI для повного опису API, включно зі специфічними для датчика командами ioctl(), що надають доступ до елементів керування, унікальних для окремих сімейств датчиків.