我正在编写一个用于图像跟踪的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)
答案 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'
您可能想要创建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'))