Автофокус камеры Raspberry Pi: полное руководство (V1, V2, HQ)
Здесь собрано всё, что нужно знать об автофокусе камер Raspberry Pi.
Материал относится ко всем моделям Raspberry Pi и ко всем модулям камер Raspberry Pi: V1.3, V2.1, HQ и V3.
Ответ на вопрос об автофокусе — здесь: по данным Arducam, у компании самый полный набор решений для автофокуса камер Pi.
Разберёмся в этом вопросе раз и навсегда.
Условия для автофокуса
Вот определение автофокуса из Википедии:
Оптическая система автофокуса (AF) с помощью сенсора, системы управления и мотора фокусируется на точке или области, выбранной автоматически или вручную.
Отсюда сразу понятно всё, что нужно. Для автофокуса необходимы три условия:
- Сенсор
- Мотор фокусировки
- Система управления

Фокусировать — значит двигать объектив. Фокусировать автоматически — значит двигать объектив автоматически.
Мотор фокусировки отвечает на вопрос, «чем» двигать объектив, а система управления — «как» его двигать. При ручной фокусировке роль мотора играют наши руки, а роль системы управления — мозг.
Поэтому автофокус не означает, что фокусировки нет. Просто эту работу вместо ваших рук и мозга берут на себя мотор фокусировки и система управления.
Выполняются ли эти условия в камерах Raspberry Pi?
Выполняют ли официальные камеры Raspberry Pi все условия автофокуса?
Пока автофокус есть только у серии Camera Module 3.
Пройдёмся по списку условий ещё раз и посмотрим, как им соответствуют официальные камеры Raspberry Pi.
- Сенсор — да: в них стоят КМОП-сенсоры.
- Мотор фокусировки — в V1.3 объектив вклеен и неподвижен, в V2 и HQ фокус настраивается вручную. Все камеры V3 оснащены объективами с автофокусом, так что у них — да.
- Система управления — только у серии V3.

Первые три официальные камеры Raspberry Pi не рассчитаны на автофокус: они закрывают только базовые потребности.
Логика базовых потребностей такая: чёткий снимок можно получить и ручной фокусировкой. Моторы фокусировки и система управления усложняют конструкцию и повышают стоимость, а нужны они не всем. Значит, выполнять все условия автофокуса не обязательно.
Значит ли это, что официальные камеры Pi не умеют автофокус?
Да. Первые три официальных модуля камер Raspberry Pi (V1/V2/HQ) сами по себе автофокус не поддерживают — и точка.
Значит ли это, что надежды на автофокус для камер Pi нет?
Вовсе нет. В Arducam эту проблему решили.
Как Arducam выполняет условия автофокуса для камер Raspberry Pi
Логика решения простая:
Если у камеры Pi нет мотора фокусировки и системы управления, нужно сделать её вариант, у которого они есть.
Разберём два невыполненных условия по очереди.
1. Мотор фокусировки для камеры Pi
Начнём с мотора фокусировки.
Будем считать мотор фокусировки частью блока объектива.
В камерах Raspberry Pi встречаются два вида блоков объектива:
- В V1 и V2 блок объектива и сенсор объединены в один герметичный корпус, который подключается к печатной плате камеры разъёмом «плата — плата» (BTB). Такую конструкцию называют компактным модулем камеры (CCM); именно такие стоят в смартфонах.
- У камеры HQ отдельное крепление объектива. Сенсор IMX477 камеры HQ не объединён с блоком объектива в один корпус, а установлен на печатной плате камеры.


Отсюда два способа сделать камеру Pi с автофокусом:
- Собрать CCM с мотором фокусировки внутри и подключить его к печатной плате камеры Raspberry Pi.
- Сделать специальный блок объектива с мотором фокусировки и установить его над сенсором на плате.


