Python 2.7,查找numpy.ndarray的长度
因此,在我的代码中,我正在分析在我的阈值内的像素总数。然而,它的速度非常慢,而且全部归结为一行代码,基本上是整个程序的瓶颈。这段代码很简单,因为它将数组拆分为多个值,这样我就可以计算长度,但是,它将每秒帧数从30降到了大约4Python 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
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表示阈值中的值。