使用InRangeS为OpenCV阈值select正确的HSV值

我有一个咖啡jar的形象,我想find一个橙色的盖子位置。 就这个 图片

gcolor2实用程序显示盖子中心的HSV为(22,59,100)。 问题是如何select颜色的限制呢? 我尝试了min =(18,40,90)和max =(27,255,255),但意想不到 结果

这里是Python代码:

import cv in_image = 'kaffee.png' out_image = 'kaffee_out.png' out_image_thr = 'kaffee_thr.png' ORANGE_MIN = cv.Scalar(18, 40, 90) ORANGE_MAX = cv.Scalar(27, 255, 255) COLOR_MIN = ORANGE_MIN COLOR_MAX = ORANGE_MAX def test1(): frame = cv.LoadImage(in_image) frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3) cv.CvtColor(frame, frameHSV, cv.CV_RGB2HSV) frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1) cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed) cv.SaveImage(out_image_thr, frame_threshed) if __name__ == '__main__': test1() 

问题1:不同的应用程序对HSV使用不同的比例。 例如,gimp使用H = 0-360, S = 0-100 and V = 0-100 。 但是OpenCV使用H: 0 - 180, S: 0 - 255, V: 0 - 255 0-180 H: 0 - 180, S: 0 - 255, V: 0 - 255 。 在这里我得到了一个色调值为22的瘸子。 所以我拿了一半,11,并为此定义了范围。 即(5,50,50) - (15,255,255)

问题2:另外,OpenCV使用BGR格式,而不是RGB。 所以改变你的代码,将RGB转换为HSV,如下所示:

 cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV) 

现在运行它。 我得到了一个输出如下:

在这里输入图像说明

希望这是你想要的。 有一些错误的检测,但它们很小,所以你可以select最大的轮廓,这是你的盖子。

编辑:

正如卡尔·菲利普在他的评论中所说的那样,增加新的代码是很好的。 但是只有一条线的变化。 所以,我想添加在新的cv2模块中实现的相同的代码,以便用户可以比较新的cv2模块的简单性和灵活性。

 import cv2 import numpy as np img = cv2.imread('sof.jpg') ORANGE_MIN = np.array([5, 50, 50],np.uint8) ORANGE_MAX = np.array([15, 255, 255],np.uint8) hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) frame_threshed = cv2.inRange(hsv_img, ORANGE_MIN, ORANGE_MAX) cv2.imwrite('output2.jpg', frame_threshed) 

它给出了与上面相同的结果。 但代码要简单得多。

我创build了这个简单的程序来实时获得HSV代码

 import cv2 import numpy as np cap = cv2.VideoCapture(0) def nothing(x): pass # Creating a window for later use cv2.namedWindow('result') # Starting with 100's to prevent error while masking h,s,v = 100,100,100 # Creating track bar cv2.createTrackbar('h', 'result',0,179,nothing) cv2.createTrackbar('s', 'result',0,255,nothing) cv2.createTrackbar('v', 'result',0,255,nothing) while(1): _, frame = cap.read() #converting to HSV hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) # get info from track bar and appy to result h = cv2.getTrackbarPos('h','result') s = cv2.getTrackbarPos('s','result') v = cv2.getTrackbarPos('v','result') # Normal masking algorithm lower_blue = np.array([h,s,v]) upper_blue = np.array([180,255,255]) mask = cv2.inRange(hsv,lower_blue, upper_blue) result = cv2.bitwise_and(frame,frame,mask = mask) cv2.imshow('result',result) k = cv2.waitKey(5) & 0xFF if k == 27: break cap.release() cv2.destroyAllWindows() 

OpenCV HSV范围是:H:0到179 S:0到255 V:0到255

在Gimp(或其他照片处理sw)中,色调范围从0到360,因为opencv将颜色信息放在一个字节中,所以单个字节中的最大数值为255,因此openCV色调值等于来自gimp的色相值除以2 。

我发现当试图做基于HSV色彩空间的对象检测时,范围为5(opencv范围)足以过滤出特定的颜色。 我build议你使用HSV色板来找出最适合你应用的范围。

HSV色彩与HSV空间中的颜色检测