2. Система управления (чтобы Pi могла управлять мотором фокусировки)
Теперь система управления: Raspberry Pi должна уметь управлять мотором фокусировки.
Прежде чем налаживать связь, посмотрим, как Raspberry Pi соединяется с мотором фокусировки:
- Raspberry Pi →
- → разъём MIPI CSI на Raspberry Pi →
- → шлейф камеры →
- → разъём MIPI CSI модуля камеры →
- → плата камеры →
- → мотор фокусировки.
Видно, что ключевое физическое соединение — шлейф камеры MIPI CSI. Есть ли в соединении MIPI CSI что-то, что поможет управлять мотором?
Шина I2C. А точнее, I2C процессора VideoCore.
i2c_vc
Значение «on» включает интерфейс I2C, который обычно зарезервирован за процессором VideoCore (по умолчанию — «off»).

Значит, мотором можно управлять через i2c_vc. Для этого добавьте в файл /boot/config.txt строку:
dtparam=i2c_vc=on
Условия выполнены. Что ещё нужно?
Как включить автофокус, когда всё готово
Осталось автоматизировать фокусировку программой.
Шаг 1: программное управление моторизованной фокусировкой
Сначала заставим моторы двигаться.
Простая программа на Python позволяет двигать мотор фокусировки клавишами клавиатуры.
Если интересно, как это сделано, — ниже код на Python для программного управления моторизованной фокусировкой.
Код на Python для программного управления фокусировкой
import os
import time
import sys
import threading
import pygame,sys
from pygame.locals import *
from time import ctime, sleep
pygame.init()
screen=pygame.display.set_mode((320,240),0,32)
pygame.key.set_repeat(100)
def runFocus(func):
temp_val = 512
while True:
for event in pygame.event.get():
if event.type ==KEYDOWN:
print temp_val
if event.key == K_UP:
print 'UP'
if temp_val < 1000:
temp_val += 10
else:
temp_val = temp_val
value = (temp_val<<4) & 0x3ff0
dat1 = (value>>8)&0x3f
dat2 = value & 0xf0
os.system("i2cset -y 0 0x0c %d %d" % (dat1,dat2))
elif event.key==K_DOWN:
print 'DOWN'
if temp_val <12 :
temp_val = temp_val
else:
temp_val -= 10
value = (temp_val<<4) & 0x3ff0
dat1 = (value>>8)&0x3f
dat2 = value & 0xf0
os.system("i2cset -y 0 0x0c %d %d" % (dat1,dat2))
def runCamera():
cmd = "sudo raspistill -t 0"
os.system(cmd)
if __name__ == "__main__":
t1 = threading.Thread(target=runFocus,args=("t1",))
t1.setDaemon(True)
t1.start()
runCamera()
Теперь у нас есть модуль камеры с программно управляемым мотором фокусировки. Это уже большой шаг вперёд: не нужно вручную крутить объектив у самой камеры — фокус можно настраивать дистанционно, программой.
Настройка фокуса камеры Pi клавишами со стрелками
Но для автофокуса Raspberry Pi должна сама решать, сфокусирована ли камера, и останавливать мотор фокусировки. Как Pi это определит?
Шаг 2: автофокус на OpenCV
OpenCV — крупнейшая открытая библиотека компьютерного зрения. С её помощью Pi может определить, сфокусирована ли камера, — по контрасту.
sudo apt-get install python-opencv
При точной фокусировке разница яркости соседних пикселей сенсора закономерно растёт. Поэтому Pi двигает мотор, пока не найдёт максимальный контраст.
Arducam предлагает пример автофокуса на Python с OpenCV. Вот как выглядит изображение в Raspbian во время его работы.
Автофокус камеры Raspberry Pi в Raspbian
Если интересно, как это сделано, — ниже код автофокуса на Python.
Autofocus.py
import cv2 #sudo apt-get install python-opencv
import numpy as py
import os
import time
import smbus
bus = smbus.SMBus(0)
try:
import picamera
from picamera.array import PiRGBArray
except:
sys.exit(0)
def focusing(val):
value = (val << 4) & 0x3ff0
data1 = (value >> 8) & 0x3f
data2 = value & 0xf0
# time.sleep(0.5)
print("focus value: {}".format(val))
# bus.write_byte_data(0x0c,data1,data2)
os.system("i2cset -y 0 0x0c %d %d" % (data1,data2))
def sobel(img):
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
img_sobel = cv2.Sobel(img_gray,cv2.CV_16U,1,1)
return cv2.mean(img_sobel)[0]
def laplacian(img):
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
img_sobel = cv2.Laplacian(img_gray,cv2.CV_16U)
return cv2.mean(img_sobel)[0]
def calculation(camera):
rawCapture = PiRGBArray(camera)
camera.capture(rawCapture,format="bgr", use_video_port=True)
image = rawCapture.array
rawCapture.truncate(0)
return laplacian(image)
if __name__ == "__main__":
#open camera
camera = picamera.PiCamera()
#camera.awb_gains=4
#camera.exposure_mode='off'
#camera.awb_mode='fluorescent'
#open camera preview
camera.start_preview()
#set camera resolution to 640x480(Small resolution for faster speeds.)
camera.resolution = (640, 480)
time.sleep(0.1)
print("Start focusing")
max_index = 10
max_value = 0.0
last_value = 0.0
dec_count = 0
focal_distance = 10
while True:
#Adjust focus
focusing(focal_distance)
#Take image and calculate image clarity
val = calculation(camera)
#Find the maximum image clarity
if val > max_value:
max_index = focal_distance
max_value = val
#If the image clarity starts to decrease
if val < last_value:
dec_count += 1
else:
dec_count = 0
#Image clarity is reduced by six consecutive frames
if dec_count > 6:
break
last_value = val
#Increase the focal distance
focal_distance += 15
if focal_distance > 1000:
break
#Adjust focus to the best
focusing(max_index)
time.sleep(1)
#set camera resolution to 2592x1944
camera.resolution = (1920,1080)
#save image to file.
camera.capture("test.jpg")
print("max index = %d,max value = %lf" % (max_index,max_value))
#while True:
# time.sleep(1)
camera.stop_preview()
camera.close()
Следующий шаг: автофокус в поворотных камерах PTZ (pan-tilt-zoom) для Raspberry Pi
Раз I2C камеры можно использовать как управляющий сигнал для перемещения объектива, можно пойти дальше.
Если фокусировать — значит двигать объектив, то зумировать — значит двигать элементы внутри объектива.
Если управлять не только объективом, но и элементами внутри него, получится вариообъектив с автофокусом. Добавив сервоприводы поворота и наклона, в Arducam собрали поворотную камеру PTZ для Raspberry Pi с возможностью автофокуса.
Pivariety: собственные алгоритмы настройки ISP от Raspberry Pi в камерах с автофокусом
Проект Pivariety переносит аппаратную настройку ISP и алгоритмы управления камерой Raspberry Pi на большее число модулей камер. Благодаря лучшей поддержке (автоэкспозиция AE, автобаланс белого AWB и автофокус AF) камеры Arducam с автофокусом, по данным Arducam, не только быстрее фокусируются, но и дают изображение и видео лучшего качества, чем штатные модули камер.
Советы и рекомендации
Это всё о том, как в Arducam реализовали автофокус для камер Raspberry Pi. Несколько советов:
- Автофокус работает, но не ждите от него такой же плавности и точности, как у камеры смартфона. Главная цель Arducam — показать, что это возможно, и дать вам больше возможностей. Это программная фокусировка на OpenCV, и с продвинутым фазовым (PD) или лазерным автофокусом она несравнима.
- Пример автофокуса есть, но Arducam всё же рекомендует программное ручное управление фокусом. Для него есть другой пример, в котором фокусировать камеру удобнее — клавишами со стрелками. Так точнее наводить фокус на интересующую область (ROI).
- Примеры проверены только в Raspberry Pi OS (Raspbian), работа в других ОС не проверялась. При этом moof и jneilliii выпустили плагин для OctoPrint под названием ArduCamFocus, который позволяет управлять мотором фокусировки.
Ниже — модули камер Arducam V1, V2 и HQ с поддержкой автофокуса.
Камеры V1 на 5 Мп и HQ на 12 Мп — законченные модули камер: их шлейф подключается прямо в слот CSI на Raspberry Pi. Версия V2 на 8 Мп — CCM для прямой замены: снимите штатный CCM с печатной платы камеры V2 и установите вместо него этот.
Стандартный модуль камеры с автофокусом для Raspberry Pi

