2017-02-18 95 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'))