Pojďme programovat elektroniku | Raspberry Pi | DIY

Arducam Autofocus Camera je nelepší foťák pro Raspberry Pi. Má 16 megapixelů a konečně automatické ostření

  • Snímky pořizuje čip Sony IMX519
  • Nabízí rozlišení 16 megapixelů a hlavně autofokus
  • Na RPishopu ji koupíte od sedm stovek

Když nadace Raspberry Pi před dvěma lety představila nový modul High Quality Camera s 12,3MP čipem Sony IMX477 a především výměnnými objektivy, vypadalo to, že ho jen tak někdo nepřekoná a britská Malina nabídne doposud netušené možností pro průmysl, time-lapse a další automatizované fotografické úlohy.

Není divu, drobných a laciných kamerek Raspberry Pi je totiž sice plný AliExpress, jejich obrazová kvalita je ale často tragická a vhodná opravdu jen pro hobby projekty a nejrůznější prototypy.

RPi kamerám doposud chyběl autofokus

Prakticky všechny kamerové prototypovací moduly pro britský minipočítač (HQ Cameru nevyjímaje) měly zároveň doposud jeden vážný nedostatek. Chybělo jim motorizované manuální a automatické ostření. Všechny jsme tedy museli ručně a mnohdy opravdu velmi komplikovaně a nepřesně ostřit otáčením závitu objektivu.

6e09b0b4-a372-4fd9-8843-a722b79eea5b6b68daed-e52c-4142-af5b-7cc16e6180e495164448-c2da-4f0d-8be5-626bd125b7c5
8MP Raspberry Pi Camera Module 2 a  12,3MP High Quality Camera s teleobjektivem

Dobře, u malých modulů absence autofokusu až tak nevadí, ale když na HQ Cameru připojíte teleobjektiv a budete chtít přeostřit na cílový objekt, budete muset k Raspberry Pi připojit monitor, nebo vše ladit skrze nějaký MJPEG a jiný videoserver. Uf, bude to složité a vážně nekomfortní.

16 megapixelů od Arducamu

Naštěstí tu máme kutily z Arducamu – známého výrobce kamerových modulů pro Arduino, Raspberry Pi a další minipočítače, kteří nedávno představili nový fotoaparát 16MP Autofocus Camera Module. Tuzemský RPishop.cz jej naskladnil už před pár týdny, chlubí se štítkem oficiálního distributora a kamerku prodává v základní verzi za sedm stovek.

f86ee256-1cf6-403b-b859-1a6d7e30054dbb9501ca-e1cb-4ebd-a659-cc669c4d7a163dd25060-88a0-45dd-928f-4440ed45680b6e4731b6-2155-4912-a54d-fee31748b78d
Arducam 16M Autofocus Camera Module. Další fotografie najdete v galerii

Základní vlastnosti:

  • Snímací čip Sony IMX519 s autofokusem
  • Ohnisková vzdálenost 4,28 mm
  • Rozlišení snímače 4656×3496 px
  • Rozlišení fotografie: 16 MP
  • Rozlišení videa: 1080p30, 720p60
  • Ovladače pro Raspberry Pi (V4L2)
  • Podpora nového rozhraní libcamera
  • Rozměrově kompatibilní s oficiálními moduly V1 a V2

Nový balík aplikací Libcamera

Britská nadace loni na podzim vyrukovala s novou verzí Raspberry Pi OS založenou na Debianu 11 Bullseye, která zcela mění způsob práce s kamerou pomocí vestavěných nástrojů.

5fdd022e-ffb8-4d43-af36-9ef158229c5c
Pro účely dnešního článku jsem si navrhl a vytiskl jednoduchý držák pro kamerový modul ve verzi s krabičkou a stativovým závitem a Raspberry Pi 4. Model najdete na Tinkercadu 

