К содержимому
  1. Главная
  2. Блог
  3. Автофокус камеры Raspberry Pi: полное руководство (V1, V2, HQ)

Автофокус камеры Raspberry Pi: полное руководство (V1, V2, HQ)

23 ноября 2020 · По материалам Arducam

Здесь собрано всё, что нужно знать об автофокусе камер Raspberry Pi.

Материал относится ко всем моделям Raspberry Pi и ко всем модулям камер Raspberry Pi: V1.3, V2.1, HQ и V3.

Ответ на вопрос об автофокусе — здесь: по данным Arducam, у компании самый полный набор решений для автофокуса камер Pi.

Разберёмся в этом вопросе раз и навсегда.

Условия для автофокуса

Вот определение автофокуса из Википедии:

Оптическая система автофокуса (AF) с помощью сенсора, системы управления и мотора фокусируется на точке или области, выбранной автоматически или вручную.

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

  1. Сенсор
  2. Мотор фокусировки
  3. Система управления
Три условия автофокуса камеры Raspberry Pi
Сенсор, мотор фокусировки и система управления — три условия автофокуса

Фокусировать — значит двигать объектив. Фокусировать автоматически — значит двигать объектив автоматически.

Мотор фокусировки отвечает на вопрос, «чем» двигать объектив, а система управления — «как» его двигать. При ручной фокусировке роль мотора играют наши руки, а роль системы управления — мозг.

Поэтому автофокус не означает, что фокусировки нет. Просто эту работу вместо ваших рук и мозга берут на себя мотор фокусировки и система управления.

Выполняются ли эти условия в камерах Raspberry Pi?

Выполняют ли официальные камеры Raspberry Pi все условия автофокуса?

Пока автофокус есть только у серии Camera Module 3.

Пройдёмся по списку условий ещё раз и посмотрим, как им соответствуют официальные камеры Raspberry Pi.

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

Первые три официальные камеры Raspberry Pi не рассчитаны на автофокус: они закрывают только базовые потребности.

Логика базовых потребностей такая: чёткий снимок можно получить и ручной фокусировкой. Моторы фокусировки и система управления усложняют конструкцию и повышают стоимость, а нужны они не всем. Значит, выполнять все условия автофокуса не обязательно.

Значит ли это, что официальные камеры Pi не умеют автофокус?

Да. Первые три официальных модуля камер Raspberry Pi (V1/V2/HQ) сами по себе автофокус не поддерживают — и точка.

Значит ли это, что надежды на автофокус для камер Pi нет?

Вовсе нет. В Arducam эту проблему решили.

Как Arducam выполняет условия автофокуса для камер Raspberry Pi

Логика решения простая:

Если у камеры Pi нет мотора фокусировки и системы управления, нужно сделать её вариант, у которого они есть.

Разберём два невыполненных условия по очереди.

1. Мотор фокусировки для камеры Pi

Начнём с мотора фокусировки.

Будем считать мотор фокусировки частью блока объектива.

В камерах Raspberry Pi встречаются два вида блоков объектива:

  1. В V1 и V2 блок объектива и сенсор объединены в один герметичный корпус, который подключается к печатной плате камеры разъёмом «плата — плата» (BTB). Такую конструкцию называют компактным модулем камеры (CCM); именно такие стоят в смартфонах.
  2. У камеры HQ отдельное крепление объектива. Сенсор IMX477 камеры HQ не объединён с блоком объектива в один корпус, а установлен на печатной плате камеры.
Компактный модуль камеры, снятый с платы Raspberry Pi Camera Module V2
Съёмный компактный модуль камеры на Raspberry Pi Camera Module V2
ИК-фильтр камеры Raspberry Pi HQ
У камеры Raspberry Pi HQ сенсор установлен на печатной плате камеры

Отсюда два способа сделать камеру Pi с автофокусом:

  1. Собрать CCM с мотором фокусировки внутри и подключить его к печатной плате камеры Raspberry Pi.
  2. Сделать специальный блок объектива с мотором фокусировки и установить его над сенсором на плате.
