Update qr.py

This commit is contained in:
2026-06-10 19:44:16 +02:00
parent e988d944a4
commit 23a43254d4
+71 -33
View File
@@ -1,17 +1,18 @@
import pygame import pygame
import qrcode import qrcode
import cv2
import json
import base64
import time
import random import random
import string import string
import time
import cv2
from io import BytesIO from io import BytesIO
import numpy as np
def gen_id(): 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): 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.add_data(data)
qr.make(fit=True) qr.make(fit=True)
img = qr.make_image(fill="black", back_color="white").convert("RGB") img = qr.make_image(fill="black", back_color="white").convert("RGB")
@@ -21,63 +22,100 @@ def make_qr(data, size):
buf.seek(0) buf.seek(0)
return pygame.image.load(buf) 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() pygame.init()
screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN) screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
w, h = screen.get_size() w, h = screen.get_size()
clock = pygame.time.Clock()
cap = cv2.VideoCapture(0) cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector() detector = cv2.QRCodeDetector()
A_id = gen_id() session_id = gen_id()
B_id = gen_id()
qrA = qrB = None seq = 0
decoded_text = "" msg = ""
last = 0
qr = None
last_decode = []
stable = ""
last_seq = -1
qr_size = h // 2 qr_size = h // 2
running = True running = True
while running: while running:
for e in pygame.event.get(): for e in pygame.event.get():
if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: if e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
running = False running = False
now = time.time() if e.key == pygame.K_RETURN:
msg = input("msg: ")
if now - last >= 1: seq += 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)
ret, frame = cap.read() ret, frame = cap.read()
if ret: if ret:
data, points, _ = detector.detectAndDecode(frame) data, _, _ = detector.detectAndDecode(frame)
if data:
decoded_text = data
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) if data:
frame = cv2.resize(frame, (w//2, h)) try:
frame_surface = pygame.surfarray.make_surface(frame.swapaxes(0,1)) 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)) screen.fill((0,0,0))
if qrA: if qr:
screen.blit(qrA, (w//4 - qr_size//2, 0)) screen.blit(qr, (w//4 - qr_size//2, h//4))
if qrB:
screen.blit(qrB, (w//4 - qr_size//2, h//2))
if ret:
screen.blit(frame_surface, (w//2, 0))
font = pygame.font.SysFont(None, 36) 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() pygame.display.flip()
clock.tick(30) pygame.time.Clock().tick(30)
cap.release() cap.release()
pygame.quit() pygame.quit()