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

标签 python opencv numpy

我正在编写一个用于图像跟踪的 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'

您可能想要创建 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'))

关于python - 如何使用 OpenCV 在 Python 中将单个 BGR 数组转换为 HSV 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42319621/

相关文章:

python - 预处理脚本不删除标点符号

python - 模式 avro 在时间戳中,但在 bigquery 中作为整数

opencv - 如何得到YOLOv5模型的预测图像?

c++ - 使用 OpenCV 以 JPG 格式编码图像以避免重影效果

python - 字符串格式化,从右而不是左修剪

python - 解析 numpy 数组的字符串表示

python - np.vectorize 在二维 numpy 数组作为输入上失败

python - 如何将数字 numpy 数组更改为 char 数组?

python - Python c 扩展中的 null 常量

python - openCV cvtColor 函数错误 : Assertion failed (scn == 3 || scn == 4)