Files
2026-06-10 19:56:28 +02:00

96 lines
2.2 KiB
Python

import pygame
import qrcode
import cv2
import json
import base64
import time
import random
import string
from io import BytesIO
def make_qr(data, size):
qr = qrcode.QRCode(box_size=6, 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 chunk_string(s, n):
return [s[i:i+n] for i in range(0, len(s), n)]
pygame.init()
screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
w, h = screen.get_size()
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
qr_size = h // 2
clock = pygame.time.Clock()
# STREAM STATE (geen chat, geen protocol)
counter = 0
rx_buffer = ""
tx_qr = None
last_frame = 0
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE:
running = False
# ===== TRANSMIT STREAM =====
now = time.time()
if now - last_frame > 0.5: # stream rate
last_frame = now
payload = {
"d": str(counter)
}
counter += 1
tx_qr = make_qr(json.dumps(payload), qr_size)
# ===== RECEIVE STREAM =====
ret, frame = cap.read()
if ret:
data, _, _ = detector.detectAndDecode(frame)
if data:
try:
obj = json.loads(data)
if "d" in obj:
rx_buffer = (rx_buffer + obj["d"])[-200:]
except:
pass
# ===== RENDER =====
screen.fill((0,0,0))
if tx_qr:
screen.blit(tx_qr, (w//4 - qr_size//2, h//4))
if ret:
cam = cv2.cvtColor(cv2.flip(frame,1), cv2.COLOR_BGR2RGB)
cam = pygame.surfarray.make_surface(cam.swapaxes(0,1))
screen.blit(pygame.transform.scale(cam, (w//2, h)), (w//2,0))
font = pygame.font.SysFont(None, 40)
screen.blit(font.render("STREAM OUT: " + str(counter), True, (255,255,0)), (20,20))
screen.blit(font.render("STREAM IN BUFFER: " + rx_buffer[-30:], True, (0,255,0)), (20,80))
pygame.display.flip()
clock.tick(30)
cap.release()
pygame.quit()