10.2. Tilannekuvan palauttaminen¶
Tilapäätepiste on hyvä, mutta kameran olemassaolon syy on linssi. Lisää päätepiste, joka palauttaa JPEG-kuvan siitä, mitä sensori juuri nyt katsoo.
import csi
from microdot import Response
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
@app.get('/snapshot.jpg')
async def snapshot(request):
img = csi0.snapshot().compress(quality=85)
return Response(
body=img.bytearray(),
headers={'Content-Type': 'image/jpeg'},
)
Avaa http://<cam-ip>/snapshot.jpg selaimella, niin nykyisen näkymän JPEG täyttää välilehden. Päivitä, niin saat tuoreen.
10.2.1. Response-objekti¶
Sanakirjan palauttava käsittelijä antaa microdotin hoitaa loput. JPEG-tavut vaativat pidemmän muodon: eksplisiittisesti rakennetun microdot.Response-objektin. body-argumentti ottaa minkä tahansa tavujen kaltaisen arvon – kameran image.Image-puskuri tarjotaan bytearray()-metodin kautta, joten sama puskuri, johon sensori kirjoitti, menee suoraan socketiin.
Content-Type: image/jpeg on se, mikä kertoo selaimelle renderöidä rungon kuvana. Ilman sitä selain yrittäisi näyttää JPEG-tavut tekstinä ja näkisit ruudullisen roskaa.
image.Image.compress() suorittaa JPEG-koodauksen olemassa olevassa kuvapuskurissa paikan päällä ja palauttaa saman kuvan (nyt JPEG-muodossa), jotta sen tavut voidaan lähettää sellaisenaan. quality=85 on tavanomainen oletus – riittävän korkea, että kuva on terävä, mutta riittävän matala, että tiedosto mahtuu hitaan yhteyden läpi.
10.2.2. Kuvankaappaus tukkii silmukan¶
csi.CSI.snapshot() odottaa, että sensori on valottanut kehyksen ja siirtänyt sen DMA:lla, ennen kuin se palaa. Async-käsittelijän sisällä tämä tarkoittaa, että tapahtumasilmukka pysähtyy valotuksen ajaksi – kymmenestä viiteenkymmeneen millisekuntiin valaistuksesta riippuen. Kun yksi asiakas pyytää yhtä reittiä kerrallaan, tämä on näkymätöntä; usean asiakkaan kanssa, tai kun kaappauskorutiini on käynnissä rinnalla, se tukkisi kaiken muun.
snapshot()-metodista on olemassa ei-tukkiva variantti monikorutiinitapausta varten (blocking=False palauttaa seuraavan valmiin kehyksen tai None). Yhtä tilannekuvaa pyyntöä kohden varten oletusarvoinen tukkiva kutsu on riittävä.
Omistaja voi nyt naputtaa URL-osoitetta ja saada tuoreen kehyksen.