- Модуль камеры Arducam OV5647 5 Мп 1080p с автофокусом для Raspberry Pi, совместим с Pi 5/4/3B+/3
Держу парочку про запас. В ней есть автофокус, работает отлично. Успешно проверена на Raspberry Pi Zero W и 3B+ с Raspbian и MotionPi OS. Чёткость отличная: для автофокуса стоит микромотор, который работает совершенно бесшумно. Реакция быстрая. — Paul
Отличная камера за свои деньги. В целом камера отличная и хорошо подошла для моего несложного проекта на Python. Настраивается легко: достаточно подключить шлейф камеры к Raspberry Pi. Камера быстро и без проблем работает с библиотекой picamera, разрешение снимков отличное даже при слабом освещении. Автофокус работает, как заявлено. — JMDK
Лучше официальной камеры Raspberry Pi V2. Эта камера нравится мне гораздо больше официальной Raspberry Pi V2. Баланс белого настраивается автоматически (у официальной V2 во многих условиях розоватый оттенок). Фокусом можно управлять, но для этого нужна программа (простой код, работающий по I2C). Это удобнее механической регулировки V2, которая не всегда возможна, если камера в корпусе. И наконец, по цене она гораздо разумнее. — Sergey Yarygin
Жаль, что не нашёл её раньше. В распознавании объектов, как я понял, важна чёткость объекта на снимке, и автофокус здесь очень помогает. Очень рекомендую эту камеру, если вы учитесь программировать для ИИ. — Rich Barth

