From 23a43254d45c3eed7995ea0619ac0bf5af535f51 Mon Sep 17 00:00:00 2001 From: Ben de Roo Date: Wed, 10 Jun 2026 19:44:16 +0200 Subject: [PATCH] Update qr.py --- qr.py | 106 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 34 deletions(-) diff --git a/qr.py b/qr.py index 30704bc..d96bf32 100644 --- a/qr.py +++ b/qr.py @@ -1,17 +1,18 @@ import pygame import qrcode +import cv2 +import json +import base64 +import time import random import string -import time -import cv2 from io import BytesIO -import numpy as np def gen_id(): - return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8)) + return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10)) def make_qr(data, size): - qr = qrcode.QRCode(box_size=10, border=2) + 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") @@ -21,63 +22,100 @@ def make_qr(data, size): 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() -clock = pygame.time.Clock() cap = cv2.VideoCapture(0) detector = cv2.QRCodeDetector() -A_id = gen_id() -B_id = gen_id() +session_id = gen_id() -qrA = qrB = None -decoded_text = "" -last = 0 +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 and e.key == pygame.K_ESCAPE: - running = False + if e.type == pygame.KEYDOWN: + if e.key == pygame.K_ESCAPE: + running = False - now = time.time() - - if now - last >= 1: - last = now - qrA = make_qr(f"A:{A_id}|T:{int(now)}", qr_size) - qrB = make_qr(f"B:{B_id}|T:{int(now)}", qr_size) + if e.key == pygame.K_RETURN: + msg = input("msg: ") + seq += 1 ret, frame = cap.read() if ret: - data, points, _ = detector.detectAndDecode(frame) - if data: - decoded_text = data + data, _, _ = detector.detectAndDecode(frame) - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - frame = cv2.resize(frame, (w//2, h)) - frame_surface = pygame.surfarray.make_surface(frame.swapaxes(0,1)) + 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 qrA: - screen.blit(qrA, (w//4 - qr_size//2, 0)) - if qrB: - screen.blit(qrB, (w//4 - qr_size//2, h//2)) - - if ret: - screen.blit(frame_surface, (w//2, 0)) + if qr: + screen.blit(qr, (w//4 - qr_size//2, h//4)) font = pygame.font.SysFont(None, 36) - screen.blit(font.render(decoded_text, True, (0,255,0)), (w//2 + 20, 20)) + + 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() - clock.tick(30) + pygame.time.Clock().tick(30) cap.release() pygame.quit() \ No newline at end of file