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()