- Модуль камеры Arducam IMX219 с автофокусом — прямая замена камеры Raspberry Pi V2 и камеры для NVIDIA Jetson
Качественная вещь. Простая установка, всё заработало без доработок. Самый резкий фокус из всех моих камер для Raspberry Pi на сегодня. — RMG
Хорошая камера с автофокусом для моего скворечника. Я сделал камеру для наблюдения за птицами на Raspberry Pi. Стандартная камера была неплоха, но из-за фиксированного фокуса большинство птиц получались не в фокусе. Я купил эту камеру с автофокусом и, немного попрограммировав, смог улучшить снимки. Не все птицы в фокусе (они двигаются слишком быстро), но в целом снимки стали гораздо лучше. Настройка оборудования и программ потребовала немного усилий, но ничего сложного, если вы уже работали с Raspberry Pi. — Jeweler24
Прямая замена работает лучше оригинала. Поставил вместо вышедшей из строя камеры 5 Мп. Работает как часы, изображение очень хорошее; ночного видения нет, но оно мне и не нужно; устанавливается легко. Мой CR-10 S4 с OctoPi очень доволен. — покупатель

- Камера Arducam 477P HQ 12 Мп с автофокусом для Raspberry Pi
Модули камер Pivariety с автофокусом для Raspberry Pi


- Цветной модуль камеры Arducam Pivariety IMX230 21 Мп для RPi 5, 4B, 3B+, 3A+, CM3/CM4 и плат Jetson
- Цветной модуль камеры Arducam Pivariety IMX298 16 Мп для RPi 4B, 3B+, 3A+, CM3/CM4 и Jetson Nano/Xavier NX (снят с производства)
Поворотные модули камер PTZ (pan-tilt-zoom) для Pi



- Поворотная камера PTZ Arducam 13 Мп для Raspberry Pi 4/3B+/3 с переключаемым ИК-фильтром (снята с производства)
- Поворотная камера PTZ Arducam 8 Мп для Raspberry Pi 4/3B+/3 и NVIDIA® Jetson AGX Orin/Orin Nano/Orin NX
- Поворотная камера PTZ Arducam 5 Мп 1080p для Raspberry Pi 5/4/3B+/3
Arducam 16MP-AF и 64MP-AF


На этом обзор закончен.
Итог: первые официальные модули камер Raspberry Pi автофокус не поддерживают, но в Arducam сделали автофокус возможным: в доработанных модулях Arducam мотором фокусировки управляют по I2C.