Zatímco v předchozích verzích systému bylo třeba nejprve aktivovat rozhraní CSI (Camera Serial Interface) pomocí konfigurační utility raspi-config a poté číst snímky a videa pomocí předinstalovaných aplikací raspistill, raspivid nebo raspiyuv, v té aktuální vše nahrazuje balík nástrojů libcamera a ruční aktivace kamerové sběrnice již není třeba.

S libcamerou počítá i Arducam a nabízí vlastní dokumentaci, takže po jednoduché instalaci ovladačů dle návodu (PDF) můžeme číst snímky a video z kamery pomocí standardního rozhraní Raspberry Pi OS.

Pojďme si ty nejdůležitější nové programy stručně představit:

  • libcamera-hello zobrazí na pár sekund grafické okno s náhledem z kamery
  • libcamera-hello -t 0 zobrazí náhledové okno po neomezenou dobu, dokud nezavřete okno, nebo běh programu v terminálu neukončíte ručně (CTRL+C)
2929acf3-a45f-4755-a2ba-438861a99b28
Příkaz libcamera-hello -t 0 v praxi
  • libcamera-hello -t 60000 zobrazí náhledové okno po dobu 60 000 ms
  • libcamera-jpeg zobrazí náhled a poté uloží fotografii ve formátu JPEG
  • libcamera-vid sejme z kamery video v některém z podporovaných formátů
  • libcamera-still také slouží k sejmutí fotografie, ale s pokročilými parametry

Výčet všech možností programu libcamera-still by byl dlouhý, takže jen několik příkladů.

Parametr -e, --encoding změní kódování snímku (výchozí je JPEG):

libcamera-still -e png -o test.png
libcamera-still -e bmp -o test.bmp
libcamera-still -e rgb -o test.data
libcamera-still -e yuv420 -o test.data

Parametr -r, --raw uloží surový snímek ve formátu DNG:

libcamera-still -r -o test.dng

Parametry --vf (vertical flip) a --hf (horizontal flip) zrcadlově otočí snímek pro správnou orientaci:

libcamera-still --vf --hf -o test.jpg
27089eab-6276-44cf-8edf-9bce1a645b36
Kombinace vertikální a horizontální přetočení pro úpravu orientace kamery

Kombinováním dalších podporovaných parametrů můžete ručně nastavit téměř dokonale celou expozici. Takže kdybychom chtěli provést třeba 20 sekund dlouhou expozici a s ručním nastavením vyvážení červeného a modrého tónu (awbgains) a citlivosti (gain), příkaz bude vypadat následovně:

libcamera-still -o dlouha_expozice.jpg --shutter 20000000 --gain 1 --awbgains 1,1 --immediate

Na fotografiích níže vidíte zleva plně automatický snímek pořízený příkazem libcamera-jpeg, u kterého expozimetr zvolí čas s relativně krátkou horní hranicí, a snímek s pokročilou expozicí, ve kterém jsme si vynutili snímání po dobu 20 sekund (v mikrosekundách) a s úpravou citlivosti a vyvážení bílé.

87037d65-0367-4f81-9715-6ad8262a1331dee13fac-133e-40e3-9f6b-35778c00360c
Automatická a dlouhá expozice

Fotografie byly pořízené v potemnělé kanceláři 27.02. v 17:50. Dlouhá expozice proto může do jisté míry suplovat třeba noční IR kameru, byť potřebuje alespoň trošku světla.

Všechny možnosti programu vypíšete pomocí parametru -h, --help:

libcamera-still -h

