Update qr.py
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user