2016-08-13 3 views
2

Итак, с моим кодом я анализирую общее количество пикселей, находящихся в пределах пороговых значений. Тем не менее, это очень медленно, и все это сводится к одной строке кода, в основном, бутылочной сушке всей программы. Этот код просто, что она разбивает массив вверх в значение, так что я могу рассчитывать длину, однако, она приносит кадры в секунду вниз от 30 до 4.Python 2.7, нахождение длины numpy.ndarray

import cv2 
import numpy as np 
import time 
from picamera.array import PiRGBArray 
from picamera import PiCamera 
import RPi.GPIO as GPIO 
from PIL import Image 


camera = PiCamera() 
camera.resolution = (320,240) 
rawCapture= PiRGBArray(camera) 


for frame in camera.capture_continuous(rawCapture, format='bgr', use_video_port=True): 
    data= frame.array 

    lower=np.array([100, %0, 50], dtype='uint8') 
    upper= np.array([250, 150, 150], dtype="uint8") 

    thresh= cv2.inRange(data, lower, upper) 
    data={tuple(item) for item in thresh} # this is the problem line. 
    len(data) 

    rawCapture.truncate(0) 
    FPS=FPS+1 
    New_time=time.time()-start 
    if New_time> 10: 
     print FPS/10, 'fps' 
     New_time=0 
     start=time.time() 
     FPS=0 

Я чувствую, что половина проблем заключается в том, что это цикл (python ненавидит циклы), но я не знаю, как изменить массивы. Что такое «питонический» способ достижения этого?

+0

Что именно вы подразумеваете под длиной? Мне кажется, что вы пытаетесь найти количество уникальных строк в своем массиве, это точно? –

+0

да это правильно. –

+0

Я хотел получить только что-нибудь, что показалось, но этот метод работает. Если бы я мог получить индивидуальный пиксель, который был бы блестящим, но прямо сейчас я просто использую то, что работает. –

ответ

1

Я не хочу, чтобы размер изображения сам, и сколько всего пикселей. Только пиксели, находящиеся в пределах порога.

cv2.inRange уже делает это, поэтому набор понимание не потребуется:

После вызова cv2.inRange, двоичная маска возвращается, где белые пикселей (255) представляют собой пиксели, которые попадают в верхний и нижний предел диапазон и черные пиксели (0) нет.

Из двоичной маски, то в зоне значения могут быть подсчитаны с:

thresh = cv2.inRange(data, lower, upper) 
within_threshold = (thresh == 255).sum() 

Чтобы получить пиксели сами, вы можете индексировать оригинальный data на в зоне бинарная маска:

data = data[thresh == 255] 
+0

Вот и все. Но любопытно, почему это работает? что же значит 255? –

+0

'cv2.inRange' возвращает значения 255 или 0 на каждом пикселе. 255 указывает значения, которые находятся в пороговом значении. –

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