2017-02-01 5 views
0

Ich versuche, ein Video aufzuzeichnen, mit der Python-Himbeer-Kameramodul und dann konvertieren jedes Bild zu einem OpenCV Rahmen ohne Erfolg konvertieren:Wie picamera Video-Frame zu OpenCV Objekt

import time 
import picamera 
import cv2 
import numpy as np 

class BroadcastOutput(object): 
    def __init__(self, camera): 
     return 


    def write(self, b): 

     #create numpy array from b 
     data = np.fromstring(b, dtype=np.uint8) 

     #doesn't work with reshape either 
     #data = np.fromstring(b, dtype=np.uint8).reshape(320, 280, 3) 

     #enconde as image 
     image = cv2.imdecode(data, 1) 

     #test if is valid cv2 object -> fails 
     cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 


    def flush(self): 
     print('Waiting for background conversion process to exit') 

    #camera setup and start 
    with picamera.PiCamera() as camera: 
     camera.resolution = (320, 280) 
     camera.framerate = 24 
     time.sleep(2) # camera warm-up time 

     print('Initializing broadcast thread') 
     output = BroadcastOutput(camera) 
     print('Starting recording') 
     camera.start_recording(output, 'bgr') 

     try: 
      while True: 
       camera.wait_recording(1) 

     except KeyboardInterrupt: 
      pass 
     finally: 
      print('Stopping recording') 
      camera.stop_recording() 

Wenn ich drucken mein numpy array hat inhalt, das bildobjekt nach decode ist aber immer none.

Also meine Frage: Wie nutze ich die bereitgestellten Daten in b als cv2-Frame richtig? Ich bin noch neu in der Bildverarbeitung ... Danke für jede Hilfe im Voraus!

+1

Was ist der Punkt, um 'Daten' und' Bild' von 'b' zu erhalten, wenn Sie sie dann ignorieren und' b' in 'cvtColor' verwenden? Eigentlich scheint der 'imdecode' ein wenig sinnlos zu sein, wenn man bedenkt, dass man die Daten in eine 3-Kanal-Matrix umformt. Dieses ganze Snippet sieht eher komisch aus ... –

+0

du hast vollkommen recht ... langer tag;) ich habe versucht mein sniped zu verdeutlichen und ein komplettes und brauchbares beispiel zur verfügung gestellt –

+1

Was ist die Länge von 'b' wenn' write' aufgerufen wird? Ich bin mir nicht sicher, dass es garantiert ist, dass man pro Frame "schreiben" kann. Die in der Bibliothek bereitgestellten Convenience Wrapper scheinen die Konvertierung in 'flush' durchzuführen. | Wenn Sie sich die ['bytes_to_rgb'-Funktion] (http://picamera.readthedocs.io/en/release-1.8/_modules/picamera/array.html) ansehen, scheint der' np.fromstring'-Ansatz in der rechten zu sein Richtung, vorausgesetzt, Sie haben den ganzen Rahmen zur Verfügung. –

Antwort

2

Siehe Dokumentation der Klasse PiRGBAnalysis.

+1

Wie erwähnt, empfängt der Schreib-Callback nicht den ganzen Frame, aber PiRGBAnalysis ist! Also danke für den Hinweis, alles funktioniert jetzt. Siehe http://raspberrypi.stackexchange.com/questions/32926/convert-the-frame-data-from-recording-into-a-numpy-array für ein funktionierendes Beispiel der Klasse –

+0

Es ist großartig, dass Sie eine funktionierende gefunden haben Beispielcode und teilte den Link hier. – fireant

Verwandte Themen