Raspberry pi visa olika bilder på två olika skärmar

Permalänk

Raspberry pi visa olika bilder på två olika skärmar

Hej,

Nu har jag försökt att få till detta men jag får inte till det.
Jag har en Raspberry pi 4 och har kopplat två skärmar till denna, har en webbkamera. Raspberry pi Os desktop, jag har själv försökt att skapa ett Python script som utför följande:
När jag trycker på space tangenten tar webkameran en bild och skall slumpvis visa denna bilden på någon av mina två skärmar. Tar jag en ny bild så skall den slumpvis visa bilden på någon av dessa två skärmar igen osv. Men jag får bara upp bilden på höger skärmen hela tiden. Jag har provat att få hjälp av chatgpt men det blir samma även när den gör skriptet. Så nu vänder jag mig hit om någon här vet vad problemet eller felet jag/vi gör.
Det senast Skriptet som då Chatgpt hjälpte mig med ser ut som följande:
import time
import random
import cv2
import numpy as np
import pygame
import multiprocessing as mp
import subprocess

def init_camera():
camera = cv2.VideoCapture(0)
if not camera.isOpened():
print("Kunde inte öppna kameran")
exit()
return camera

def capture_image(camera):
for _ in range(5): # Rensa bufferten
camera.grab()
ret, frame = camera.read()
if not ret:
print("Kunde inte läsa från kameran")
return None
return frame

def show_image(screen, image):
screen_width, screen_height = screen.get_size()
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
image_height, image_width = image.shape[:2]
scale_width = screen_width / image_width
scale_height = screen_height / image_height
scale = max(scale_width, scale_height)
new_width = int(image_width * scale)
new_height = int(image_height * scale)
image = cv2.resize(image, (new_width, new_height))
display_surface = pygame.Surface((screen_width, screen_height))
display_surface.fill((0, 0, 0))
display_surface.blit(pygame.surfarray.make_surface(image),
((screen_width - new_width) // 2,
(screen_height - new_height) // 2))
screen.blit(display_surface, (0, 0))
pygame.display.flip()

def move_window_to_screen(window_id, screen_index):
output = subprocess.check_output(['xrandr']).decode('utf-8')
screens = []
for line in output.splitlines():
if " connected " in line:
parts = line.split()
screens.append(parts[0])

if screen_index < len(screens):
screen_name = screens[screen_index]
screen_info = subprocess.check_output(['xrandr', '--verbose']).decode('utf-8')
resolution = None
for line in screen_info.splitlines():
if screen_name in line and 'connected' in line:
resolution = line.split()[2]
break

if resolution:
width, height = map(int, resolution.split('+')[0].split('x'))
subprocess.call(['wmctrl', '-i', '-r', str(window_id), '-e', f'0,{screen_index * width},0,-1,-1'])

def display_screen(screen_index, frame_queue):
pygame.init()
screen = pygame.display.set_mode((1280, 1024), pygame.NOFRAME)
pygame.display.set_caption(f'Camera Display {screen_index}')
pygame.display.set_mode((1280, 1024), pygame.NOFRAME)
pygame.display.set_caption(f'Camera Display {screen_index}')
window_id = pygame.display.get_wm_info()['window']
move_window_to_screen(window_id, screen_index)

while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
print("Väntar 3 sekunder...")
time.sleep(3)
if not frame_queue.empty():
frame = frame_queue.get()
show_image(screen, frame)
elif event.type == pygame.QUIT:
pygame.quit()
return

def main():
camera = init_camera()
frame_queue1 = mp.Queue()
frame_queue2 = mp.Queue()
p1 = mp.Process(target=display_screen, args=(0, frame_queue1))
p2 = mp.Process(target=display_screen, args=(1, frame_queue2))
p1.start()
p2.start()

try:
while True:
input("Tryck på Enter för att ta en bild...")
print("Väntar 3 sekunder...")
time.sleep(3)
frame = capture_image(camera)
if frame is not None:
random_queue = random.choice([frame_queue1, frame_queue2])
random_queue.put(frame)
print("Bild tagen och skickad till skärmen.")
except KeyboardInterrupt:
pass
finally:
camera.release()
p1.terminate()
p2.terminate()
pygame.quit()

if __name__ == "__main__":
main()