Valid options are:
  -h [ --help ] [=arg(=1)] (=0)         Print this help message
  --version [=arg(=1)] (=0)             Displays the build version number
  --list-cameras [=arg(=1)] (=0)        Lists the available cameras attached to the system.
  --camera arg (=0)                     Chooses the camera to use. To list the available indexes, use the 
                                        --list-cameras option.
  -v [ --verbose ] [=arg(=1)] (=0)      Output extra debug and diagnostics
  -c [ --config ] [=arg(=config.txt)]   Read the options from a file. If no filename is specified, default to 
                                        config.txt. In case of duplicate options, the ones provided on the command line
                                        will be used. Note that the config file must only contain the long form 
                                        options.
  --info-text arg (=#%frame (%fps fps) exp %exp ag %ag dg %dg)
                                        Sets the information string on the titlebar. Available values:
                                        %frame (frame number)
                                        %fps (framerate)
                                        %exp (shutter speed)
                                        %ag (analogue gain)
                                        %dg (digital gain)
                                        %rg (red colour gain)
                                        %bg (blue colour gain)
                                        %focus (focus FoM value)
                                        %aelock (AE locked status)
  --width arg (=0)                      Set the output image width (0 = use default value)
  --height arg (=0)                     Set the output image height (0 = use default value)
  -t [ --timeout ] arg (=5000)          Time (in ms) for which program runs
  -o [ --output ] arg                   Set the output file name
  --post-process-file arg               Set the file name for configuring the post-processing
  --rawfull [=arg(=1)] (=0)             Force use of full resolution raw frames
  -n [ --nopreview ] [=arg(=1)] (=0)    Do not show a preview window
  -p [ --preview ] arg (=0,0,0,0)       Set the preview window dimensions, given as x,y,width,height e.g. 0,0,640,480
  -f [ --fullscreen ] [=arg(=1)] (=0)   Use a fullscreen preview window
  --qt-preview [=arg(=1)] (=0)          Use Qt-based preview window (WARNING: causes heavy CPU load, fullscreen not 
                                        supported)
  --hflip [=arg(=1)] (=0)               Request a horizontal flip transform
  --vflip [=arg(=1)] (=0)               Request a vertical flip transform
  --rotation arg (=0)                   Request an image rotation, 0 or 180
  --roi arg (=0,0,0,0)                  Set region of interest (digital zoom) e.g. 0.25,0.25,0.5,0.5
  --shutter arg (=0)                    Set a fixed shutter speed
  --analoggain arg (=0)                 Set a fixed gain value (synonym for 'gain' option)
  --gain arg                            Set a fixed gain value
  --metering arg (=centre)              Set the metering mode (centre, spot, average, custom)
  --exposure arg (=normal)              Set the exposure mode (normal, sport)
  --ev arg (=0)                         Set the EV exposure compensation, where 0 = no change
  --awb arg (=auto)                     Set the AWB mode (auto, incandescent, tungsten, fluorescent, indoor, daylight, 
                                        cloudy, custom)
  --awbgains arg (=0,0)                 Set explict red and blue gains (disable the automatic AWB algorithm)
  --flush [=arg(=1)] (=0)               Flush output data as soon as possible
  --wrap arg (=0)                       When writing multiple output files, reset the counter when it reaches this 
                                        number
  --brightness arg (=0)                 Adjust the brightness of the output images, in the range -1.0 to 1.0
  --contrast arg (=1)                   Adjust the contrast of the output image, where 1.0 = normal contrast
  --saturation arg (=1)                 Adjust the colour saturation of the output, where 1.0 = normal and 0.0 = 
                                        greyscale
  --sharpness arg (=1)                  Adjust the sharpness of the output image, where 1.0 = normal sharpening
  --framerate arg (=30)                 Set the fixed framerate for preview and video modes
  --denoise arg (=auto)                 Sets the Denoise operating mode: auto, off, cdn_off, cdn_fast, cdn_hq
  --viewfinder-width arg (=0)           Width of viewfinder frames from the camera (distinct from the preview window 
                                        size
  --viewfinder-height arg (=0)          Height of viewfinder frames from the camera (distinct from the preview window 
                                        size)
  --tuning-file arg (=-)                Name of camera tuning file to use, omit this option for libcamera default 
                                        behaviour
  --lores-width arg (=0)                Width of low resolution frames (use 0 to omit low resolution stream
  --lores-height arg (=0)               Height of low resolution frames (use 0 to omit low resolution stream
  --mode arg                            Camera mode as W:H:bit-depth:packing, where packing is P (packed) or U 
                                        (unpacked)
  --viewfinder-mode arg                 Camera mode for preview as W:H:bit-depth:packing, where packing is P (packed) 
                                        or U (unpacked)
  --autofocus [=arg(=1)] (=0)           Flush output data as soon as possible
  -q [ --quality ] arg (=93)            Set the JPEG quality parameter
  -x [ --exif ] arg                     Add these extra EXIF tags to the output file
  --timelapse arg (=0)                  Time interval (in ms) between timelapse captures
  --framestart arg (=0)                 Initial frame counter value for timelapse captures
  --datetime [=arg(=1)] (=0)            Use date format for output file names
  --timestamp [=arg(=1)] (=0)           Use system timestamps for output file names
  --restart arg (=0)                    Set JPEG restart interval
  -k [ --keypress ] [=arg(=1)] (=0)     Perform capture when ENTER pressed
  -s [ --signal ] [=arg(=1)] (=0)       Perform capture when signal received
  --thumb arg (=320:240:70)             Set thumbnail parameters as width:height:quality, or none
  -e [ --encoding ] arg (=jpg)          Set the desired output encoding, either jpg, png, rgb, bmp or yuv420
  -r [ --raw ] [=arg(=1)] (=0)          Also save raw file in DNG format
  --latest arg                          Create a symbolic link with this name to most recent saved file
  --immediate [=arg(=1)] (=0)           Perform first capture immediately, with no preview phase

Parametr --autofocus zaostří

Všechny tyto příkazy jsou kompatibilní s kamerami podporovanými vrstvou libcamera, což v tuto chvíli samozřejmě platí pro Raspberry Pi Camera Module 1, 2 a High Quality Camera, po instalaci ovladačů ale i pro novou kamerku od Arducamu.

A právě s tou poslední jmenovanou kamerkou můžeme konečně použít klíčový parametr --autofocus!

Takže když bychom chtěli spustit na 5 sekund náhled, zaostřit a poté uložit fotografii v plném rozlišení do souboru test.jpg, stačí v terminálu zavolat příkaz:

libcamera-jpeg -t 5000 -o test.jpg –-autofocus

Kamera zaostří na převažující objekt v zorném poli a tuto pozici si zapamatuje. Parametr --autofocus proto nemusíme používat pokaždé a s rizikem, že pokud kamera nedokáže zaostřit, získáme rozmazaný snímek. Naopak! Ostření je ve výchozím stavu zamčené na poslední konfiguraci a my jej vyvoláme jen tehdy, pokud to sami potřebujeme.

8d9c2ccd-a399-46fd-afb4-7e6405d4527f
Pořízení snímku s úvodním zaostřením na objekty v popředí pomocí parametru --autofocus. Kamera si bude stav zaostření pamatovat
01e4b9fc-f8ff-4e5b-a3f1-ef6127ea19d7
Opětovné pořízení snímku, ale tentokrát bez parametru --autofocus. Použije se uložený stav zaostření, takže budova v pozadí je stále rozmazaná

Knihovna Focuser dodá ruční ostření

Kamera (nebo alespoň její ovladače) zatím neumožňuje pokročilejší režimy ostření. Hodilo by se třeba bodové ostření, ve kterém bychom modulu přikázali, ať zaostří třeba na určitou souřadnici XY, respektive příslušnou zónu ostřící matice.

Tento nedostatek ale můžeme vyřešit po vlastní ose, součástí ovladače na GitHubu je totiž knihovna Focuser pro ruční ostření v Pythonu a také jednoduchý příklad s textovým GUI.

Po stažení z GitHubu jej spustíte příkazem:

python3 FocuserExample.py -d /dev/v4l-subdev1

Podstatné je to, že Focuser neblokuje zařízení, takže v druhém terminálu můžete bez problému spustit náhled z kamery třeba příkazem:

libcamera-hello -t 0

(nekonečně dlouhý živý náhled) a pomocí šipek ↑ a ↓ ve FocusExamplu přiblížíte, nebo oddálíte čočku.

cb372047-97cf-4ab5-8b8a-d385305a5a4b
Snížil jsem šipkou hodnotu na 395 a kamera zaostřila na budovu přes ulici
ce014b88-111f-4292-ac2d-073619abef78
Zvýšil jsem hodnotu na 1 445 a zaostřil na Petřín a stromeček asi 20 cm před kamerou
65c3592c-96f6-4956-ac87-848d09c1c8e0dadca1bf-de3e-4849-ac99-d227fa332a2b
Nejvyšší možná hodnota je 4 095 (12bit rozsah) a odpovídá zaostření na nejbližší objekt ve vzdálenosti zhruba 7 cm od kamerky 

Nižší hodnota Focuseru ostří na vzdálený bod, vyšší číselná hodnota naopak na bližší. Jemnou změnou této hodnoty docílíte kýžené konfigurace.

Jak už jsme si řekli výše, stav ostření se poté uloží do paměti, takže v této pozici čočky pak můžeme zvesela volat všechny aplikace z balíku libcamera. Tentokrát ale už pochopitelně bez parametru --autofocus, jinak bychom o ruční nastavení okamžitě přišli a kamera by opět automaticky přeostřila dle svého vlastního uvážení.

Za 749 korun nic lepšího neseženete

Podle Arducamu i komunity 16MP kamera pořizuje snímky s lepší kresbou než dražší HQ snímač od nadace Raspberry Pi, ke kterému je třeba ke všemu dokoupit ještě objektiv.

Není to jen vyšším rozlišením, ale právě autofokusem, který je v běžných světelných podmínkách jednoduše rychlejší a přesnější. Zvláště pak v instalacích bez připojeného monitoru nebo vzdálené plochy, kdy na první pohled nevidíme, jak vypadá výsledek.

b39f310f-d345-4f83-9555-3c0b38309e4bc730d816-6b31-42e2-a336-5dc27ce778cba3abeb27-ea3c-400f-af4b-6481fc45c70e
9b38e484-78c7-4c98-8e66-f6a1a36e310d8951049f-e661-4b61-acc2-e0374ba7e4ff426b561a-fc6d-4259-bb66-8183f4554dda
53537f08-749a-4d4e-8185-003ebb15a51ae00e3409-8697-4910-99da-f1fd0c7435224619e165-0739-459d-8176-cdb69534a7b8
Ukázky z nedělní podvečerní kanceláře. Vše s plnou automatikou pomocí libcamera-jpeg. Jen orientační náhledy; silně komprimováno naším redakčním systémem

Nelze než doufat, že kamerových modulů s autofokusem bude přibývat, Arducam totiž zároveň udržel akceptovatelnou cenu. Základní klony 5MP Camera Module V1 s nižším rozlišením a mnohdy šerednou kvalitou sice na AliExpressu seženete za cenu lepšího piva, nicméně 16MP modul s autofokusem od Arducamu také není žádnou luxusní záležitostí.

RPishop.cz jej má v nabídce za 749 korun v holém stavu, v plastové krabičce se standardním závitem pro stativy pak za 828 korun. Jen pro srovnání, oficiální kamera V2 s 8MP snímačem Sony IMX219 stojí na stejném e-shopu taktéž 749 korun a holý snímač HQ kamery bez objektivu 1 499 korun.

Arducam je proto až na některé specifické scénáře jasnou volbou – zejména na nejnovější verzi Raspberry Pi OS postavené na Debianu Bullseye a ideálně i na výkonnějším železe: Raspberry Pi 4, anebo Raspberry Pi Zero 2.

Diskuze (16) Další článek: Nádherná kuriozita. Tříkolový Morgan Super 3 rozdává adrenalin a je zatraceně cool

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,