2015-01-05 5 views
0
import time 
import picamera 
import picamera.array 
import numpy as np 
import cv2 

clahe = cv2.createCLAHE(clipLimit= 8, tileGridSize=(4,4)) 

with picamera.PiCamera() as camera: 
with picamera.array.PiRGBArray(camera) as stream: 
    camera.resolution = (320,240) 

    while True: 
     camera.capture(stream,'bgr',use_video_port=True) 
     med1 = cv2.medianBlur(stream.array,5) 
     med3 =clahe.apply(med1) 
     img1=med3 
     height, width = med3.shape 
     for i in range(0,height): 
      for j in range(0,width): 
       if ((img1[i, j] >= [75,75,75]).all() and (img1[i, j] <[110,110,110]).all()): 
        med3[i,j]= med3[i,j]-8 
       elif((img1[i, j] >= [125,125,125]).all() and (img1[i, [140,140,140]).all()): 
        med3[i,j]= med3[i,j]+2 
     cv2.imshow('img.jpg',med3) 
     cv2.waitKey(100) 
     if cv2.waitKey(1) & 0xFF == ord('a'): 
      cv2.imwrite('2015_01_05_43.jpg',med2) 
      cv2.imwrite('2015_01_05_44.jpg',med3) 

     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 
     stream.seek(0) 
     stream.truncate() 

Я пытался манипулировать некоторыми пикселями в видео для каждого кадра. Процесс работает. Но выход слишком медленный. Я знаю, что это происходит, потому что он должен сканировать все пиксели для каждого кадра. Может ли кто-нибудь помочь в выполнении одного и того же процесса быстрее. Есть ли другие решения для решения проблемы.Как ускорить обработку видео: python

+0

1. Try разгон Pi; 2. Попробуйте прочитать/открыть поток камеры, используя OpenCv вместо picamera. 3. Посмотрите, можно ли заменить вложенный цикл 'for' на операцию с предварительно построенной, оптимизированной матрицей (например,). – Ryan

ответ

0

Кажется, что ваш первый выбор должен использовать тот факт, что он является массивом numpy и использует способности sclection и трансляции Numpy вместо повторения через пиксели. Это будет делать практически то же самое, но на уровне кода numpy, который оптимизирован для этих вещей. Например петля с первым условием может быть заменена только:

img1[(img1 >= [75,75,75]) & (img1 <= [110,110,110])] -= 8 
+0

эта линия кажется отличной. но когда я использую, он нажимает ошибку «операнды не могут быть переданы togather с формами [240,320] (3). –

+0

Я не знаю точно, не отлаживая это сам с фактическим объектом. Но в основном он жалуется на структуру img1 (его форма) и структура [75,75,75]. Вы можете попробовать, например, сравнить его только с 75 и 110. Для других опций читайте больше о многократном широковещании. – itai

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