【问题标题】:Python 2.7, finding length of numpy.ndarrayPython 2.7,查找 numpy.ndarray 的长度
【发布时间】:2016-12-20 04:33:02
【问题描述】:

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

【问题讨论】:

  • 长度到底是什么意思?在我看来,您正在尝试查找数组中唯一行的数量,准确吗?
  • 是的,这是正确的。
  • 我想要任何显示出来的东西,但这种方法似乎有效。如果我能得到一个很棒的单个像素,但现在我只是在使用有效的方法。
  • 嗯。我对库不熟悉,但如果hresh= cv2.inRange(data, lower, upper) 是一个数组,其中的值来自data,并且在您的范围内,那么您应该可以只使用hresh.shape,不是吗?我仍然不明白为什么它们需要是独一无二的。
  • 对不起,np.unique(thresh).size

标签: python arrays python-2.7 opencv numpy


【解决方案1】:

我不想要图片本身的大小,也不想要总共有多少 像素。只是在阈值内的像素。

cv2.inRange 已经这样做了,所以不需要 集合理解

调用cv2.inRange后,返回一个二进制掩码,其中白色 像素(255)表示落入上下限的像素 范围和黑色像素 (0) 没有。

从二进制掩码中,in-range 值可以用以下方式计算:

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

要获取像素本身,您可以在 in-range 二进制掩码上索引原始 data

data = data[thresh == 255]

【讨论】:

  • 就是这样。但很好奇,为什么它会起作用? 255 本身是什么意思?
  • cv2.inRange 在每个像素处返回值 255 或 0。 255 表示处于阈值内的值。
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 2012-05-29
  • 1970-01-01
  • 2015-02-07
  • 2013-04-11
  • 2015-02-15
  • 2019-03-28
  • 2012-09-06
相关资源
最近更新 更多