Files
qr/qr.py
T
2026-06-10 19:44:16 +02:00

121 lines
2.9 KiB
Python

import pygame
import qrcode
import cv2
import json
import base64
import time
import random
import string
from io import BytesIO
def gen_id():
return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10))
def make_qr(data, size):
qr = qrcode.QRCode(box_size=8, border=2)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill="black", back_color="white").convert("RGB")
img = img.resize((size, size))
buf = BytesIO()
img.save(buf, format="PNG")
buf.seek(0)
return pygame.image.load(buf)
def pack(session, seq, msg):
payload = {
"s": session,
"q": seq,
"m": base64.b64encode(msg.encode()).decode()
}
return json.dumps(payload)
pygame.init()
screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
w, h = screen.get_size()
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
session_id = gen_id()
seq = 0
msg = ""
qr = None
last_decode = []
stable = ""
last_seq = -1
qr_size = h // 2
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
running = False
if e.key == pygame.K_RETURN:
msg = input("msg: ")
seq += 1
ret, frame = cap.read()
if ret:
data, _, _ = detector.detectAndDecode(frame)
if data:
try:
obj = json.loads(data)
if obj.get("s"):
if obj["s"] != session_id:
pass
else:
text = base64.b64decode(obj["m"]).decode()
last_decode.append((obj["q"], text))
if len(last_decode) > 5:
last_decode.pop(0)
# stabiliteit check
counts = {}
for _, t in last_decode:
counts[t] = counts.get(t, 0) + 1
for t, c in counts.items():
if c >= 3:
stable = t
except:
pass
if msg:
qr = make_qr(pack(session_id, seq, msg), qr_size)
screen.fill((0,0,0))
if qr:
screen.blit(qr, (w//4 - qr_size//2, h//4))
font = pygame.font.SysFont(None, 36)
screen.blit(font.render("SESSION: " + session_id[:6], True, (0,255,0)), (20,20))
screen.blit(font.render("SENT: " + msg[:30], True, (255,255,0)), (20,80))
screen.blit(font.render("RECV: " + stable[:30], True, (0,255,0)), (w//2+20,20))
cam_surface = pygame.surfarray.make_surface(
cv2.cvtColor(cv2.flip(frame,1), cv2.COLOR_BGR2RGB).swapaxes(0,1)
)
screen.blit(pygame.transform.scale(cam_surface, (w//2, h)), (w//2,0))
pygame.display.flip()
pygame.time.Clock().tick(30)
cap.release()
pygame.quit()