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.
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.
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ů.
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)
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
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é.
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.
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
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 FocusExampleru přiblížíte, nebo oddálíte čočku.
Snížil jsem šipkou hodnotu na 395 a kamera zaostřila na budovu přes ulici
Zvýšil jsem hodnotu na 1 445 a zaostřil na Petřín a stromeček asi 20 cm před kamerou
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.
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.
Arducam Autofocus Camera je nelepší foťák pro Raspberry Pi. Má 16 megapixelů a konečně automatické ostření - Živě.cz
Read More
No comments:
Post a Comment