Python 2.7,查找numpy.ndarray的长度

Python 2.7,查找numpy.ndarray的长度,python,arrays,python-2.7,opencv,numpy,Python,Arrays,Python 2.7,Opencv,Numpy,因此,在我的代码中,我正在分析在我的阈值内的像素总数。然而,它的速度非常慢,而且全部归结为一行代码,基本上是整个程序的瓶颈。这段代码很简单,因为它将数组拆分为多个值,这样我就可以计算长度,但是,它将每秒帧数从30降到了大约4 import cv2 import numpy as np import time from picamera.array import PiRGBArray from picamera import PiCamera import RPi.GPIO as GPIO fro

因此,在我的代码中,我正在分析在我的阈值内的像素总数。然而,它的速度非常慢,而且全部归结为一行代码,基本上是整个程序的瓶颈。这段代码很简单,因为它将数组拆分为多个值,这样我就可以计算长度,但是,它将每秒帧数从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[thresh == 255]

你说的长度到底是什么意思?在我看来,您正在尝试查找数组中唯一行的数量,这是否准确?是的,这是正确的。我只需要显示的任何内容,但此方法似乎有效。如果我能得到单独的像素,那将是辉煌的,但现在我只是使用正在工作的。我不熟悉这个库,但是如果
hresh=cv2.inRange(data,lower,upper)
是一个数组,其中包含
data
中的值,并且这些值在您的范围内,那么您应该可以只使用
hresh.shape
,不是吗?我仍然不明白为什么它们需要是唯一的。对不起,
np.unique(thresh)。size
就是这样。但奇怪的是,为什么它会起作用?255本身意味着什么?
cv2.inRange
在每个像素处返回值255或0。255表示阈值中的值。