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.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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ů.

Klepněte pro větší obrázek
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)
Klepněte pro větší obrázek
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
Klepněte pro větší obrázek
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é.

Klepněte pro větší obrázekKlepněte pro větší obrázek
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.

Klepněte pro větší obrázek
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
Klepněte pro větší obrázek
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.

Klepněte pro větší obrázek
Snížil jsem šipkou hodnotu na 395 a kamera zaostřila na budovu přes ulici
Klepněte pro větší obrázek
Zvýšil jsem hodnotu na 1 445 a zaostřil na Petřín a stromeček asi 20 cm před kamerou
Klepněte pro větší obrázekKlepněte pro větší obrázek
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.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
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: Pojďme programovat elektroniku, AliExpress, Kamera, Bastlení, Raspberry Pi, GitHub, Fotoaparát, Sony, Arduino, PDF, Stavebnice, DIY, JPEG, Camera Serial Interface, Autofokus, Fil, High Quality Camera, Ostření, LAPS, ARG, Petřín, GUI, CSI, CTRL + C, Modul, Digitální kamery na Heureka.cz



Sex manželských párů? Jen výjimečně. Ložnice ovládnou roboti s umělou inteligencí

Sex manželských párů? Jen výjimečně. Ložnice ovládnou roboti s umělou inteligencí

** Sex manželských párů jen při zvláštních příležitostech. ** Ložnice ovládnou sexuální roboti s umělou inteligencí. ** I to je jeden ze závěrů Mezinárodní robotické konference.

Filip KůželJiří Liebreich
RobotiSexUmělá inteligence
Jak zrcadlit obrazovku mobilu a počítače do televize

Jak zrcadlit obrazovku mobilu a počítače do televize

Ať už se chcete pochlubit fotkami z dovolené na velké obrazovce, nebo si přehrát video uložené na disku počítače, neobejdete se bez zrcadlení obrazovky. Ve výchozím stavu jej podporuje Windows i Android.

Stanislav Janů
NávodyTelevizeWindows
Nastal pravý čas na výměnu telefonu. Jak poznat, že ten váš už dosluhuje?

Nastal pravý čas na výměnu telefonu. Jak poznat, že ten váš už dosluhuje?

** Jak poznat, že váš telefon má nejlepší dny za sebou? ** Vypadá potlučeně, má pavučinu nebo nedostává aktualizace? ** Ukážeme si, kdy má smysl jeho oprava, a kdy už jen koupě nového

Martin Chroust
Prasklý displejVysloužilý mobilSmartphony
Oppo a OnePlus nesmí v Německu prodávat telefony. Zákaz hrozí i v dalších zemích EU

Oppo a OnePlus nesmí v Německu prodávat telefony. Zákaz hrozí i v dalších zemích EU

** Patentové spory většinou ústí k tomu, že jedna z firem zaplatí ** Oppo ani OnePlus však nechtějí platit 2,50 EUR za každý telefon ** Firmy už v Německu nesní prodávat, a to může platit i o dalších trzích

Martin Chroust
NěmeckoPatentSmartphony
Jak poznat, že máte možná hacknutý telefon? Toto je devět symptomů, které můžete pozorovat

Jak poznat, že máte možná hacknutý telefon? Toto je devět symptomů, které můžete pozorovat

** Jak poznat, že je váš smartphone hacknutý? ** Hledejte známky po nestandardním chování telefonu ** Stačí když telefon vydrží méně nebo topí i v klidovém režimu...

Martin Chroust
Jak...Malware
15 praktických tipů a triků pro Mapy.cz, které možná neznáte

15 praktických tipů a triků pro Mapy.cz, které možná neznáte

** Mapy.cz neslouží jen k zobrazení podkladů a plánování tras ** Nabízejí celou řadu dalších praktických funkcí a možností ** Vybrali jsme 15 tipů a triků, o kterých možná nevíte

Karel Kilián
Mapy.czMapyTipy