2012-06-08 407 views
48

我有一個咖啡罐的圖像,我想找到一個橙色的蓋子位置。 這是它image使用`cv :: inRange`(OpenCV)爲顏色檢測選擇正確的上下HSV邊界

gcolor2實用程序顯示蓋子中心的HSV爲(22,59,100)。 問題是如何選擇顏色的限制呢?我試圖分鐘=(18,40,90)和max =(27,255,255),但是已經得到意想不到result

這裏是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() 
+0

我檢查的數值(22,59,100)HSV,而且他們似乎並不匹配類似的那些相同的任何顏色蓋子。但是作爲BGR,它們是有道理的。你是如何檢索這些值的? – karlphillip

+0

這是gcolor2的截圖http://imageshack.us/photo/my-images/23/rgb2hsv.png/。然後,我檢查顏色編號#FFA069的http://www.yafla.com/yaflaColor/ColorRGBHSL.aspx?RGB =&Colors = ,,,,,,,,,並且轉換是相同的。 –

+2

這可能是由於OpenCV中的HSV範圍不同,即H:0-180,S:0-255,V:0-255。 –

回答

101

問題1:不同應用程序使用不同比例的HSV。例如,gimp使用H = 0-360, S = 0-100 and V = 0-100。但OpenCV使用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) 

現在運行它。我得到的輸出如下:

enter image description here

希望這是你想要的。有一些錯誤的檢測,但它們很小,所以你可以選擇最大的輪廓,這是你的蓋子。

編輯:

由於卡爾·菲利普在他的評論中說,這將有利於增加新的代碼。但是隻有一條線的變化。因此,我想添加新的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) 

它給出了與上述相同的結果。但代碼要簡單得多。

+0

+1優秀,再一次。如果你可以在你的修改中添加完整的源代碼,那就太棒了。 – karlphillip

+0

謝謝。但我認爲這裏沒有太多優點:)(OK,我會做) –

+1

@karlphillip:編輯答案 –

17

我建立這個簡單的程序來獲得實時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() 
+3

大聲笑,我寫了相同的代碼打印最終的HSV值使用https://github.com/saurabheights/ImageProcessingExperimentScripts/blob/master/AnalyzeHSV/hsvThresholder.py – saurabheights

1

OpenCV的HSV範圍是: H:0至179 S:0〜255 五:0到255

在Gimp(或其他照片處理sw)色調範圍從0到360,因爲opencv將顏色信息放在單個字節中,所以單個字節中的最大數值爲255,因此openCV色調值等於來自gimp的色相值除以2。

當我嘗試基於HSV顏色空間進行對象檢測時發現,範圍爲5(opencv範圍)足以過濾出特定顏色。我建議您使用HSV色板來找出最適合您應用的範圍。

HSV color palate with color detection in HSV space

2

好了,找顏色HSV空間是一個古老而又常見的問題。我做了一個hsv-colormap來快速查找特殊顏色。在這裏它是:

enter image description here

的x軸表示在[0180 Hue)中,y軸1表示[0255] Saturation中,y的axis2表示S = 255,同時保持V = 255

要查找顏色,通常只需查找HS的範圍,並將範圍設置爲v(20,255)。

要查找橙色,我們查找地圖,並找到最佳範圍:H :[10, 25], S: [100, 255], and V: [20, 255]。所以,掩碼爲cv2.inRange(hsv,(10, 100, 20), (25, 255, 255))

然後我們用找到的範圍來尋找橙色,這是結果:

enter image description here


的方法很簡單,但通常使用:

#!/usr/bin/python3 
# 2018.01.21 20:46:41 CST 
import cv2 

img = cv2.imread("test.jpg") 
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
mask = cv2.inRange(hsv,(10, 100, 20), (25, 255, 255)) 
cv2.imshow("orange", mask);cv2.waitKey();cv2.destroyAllWindows() 

類似的答案:

  1. How to define a threshold value to detect only green colour objects in an image :Opencv

  2. Choosing correct HSV values for OpenCV thresholding with InRangeS