2017-02-18 73 views
1

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

根据我的理解,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) 

回答

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')) 
相关问题