Python VIBGYOR颜色的HSV颜色范围

Python VIBGYOR颜色的HSV颜色范围,python,opencv,hsv,Python,Opencv,Hsv,我正在开发一个应用程序,可以检测框架中的主要颜色。我使用python代码和HSV颜色范围来实现这一点。我检测蓝色的示例代码如下 import cv2 def detectBlue(frame): # Convert BGR to HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of green color in HSV lower_blue =

我正在开发一个应用程序,可以检测框架中的主要颜色。我使用python代码和HSV颜色范围来实现这一点。我检测蓝色的示例代码如下

import cv2    
def detectBlue(frame):
        # Convert BGR to HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # define range of green color in HSV
        lower_blue = np.array([101, 39, 64])
        upper_blue = np.array([140, 255, 255])
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
        kernel = np.ones((5,5),'int')
        dilated = cv2.dilate(mask,kernel)
        # Bitwise-AND mask and original image
        res = cv2.bitwise_and(frame,frame, mask=mask)
        ret,thrshed = cv2.threshold(cv2.cvtColor(res,cv2.COLOR_BGR2GRAY),3,255,cv2.THRESH_BINARY)
        #img,contours,hier = cv2.findContours(thrshed,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
        contours,hier = cv2.findContours(thrshed,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
        area = [0]
        for cnt in contours:
            #Contour area is taken
            area.append(cv2.contourArea(cnt))
        return max(area)
Green:
lower_green = [65,60,60])
upper_green = [80,255,255]

Red:
lower_red = [170,120,70] 
upper_red = [180,255,255]
我为HSV颜色范围的红色和绿色创建了类似的函数,如下所示

import cv2    
def detectBlue(frame):
        # Convert BGR to HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # define range of green color in HSV
        lower_blue = np.array([101, 39, 64])
        upper_blue = np.array([140, 255, 255])
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
        kernel = np.ones((5,5),'int')
        dilated = cv2.dilate(mask,kernel)
        # Bitwise-AND mask and original image
        res = cv2.bitwise_and(frame,frame, mask=mask)
        ret,thrshed = cv2.threshold(cv2.cvtColor(res,cv2.COLOR_BGR2GRAY),3,255,cv2.THRESH_BINARY)
        #img,contours,hier = cv2.findContours(thrshed,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
        contours,hier = cv2.findContours(thrshed,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
        area = [0]
        for cnt in contours:
            #Contour area is taken
            area.append(cv2.contourArea(cnt))
        return max(area)
Green:
lower_green = [65,60,60])
upper_green = [80,255,255]

Red:
lower_red = [170,120,70] 
upper_red = [180,255,255]
现在我正在尝试对所有VIBGYOR颜色执行相同的操作,但我没有为所有这些颜色获得适当的颜色范围。 我尝试使用这个python代码将RGB代码转换为HSV

import colorsys

def rgb_hsv_converter(rgb):
    (r,g,b) = rgb_normalizer(rgb)
    hsv = colorsys.rgb_to_hsv(r,g,b)
    (h,s,v) = hsv_normalizer(hsv)
    upper_band = [h+10, s+40, v+40]
    lower_band = [h-10, s-40, v-40]
    return {
        'upper_band': upper_band,
        'lower_band': lower_band
    }

def rgb_normalizer(rgb):
    (r,g,b) = rgb
    return (r/255, g/255, b/255)

def hsv_normalizer(hsv):
    (h,s,v) = hsv
    return (h*360, s*255, v*255)

rgb_hsv_converter((255,255,255))
但是,这些量程在测试时不能正常工作。我搜索了很多,以找出所有这些颜色的最佳HSV范围,但没有用。
有人能提出任何方法来为许多颜色找到最佳和更精确的颜色范围吗?

你可以选择一种纯红色,RGB 255,0,0,将其转换为HSV,得到的色调约为0-0将是红色的中心值。对要在HSV空间中定义的其余颜色执行相同操作。绿色是55左右,蓝色是120左右,依此类推