Capturando video con raspberry usando opencv + picamera stream IO

Estoy usando la raspberry para mostrar simplemente un video (solo esto por ahora). Para hacer esto tengo que usar opencv (cv2). Intenté muchas soluciones, pero ahora quiero capturar el video utilizando la biblioteca Picamera. Te mostraré mi código:

import io import time import picamera import cv2 import numpy as np # Create the in-memory stream stream = io.BytesIO() with picamera.PiCamera() as camera: while True: camera.capture(stream, format='jpeg') # Construct a numpy array from the stream data = np.fromstring(stream.getvalue(), dtype=np.uint8) # "Decode" the image from the array, preserving colour image = cv2.imdecode(data, 1) cv2.imshow('frame', image) 

Es muy simple como puedes ver, pero no funciona. En realidad no se abre la ventana. Me gustaría reproducir el comportamiento del siguiente, que funciona perfectamente:

 #import numpy as np import cv2 cap = cv2.VideoCapture(0) while(True): # Capture frame-by-frame ret, frame = cap.read() cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything done, release the capture cap.release() cv2.destroyAllWindows() 

Alguna idea ?

Echa un vistazo a esta publicación del blog . Tiene el código para que funcione:

 # import the necessary packages from picamera.array import PiRGBArray from picamera import PiCamera import time import cv2 # initialize the camera and grab a reference to the raw camera capture camera = PiCamera() rawCapture = PiRGBArray(camera) # allow the camera to warmup time.sleep(0.1) # grab an image from the camera camera.capture(rawCapture, format="bgr") image = rawCapture.array # display the image on screen and wait for a keypress cv2.imshow("Image", image) cv2.waitKey(0) 

Un poco más abajo hay un ejemplo con la captura de imágenes continuamente.

 # import the necessary packages from picamera.array import PiRGBArray from picamera import PiCamera import time import cv2 # initialize the camera and grab a reference to the raw camera capture camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 32 rawCapture = PiRGBArray(camera, size=(640, 480)) # allow the camera to warmup time.sleep(0.1) # capture frames from the camera for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): # grab the raw NumPy array representing the image, then initialize the timestamp # and occupied/unoccupied text image = frame.array # show the frame cv2.imshow("Frame", image) key = cv2.waitKey(1) & 0xFF # clear the stream in preparation for the next frame rawCapture.truncate(0) # if the `q` key was pressed, break from the loop if key == ord("q"): break 

tratar:

 sudo modprobe bcm2835-v4l2 

para asegurarse de que tiene el video para los controladores de Linux

Estaba teniendo un problema similar en el que la salida de la cámara funcionaba, pero el flujo de video siempre era negro. Resulta que se trata de una versión en picamera. Instalar 1.10 funcionó para mí sin ninguna otra desviación del código de demostración:

 pip install 'picamera[array]'== 1.10 

Primero, cv2.waitKey () debe agregarse a la siguiente línea de cv2.imshow (‘marco’, imagen). Entonces, stream.seek (0); stream.truncate (); debe agregarse al final del bucle, de lo contrario la imagen no cambiará.