10.2. Bir anlık görüntü döndürme¶
Bir durum uç noktası iyidir, ancak kameranın var olma sebebi lenstir. Sensörün şu anda baktığı şeyin JPEG’ini döndüren bir uç nokta ekleyin.
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'},
)
Bir tarayıcıdan http://<cam-ip>/snapshot.jpg adresine gidin; mevcut görünümün bir JPEG’i sekmeyi doldurur. Yenileyin, taze bir tane alırsınız.
10.2.1. Response nesnesi¶
Sözlük döndüren bir işleyici, gerisini microdot’a bırakır. JPEG baytları uzun biçime ihtiyaç duyar: açıkça oluşturulmuş bir microdot.Response. body argümanı, bayt benzeri herhangi bir değeri kabul eder; kameranın image.Image arabelleği bytearray() aracılığıyla açığa çıkarılır, böylece sensörün içine yazdığı arabelleğin aynısı doğrudan sokete gider.
Content-Type: image/jpeg, tarayıcıya gövdeyi bir görüntü olarak işlemesini söyleyen şeydir. Bu olmadan tarayıcı JPEG baytlarını metin olarak görüntülemeye çalışır ve ekran dolusu anlamsız karakter görürsünüz.
image.Image.compress(), mevcut görüntü arabelleği üzerinde JPEG kodlamasını yerinde çalıştırır ve baytları olduğu gibi gönderilebilsin diye aynı görüntüyü (artık JPEG biçiminde) döndürür. quality=85 her zamanki varsayılandır; resmin keskin olacağı kadar yüksek, dosyanın yavaş bir bağlantıdan geçeceği kadar düşüktür.
10.2.2. Yakalama döngüyü bloke eder¶
csi.CSI.snapshot(), dönmeden önce sensörün bir çerçeveyi pozlamayı ve DMA ile aktarmayı bitirmesini bekler. Bir async işleyicinin içinde bu, olay döngüsünün pozlama süresince (aydınlatmaya bağlı olarak on, yirmi, elli milisaniye) duraklaması anlamına gelir. Tek seferde tek bir rotayı isteyen tek bir istemci ile bu görünmezdir; birden çok istemci veya yan yana çalışan bir yakalama eşyordamı (coroutine) ile her şeyi bloke eder.
snapshot() metodunun çok eşyordamlı durum için bloke etmeyen bir varyantı vardır (blocking=False bir sonraki hazır çerçeveyi veya None döndürür). İstek başına tek bir anlık görüntü için, varsayılan bloke eden çağrı yeterlidir.
Sahip artık bir URL’yi dürtüp taze bir çerçeve alabilir.