4.17. Érzékelő-beállítások¶
A pixformat() és a framesize() mellett a CSI osztály néhány érzékelőnkénti vezérlőt is elérhetővé tesz, amelyekhez szinte minden alkalmazás előbb-utóbb nyúl – a beépítési tájolást, az expozíciót, az erősítést, a fehéregyensúlyt és néhány hibakeresési segédeszközt. Mindegyik közvetlenül egy korábban tárgyalt érzékelő-fogalomra képeződik le; az API csak egy Python-fogantyút biztosít a regiszter-íráshoz, amelyet a meghajtó alatta elvégez.
Az alábbi metódusok mindegyike a mögöttes érzékelőre hat. Mindegyik regiszter-írásokat küld az érzékelő I2C vezérlőbuszán keresztül, így a költség mikroszekundumokban mérhető, és az új beállítás a következő expozíciónál lép életbe – jellemzően a következő snapshot() hívásnál.
4.17.1. Tájolás¶
A kamera nem tudja, melyik irányban szerelték fel. Az érzékelőn alkalmazott két tükrözési jelzővel a kép a megfelelő állásba fordítható, mielőtt bármelyik képpont elhagyná a chipet:
csi0.hmirror(True)
csi0.vflip(True)
A hmirror() balról jobbra tükröz, a vflip() pedig fentről lefelé. Együtt lefedik a gyakorlatban előforduló eseteket: fejjel lefelé felszerelt panel (mindkét jelző True), elülső felületén tükröző tükör mögötti panel (csak hmirror), vagy egy alulról tükrözött jelenetet figyelő panel (csak vflip).
Mivel a tükrözés az érzékelő kiolvasó logikájában történik, nincs CPU-költség és nincs memória-többletterhelés – a képkocka már megfelelően tájolva érkezik a képkocka-pufferbe.
4.17.2. Expozíció¶
Az expozíció az integrációs idő – mennyi ideig gyűjti a töltést az egyes képpontok fotodiódája, mielőtt a sort kiolvassák, mikroszekundumban kifejezve. A meghajtó az érzékelő automatikus expozíciós hurkának futtatásával indul, így a kamera megpróbálja az átlagos képpontértéket egy célérték közelében tartani. A hurok letiltása az expozíciót az alkalmazás által választott értékre rögzíti:
csi0.auto_exposure(False, exposure_us=8000)
A rögzített expozíció akkor a helyes választás, ha a jelenet fényessége stabil, és az alkalmazásnak kiszámítható mozgási elmosódásra vagy képkockáról képkockára egyenletes intenzitásra van szüksége a küszöbértékeléshez. Az aktuális expozíció visszaolvasása – akár a hurok, akár az alkalmazás állította be – külön hívás:
us = csi0.exposure_us()
A auto_exposure() hívása True értékkel és expozícióérték nélkül visszaadja a vezérlést a huroknak.
4.17.3. Erősítés¶
Az erősítés az ADC elérése előtt a képpont feszültségére alkalmazott erősítő, decibelben kifejezve. Az expozícióhoz hasonlóan a meghajtó az automatikus erősítési hurokkal bekapcsolva indul. Két minta fordul elő gyakran. A felső határ megszabása lehetővé teszi a huroknak, hogy alkalmazkodjon a megvilágításhoz, de megakadályozza, hogy korlátlanul felerősítse a zajt sötét jelenetekben:
csi0.auto_gain(True, gain_db_ceiling=16)
A rögzített erősítés megszabása akkor a helyes lépés, ha az alkalmazás az expozíciót is rögzíti – az erősítés stabilitása fontos azoknál az alkalmazásoknál, amelyek képkockáról képkockára hasonlítják össze a képpontértékeket, mint a színkövetés:
csi0.auto_gain(False, gain_db=0)
Az aktuális erősítés a gain_db() segítségével olvasható vissza. Amikor egy alkalmazás letiltja az automatikus erősítést, le kell tiltania az automatikus fehéregyensúlyt és az automatikus expozíciót is – különben a még működő vezérlőhurkok olyan módon mozgatják a képet, ami meghiúsítja a rögzített erősítés célját.
4.17.4. Fehéregyensúly¶
A fehéregyensúly az a csatornánkénti erősítés, amelyet az ISP a debayer fokozatból kilépő vörös, zöld és kék csatornákra alkalmaz, hogy egy fehér tárgy bármilyen színű fényben fehérnek látsszon. Az automatikus fehéregyensúly hurok ezt a három erősítést a területenkénti statisztikákból számítja ki, amelyeket az ISP minden képkockán gyűjt, és a következő képkockán alkalmazza azokat.
A legtöbb alkalmazás futni hagyja a hurkot. A színkövetés a gyakori kivétel – az erősítések egyúttal azok az értékek is, amelyeket a hurok egy színes tárgy követésére mozgat, így ha az alkalmazás egy vörös foltot próbál megtalálni, a hurok csendben elhalványítja a vörös csatornát, és a folt többé nem fog egyezni. A hurok zárolása ezt megoldja:
csi0.auto_whitebal(False)
Adjon meg egy explicit (r, g, b) tuple-t decibelben az ismételhető színkalibrációhoz – ugyanazok az erősítések paneleken és munkamenetekben át:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
Az aktuális erősítések a rgb_gain_db() segítségével olvashatók vissza tuple-ként.
4.17.5. Képkockasebesség korlátozása¶
Az érzékelők alapértelmezés szerint a natív képkockasebességükön futnak – a legtöbb alkatrésznél 30-60 képkocka másodpercenként, a nagy sebességű érzékelőkön ennél jóval magasabb, ha a framesize elég kicsi. A sebesség korlátozása lehetővé teszi az alkalmazásnak, hogy a kamerát arra a sebességre fojtsa vissza, amellyel a lefelé irányuló feldolgozás lépést tud tartani:
csi0.framerate(15)
Azokon az érzékelőkön, amelyek támogatják a hardveres sebességszabályozást, a hívás a képkockánkénti expozíciós keretet is megnöveli, ami gyenge fényviszonyok között segíthet; a többinél a meghajtó egyszerűen kihagyja a fölös képkockákat a képkocka-puffer szintjén.
4.17.6. Tesztminta¶
A színsáv-tesztminta a legtöbb érzékelőbe be van építve, és hasznos egy képalkotási probléma egy kimeneti problémától való elkülönítéséhez. A bekapcsolása megkerüli a fotodióda-tömböt, és egy rögzített mintát küld ugyanazon a képpontadat-útvonalon:
csi0.colorbar(True)
Ha a tesztminta jól néz ki, de az élő kép nem, akkor a hiba az optikában vagy az érzékelő analóg bemeneti fokozatában van; ha még a tesztminta is sérült, akkor a probléma valahol a képpontadat-buszon vagy a pixformat() / framesize() beállításában rejlik. Adjon meg False értéket az élő képhez való visszatéréshez.
A teljes API-ért lásd a csi.CSI osztályt, beleértve az érzékelő-specifikus ioctl() parancsokat, amelyek az egyes érzékelőcsaládokra jellemző egyedi vezérlőket teszik elérhetővé.