Камера Raspberry Pi V2 с автофокусом
Автофокусный CCM на замену штатному на официальной плате камеры V2
Камера с автофокусом на сенсоре IMX477, как в камере Raspberry Pi HQ
Специальный блок объектива с автофокусом на собственных вариантах платы камеры IMX477 от Arducam

2. Система управления (чтобы Pi могла управлять мотором фокусировки)

Теперь система управления: Raspberry Pi должна уметь управлять мотором фокусировки.

Прежде чем налаживать связь, посмотрим, как Raspberry Pi соединяется с мотором фокусировки:

  1. Raspberry Pi →
  2. → разъём MIPI CSI на Raspberry Pi →
  3. → шлейф камеры →
  4. → разъём MIPI CSI модуля камеры →
  5. → плата камеры →
  6. → мотор фокусировки.

Видно, что ключевое физическое соединение — шлейф камеры MIPI CSI. Есть ли в соединении MIPI CSI что-то, что поможет управлять мотором?

Шина I2C. А точнее, I2C процессора VideoCore.

i2c_vc

Значение «on» включает интерфейс I2C, который обычно зарезервирован за процессором VideoCore (по умолчанию — «off»).

Выводы I2C в распиновке камеры Raspberry Pi
Выводы I2C в распиновке камеры Raspberry Pi — через них можно управлять мотором фокусировки

Значит, мотором можно управлять через 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. Несколько советов:

  1. Автофокус работает, но не ждите от него такой же плавности и точности, как у камеры смартфона. Главная цель Arducam — показать, что это возможно, и дать вам больше возможностей. Это программная фокусировка на OpenCV, и с продвинутым фазовым (PD) или лазерным автофокусом она несравнима.
  2. Пример автофокуса есть, но Arducam всё же рекомендует программное ручное управление фокусом. Для него есть другой пример, в котором фокусировать камеру удобнее — клавишами со стрелками. Так точнее наводить фокус на интересующую область (ROI).
  3. Примеры проверены только в 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 с автофокусом (B0176)
  • Модуль камеры 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 с автофокусом (B0182)
  • Модуль камеры Arducam IMX219 с автофокусом — прямая замена камеры Raspberry Pi V2 и камеры для NVIDIA Jetson
Качественная вещь. Простая установка, всё заработало без доработок. Самый резкий фокус из всех моих камер для Raspberry Pi на сегодня. — RMG
Хорошая камера с автофокусом для моего скворечника. Я сделал камеру для наблюдения за птицами на Raspberry Pi. Стандартная камера была неплоха, но из-за фиксированного фокуса большинство птиц получались не в фокусе. Я купил эту камеру с автофокусом и, немного попрограммировав, смог улучшить снимки. Не все птицы в фокусе (они двигаются слишком быстро), но в целом снимки стали гораздо лучше. Настройка оборудования и программ потребовала немного усилий, но ничего сложного, если вы уже работали с Raspberry Pi. — Jeweler24
Прямая замена работает лучше оригинала. Поставил вместо вышедшей из строя камеры 5 Мп. Работает как часы, изображение очень хорошее; ночного видения нет, но оно мне и не нужно; устанавливается легко. Мой CR-10 S4 с OctoPi очень доволен. — покупатель
Камера Arducam HQ 12 Мп с автофокусом (B0272)
  • Камера Arducam 477P HQ 12 Мп с автофокусом для Raspberry Pi

Модули камер Pivariety с автофокусом для Raspberry Pi

Модуль камеры Arducam Pivariety с автофокусом (B0324)
Модуль камеры Arducam Pivariety с автофокусом (B0323)
  • Цветной модуль камеры 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 (B0167)
Поворотная камера PTZ Arducam 5 Мп 1080p, подключённая к Raspberry Pi
Поворотная камера PTZ Arducam 5 Мп 1080p для Raspberry Pi 4/3B+/3
  • Поворотная камера 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

Камера Arducam 16 Мп с автофокусом для Raspberry Pi (B0371)
Камера Arducam 64 Мп с автофокусом для Raspberry Pi (B0399)

На этом обзор закончен.

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

Ещё по теме

Запросить цену

Укажите количество — пришлём коммерческое предложение.