I´m working on a project including brickpi and i would like to have a live video feed from a camera on my robot. I tried using pygame because i already used it for the controls, but if i try to start the camera, I get the following error:
SystemError: ioctl(VIDIOC_S_FMT) failure: no supported formats
I already looked for ways to solve this but none would work.
Here is my code:
#Kompatibilität von python3 und python2
from __future__ import print_function
from __future__ import division
#Importieren der gebrauchten Bibliotheken
import os
import sys
import time
import pygame
import pygame.camera
from pygame.locals import *
import brickpi3
pygame.init() #the error is here
pygame.camera.init()
#brickpi Instanz
BP = brickpi3.BrickPi3()
#Setzen von Variablen
größe = (800,600)
FPS = 60
vorwärts = 0
rückwärts = 0
links = 0
rechts = 0
arm_auf = 0
arm_zu = 0
#Neues Fenster öffnen
fenster = pygame.display.set_mode((größe))
pygame.display.set_caption("Steuerung")
clock = pygame.time.Clock()
#Kamera
cam = pygame.camera.Camera(pygame.camera.list_cameras()[0])
cam.start()
#Hauptprogramm
steuerungaktiv = True
while steuerungaktiv:
#Variable zum Beenden ohne error
keinerror = True
#Überprüfen auf Aktion
for event in pygame.event.get():
#überprüfen auf beenden des Programms
if event.type == QUIT:
steuerungaktiv = False
keinerror = False
kamera.stop()
pygame.quit()
#Steuerung
if event.type == KEYDOWN:
if event.key == K_UP:
vorwärts = 25
elif event.key == K_DOWN:
rückwärts = -25
elif event.key == K_LEFT:
links = 25
elif event.key == K_RIGHT:
rechts = 25
elif event.key == K_RETURN:
arm_zu = -5
elif event.key == K_BACKSPACE:
arm_auf = 5
#Möglichkeit zum beenden über Escape
elif event.key == K_ESCAPE:
steuerungaktiv = False
keinerror = False
kamera.stop()
pygame.quit()
if event.type == KEYUP:
if event.key == K_UP:
vorwärts = 0
elif event.key == K_DOWN:
rückwärts = 0
elif event.key == K_LEFT:
links = 0
elif event.key == K_RIGHT:
rechts = 0
elif event.key == K_RETURN:
arm_zu = 0
elif event.key == K_BACKSPACE:
arm_auf = 0
#Aktionen des Roboters
if keinerror == True:
if vorwärts != 0:
BP.set_motor_power(BP.PORT_A + BP.PORT_B, vorwärts)
elif rückwärts != 0:
BP.set_motor_power(BP.PORT_A + BP.PORT_B, rückwärts)
elif rechts != 0:
BP.set_motor_power(BP.PORT_A, rechts)
elif links != 0:
BP.set_motor_power(BP.PORT_B, links)
elif arm_auf != 0:
BP.set_motor_power(BP.PORT_C, arm_auf)
elif arm_zu != 0:
BP.set_motor_power(BP.PORT_C, arm_zu)
else:
BP.set_motor_power(BP.PORT_A + BP.PORT_B + BP.PORT_C, 0)
#aktualisieren des Fensters
if keinerror == True:
snapshot = cam.get_image()
snapshot = pygame.transform.scale(snapshot,(größe))
fenster.blit(snapshot)
pygame.display.update()
clock.tick(FPS)
#Reduzieren der cpu auslastung
time.sleep(0.02)
#Abschalten der Motoren
BP.reset_all()
Does someone have an idea how to solve this?