2017-02-01 2 views
0

Я пытаюсь записать видео с модулем питона малина камеры и затем преобразовать каждый кадр в кадре OpenCV без успеха:Как конвертировать picamera видеокадра объекта OpenCV

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() 

Когда я распечатать мой массив numpy имеет контент, объект изображения после декодирования, однако, всегда отсутствует.

Итак, мой вопрос: как правильно использовать предоставленные данные в b в качестве рамки cv2? Я все еще новичок в обработке изображений ... Спасибо за любую помощь заранее!

+1

В чем смысл получения 'data' и' image' из 'b', когда вы игнорируете их и используете' b' в 'cvtColor'? Фактически, 'imdecode' кажется немного бессмысленным, учитывая, что вы переформатируете данные в 3-канальную матрицу. Весь этот фрагмент выглядит довольно странно .... –

+0

youare совершенно правы ... длинный день;) Я попытался прояснить свои обрезки и предоставил полный и полезный пример –

+1

. Какова длина 'b', когда вызывается' write'? Я не уверен, что вам гарантировано, что вы получите один «писать» за кадр. Обложки удобства, представленные в библиотеке, похоже, делают преобразование в 'flush'. | Если вы посмотрите на функцию '' bytes_to_rgb' (http://picamera.readthedocs.io/en/release-1.8/_modules/picamera/array.html), подход 'np.fromstring', кажется, находится в правильном направлении направление, предполагая, что у вас есть весь фрейм. –

ответ

2

См. Документацию класса PiRGBAnalysis.

+1

Как упоминалось, обратный вызов записи не получает полный кадр, но PiRGBAnalysis is! Так что спасибо за подсказку, все работает сейчас. Обратитесь к http://raspberrypi.stackexchange.com/questions/32926/convert-the-frame-data-from-recording-into-a-numpy-array для рабочего примера класса –

+0

Замечательно, что вы нашли работу пример кода и поделился ссылкой здесь. – fireant

Смежные вопросы