如何使用OpenCV将单个BGR数组转换为Python中的HSV数组?

时间:2017-02-18 19:19:31

标签: python opencv numpy

我正在编写一个用于图像跟踪的Python程序,其中我接收最小值和最大值的输入BGR值,然后过滤实时视频源以仅显示这些最小值和最大值之间的值。当输入在BGR中时,我需要使用HSV过滤视频。但是,我无法弄清楚如何将我的单个BGR输入数组转换为numpy中的HSV数组,而无需在整个图像上使用cvtColor函数。

根据我的理解,似乎cv2.cvtColor()函数只能在整个图像上工作,但我需要能够在进行颜色跟踪之前将这些选择的最小和最大BGR数组转换为HSV。 / p>

每当我运行此代码时,我从cvtColor函数调用的OpenCV代码中得到以下错误。

  

OpenCV错误:cv :: cvtColor中的断言失败(深度== CV_8U ||深度== CV_16U ||深度== CV_32F),文件D:\ Build \ OpenCV \ opencv-3.2.0 \ modules \ imgproc \ src \ color.cpp,第9710行

我尝试过使用BGR阵列,但是我特别需要在这里使用HSV。

解决此问题的最简洁方法是什么?如果我能提供更多信息,请告诉我,谢谢。我还是Python的新手。

minBGR = np.array([minB, minG, minR])
maxBGR = np.array([maxB, maxG, maxR])

minHSV = cv2.cvtColor(minBGR, cv2.COLOR_BGR2HSV)
maxHSV = cv2.cvtColor(maxBGR, cv2.COLOR_BGR2HSV)

mask = cv2.inRange(hsvFrame, minHSV, maxHSV)

1 个答案:

答案 0 :(得分:2)

默认情况下,numpy会创建具有保存它们所需的最小类型的数组。

我的64位系统,从0到255范围内的值创建数组会创建int64数组。

In [1]: import numpy as np

In [2]: np.array([0,0,0])
Out[2]: array([0, 0, 0])

In [3]: a = np.array([0,0,0])

In [4]: a.dtype
Out[4]: dtype('int64')

In [5]: a = np.array([255,255,255])

In [6]: a.dtype
Out[6]: dtype('int64')

这是一个8字节的整数:

In [20]: dt = np.dtype('>i8')

In [21]: dt.itemsize
Out[21]: 8

In [22]: dt.name
Out[22]: 'int64'

您可能想要创建uint8uint16数组。

In [7]: a = np.array([0,0,0], dtype=np.uint8)

In [8]: b = np.array([255,255,255], dtype=np.uint8)

In [9]: a.dtype, b.dtype
Out[9]: (dtype('uint8'), dtype('uint8'))