2012-06-08 3 views
48

Ich habe ein Bild von einer Kaffeedose mit einer orangefarbenen Deckelposition, die ich finden möchte. Hier ist es image.Auswahl der korrekten oberen und unteren HSV-Grenzen für die Farberkennung mit `cv :: inRange` (OpenCV)

Das Dienstprogramm gcolor2 zeigt HSV in der Mitte des Deckels an (22, 59, 100). Die Frage ist, wie wählt man dann die Grenzen der Farbe? Ich habe versucht, min = (18, 40, 90) und max = (27, 255, 255), aber haben unerwartet bekam result

Hier ist der Python-Code:

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

Ich überprüfte die Werte (22, 59, 100) als HSV, und sie scheinen nicht die jede Farbe ähnlich denen entsprechen der der Deckel. Aber als BGR machen sie Sinn. Wie haben Sie diese Werte abgerufen? – karlphillip

+0

Hier ist ein Screenshot mit gcolor2 http://imageshack.us/photo/my-images/23/rgb2hsv.png/. Ich habe dann die Farbnummer # FFA069 unter http: //www.yafla.com/yaflaColor/ColorRGBHSL.aspx?RGB = & Colors = ,,,,,,,, überprüft und die Konvertierung ist die gleiche. –

+2

Dies liegt wahrscheinlich an verschiedenen HSV-Bereichen in OpenCV, nämlich H: 0 - 180, S: 0 - 255, V: 0 - 255. –

Antwort

101

Problem 1: Verschiedene Anwendungen verwenden unterschiedliche Maßstäbe für HSV. Zum Beispiel verwendet gimp H = 0-360, S = 0-100 and V = 0-100. Aber OpenCV verwendet H: 0 - 180, S: 0 - 255, V: 0 - 255. Hier bekam ich einen Farbwert von 22 in Gimp. Also nahm ich die Hälfte davon, 11, und definierte die Reichweite dafür. dh (5,50,50) - (15,255,255).

Problem 2: Und auch OpenCV verwendet BGR-Format, nicht RGB. Ändern Sie also Ihren Code, der RGB in HSV umwandelt, wie folgt:

Jetzt starten Sie es. Ich habe eine Ausgabe wie folgt:

enter image description here

Hoffnung, dass das, was Sie wollten. Es gibt einige falsche Erkennungen, aber sie sind klein, so dass Sie die größte Kontur auswählen können, die Ihr Deckel ist.

EDIT:

Als Karl Philip in seinem Kommentar sagte, wäre es gut, neuen Code hinzuzufügen. Aber es gibt nur eine einzige Änderung. Daher möchte ich den gleichen Code hinzufügen, der in dem neuen Modul cv2 implementiert wurde, so dass Benutzer die Leichtigkeit und Flexibilität des neuen Moduls cv2 vergleichen können.

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) 

Es gibt das gleiche Ergebnis wie oben. Aber Code ist viel einfacher.

+0

+1 Ausgezeichnet, noch einmal. Wenn Sie den vollständigen Quellcode mit Ihren Änderungen hinzufügen könnten, wäre das großartig. – karlphillip

+0

Danke. Aber ich denke nicht, dass es hier sehr viel Exzellenz gibt :) (OK, ich werde es tun) –

+1

@karlphillip: bearbeitete die Antwort –

17

ich dieses einfache Programm Erstellt in Echtzeit HSV-Codes zu bekommen

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

LOL, ich hatte den gleichen Code geschrieben mit dem Drucken der letzten HSV-Werte verwendet https://github.com/saurabheights/ImageProcessingExperimentScripts/blob/master/AnalyzeHSV/hsvThresholder.py – saurabheights

1

OpenCV HSV Bereich ist: H: 0-179 S: 0 bis 255 V: 0 bis 255

On Gimp (oder andere Foto-Manipulation sw) Farbton Bereich von 0 bis 360, da opencv Farbe info in einem einzigen Byte setzen, der maximale Anzahl Wert in einem einzigen Byte ist 255 daher openCV Farbton-Werte sind äquivalent zu Farbton-Werte von Gimp dividiert durch 2.

Beim Versuch, eine Objekterkennung basierend auf dem HSV-Farbraum durchzuführen, fand ich, dass ein Bereich von 5 (opencv-Bereich) ausreichte, um eine bestimmte Farbe herauszufiltern. Ich würde Ihnen empfehlen, einen HSV-Farbpalast zu verwenden, um den Bereich zu finden, der am besten für Ihre Anwendung geeignet ist.

HSV color palate with color detection in HSV space

2

Ok, finden Farbe in HSV Raum ist eine alte, aber häufig gestellte Frage.Ich habe eine hsv-colormap gemacht, um spezielle Farbe schnell nachzuschlagen. Hier ist sie:

enter image description here

Die x-Achse in Hue [0180 darstellt), die y-axis1 repräsentiert Saturation in [0255], die y-axis2 S = 255 darstellt, während V = 255 zu halten.

Um eine Farbe zu finden, suchen Sie in der Regel nur nach dem Bereich H und S, und setzen Sie v in den Bereich (20, 255).

Um die orange Farbe zu finden, suchen wir nach der Karte und finden den besten Bereich: H :[10, 25], S: [100, 255], and V: [20, 255]. So ist der Maske cv2.inRange(hsv,(10, 100, 20), (25, 255, 255))

ist Dann benutzen wir den gefunden Bereich für die orange Farbe zu suchen, ist dies das Ergebnis:

enter image description here


Das Verfahren ist einfach, aber gemeinsam zu nutzen:

#!/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() 

ähnliche Antworten:

  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

Verwandte Themen