2016-01-15 2 views
-1

Мне нужно читать кадры из видео параллельно с многопроцессорной обработкой & очередей с использованием opencv в Python, и я получаю сообщение об ошибке с моим кодом. Это мой код, и я не знаю, где моя проблема.чтение видеокадров параллельно с opencv и Python

#! /usr/bin/python 
import numpy as np 
import cv2 
import multiprocessing as mp 
import time 

def read_frames(q1,q2): 
     while True : 
       frame = q1.get() 
       if frame=='Done': 
         break 
       R=frame[:,:,0] 
       G=frame[:,:,1] 
       B=frame[:,:,2] 
       y = (np.uint8)((0.299 * R)+ (0.587 *G) +(0.114 *B)) 
       q2.put(y) 

if __name__ == '__main__': 
     q1 = mp.Queue() 
     q2 = mp.Queue() 
     processes =[mp.Process(target=read_frames, args= (q1,q2)) for i in rang$ 
     for p in processes: 
         p.start() 

     # feed the processes 
     # read input file and send to the processes the frames: 
     cap = cv2.VideoCapture('gou.avi') 
     lines = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 
     cols = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 
     fps = int(cap.get(cv2.CAP_PROP_FPS)) 
     fourcc_ver = int(cap.get(cv2.CAP_PROP_FOURCC)) 
     out = cv2.VideoWriter('output.avi',fourcc_ver, fps, (cols,lines),False) 
     # y = np.empty(shape=(lines,cols),dtype=np.uint8) 
     while(cap.isOpened()): 
       ret, frame = cap.read() 
       # as long as new frames are there 
       if ret==True: 
         q1.put(frame) 
         if cv2.waitKey(1) & 0xFF == ord('q'): 
             break 
       else: 
        break 
     q1.put('Done') 



     for p in processes: 
         p.join() 
     for p in processes: 
       result=[q2.get()] 
#  result.sort() 
#  results = [r[1] for r in results] 
     for i in result: 
       out.write(i) 
     # Release everything if job is finished 
     cap.release() 
     out.release() 
     cv2.destroyAllWindows() 
+0

с этим «y» я конвертирую видео из rgb в черно-белое – iyal

+0

Если вы получаете сообщение об ошибке, отправьте его, чтобы другие могли его использовать, чтобы помочь вам диагностировать ваш код. – Palpatim

+0

Вам нужно быть намного понятнее, объясняя, в чем проблема, как минимум, вам нужно объяснить полученную ошибку и то, что вы уже пытались решить. Я настоятельно рекомендую прочитать [как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask), а затем изменить свой вопрос, чтобы улучшить его, если вы хотите получить хорошие ответы. – DaveyDaveDave

ответ

-1

Что вы можете сделать, это добавить все кадры к списку [], а затем использовать ссылки списка, такие как кадр = список [], а затем обратиться кадров по месту расположения в списке: кадр [0] или кадр [ 1: 4]

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