因此,对于我的代码,我正在分析在我的值的阈值内的像素总数。然而,它非常慢,而且这一切都归结为一行代码,基本上是整个程序的瓶颈。这段代码很简单,因为它将数组拆分为值,以便我可以计算长度,但是,它将每秒帧数从30帧降低到大约4帧。
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讨厌循环),但我真的不知道如何修改数组。实现这一点的"pythonic"方法是什么?
我不想要图片本身的大小,也不想要总共有多少张像素。只有在阈值内的像素。
cv2.inRange
已经这样做了,所以不需要集合推导式:
调用
cv2.inRange
后,返回一个二进制掩码,其中白色像素(255)表示落入上限和下限的像素范围和黑色像素(0)没有。
从二进制掩码中,在范围内的值可以用:
thresh = cv2.inRange(data, lower, upper)
within_threshold = (thresh == 255).sum()
为了得到像素本身,你可以索引原始的data
在范围内的二进制掩码:
data = data[thresh == 255]