我正在编写一个用于图像跟踪的 Python 程序,我在其中接收最小值和最大值的输入 BGR 值,然后过滤实时视频源以仅显示最小值和最大值之间的值。当输入为 BGR 时,我需要使用 HSV 过滤视频。但是,我无法弄清楚如何将我的单个 BGR 输入数组转换为 numpy 中的 HSV 数组,而不必在整个图像上使用 cvtColor 函数。
根据我的理解,cv2.cvtColor() 函数似乎只适用于整个图像,但在我进行颜色跟踪之前,我需要能够将这些选择的最小和最大 BGR 数组转换为 HSV。
每当我运行这段代码时,我都会从 cvtColor 函数调用的 OpenCV 代码中得到以下错误。
OpenCV Error: Assertion failed (depth == CV_8U || depth == CV_16U || depth == CV_32F) in cv::cvtColor, file D:\Build\OpenCV\opencv-3.2.0\modules\imgproc\src\color.cpp, line 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)
最佳答案
默认情况下,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'
您可能想要创建 uint8
或 uint16
数组。
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'))
关于python - 如何使用 OpenCV 在 Python 中将单个 BGR 数组转换为 HSV 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42319621/