Initial push

This commit is contained in:
Ano-sys
2026-02-22 23:30:15 +01:00
commit 7a2d858dfb
58 changed files with 9896 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
"""
Requirements Step by Step:
sudo apt update
sudo apt install libjpeg62-turbo-dev python3-prctl python3-picamera2 python3-libcamera libcamera-apps libcamera-dev
python3 -m venv --system-site-packages env
source env/bin/activate
pip install flask pillow
"""
from flask import Flask, Response
from picamera2 import Picamera2
from PIL import Image
import io
import base64
import serial
import time
import cv2
s = serial.Serial('/dev/ttyACM1', 115200, timeout=1) # serielle verbindung zum ESP aufbauen
time.sleep(2)
'''
Kamera Konfigurieren mit einem Format von 640x480
'''
picam2 = Picamera2()
config = picam2.create_preview_configuration(main={"size": (640, 480)})
picam2.configure(config)
picam2.start()
MAX_RAW = 1200
MAX_B64 = 1200
# TODO: map image to MAX_B64
def encode_image_to_b64_with_limit(img: Image.Image, max_b64: int = 1024, scale_step: float = 0.9, initial_quality: int = 30, min_quality: int = 5) -> str:
quality = initial_quality
working_img = img.copy()
while True:
buf = io.BytesIO()
working_img.save(buf, format="JPEG", quality=quality, optimize=True)
jpeg_bytes = buf.getvalue()
b64 = base64.b64encode(jpeg_bytes).decode("utf-8")
if len(b64) <= max_b64 or (working_img.width < 2 or working_img.height < 2):
return b64
# if len(jpeg_bytes) <= MAX_RAW:
# return jpeg_bytes
new_w = max(1, int(working_img.width * scale_step))
new_h = max(1, int(working_img.height * scale_step))
working_img = working_img.resize((new_w, new_h), Image.LANCZOS)
if quality > min_quality:
quality = max(min_quality, int(quality * scale_step))
def init_serial():
global s
s = None
while s is None:
try:
s = serial.Serial('/dev/ttyACM1', 115200, timeout=1)
except Exception:
time.sleep(1)
continue
def gen():
global s
while True:
arr = picam2.capture_array("main") # Einen frame holen
img = Image.fromarray(arr).convert("L") # Bild in Graustufen umwandeln
# TODO: skip config with 640x480
img = img.resize((640, 480), Image.LANCZOS)
b64 = encode_image_to_b64_with_limit(img, MAX_B64) # Bildqualität reduzieren bis es eine Größe von maximal MAX_B64 (1200) hat
print("Image_b64 size: " + str(len(b64)))
try:
s.write(("{\"type\":\"image\",\"data\":\"" + b64 + "\"}\n").encode("utf-8")) # Frame als JSON-String an den ESP verschicken
# s.write((b64 + "\n").encode("utf-8"))
except Exception:
'''
War das schreiben über seriell nicht möglich wird ein erneuter Verbindungsaufbau versucht bis die Verbindung wieder steht.
Es wird davon ausgegangen das wir die Verbindung verloren haben und deswegen das schreiben nicht möglich war.
'''
init_serial()
time.sleep(0.1)
if __name__ == "__main__":
# app.run(host="0.0.0.0", port=1234, threaded=True)
try:
gen()
except KeyboardInterrupt:
serial.close()
print("Uebertragung beenden")