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.