it-swarm.com.de

Auswahl der richtigen oberen und unteren HSV-Grenzen für die Farberkennung mit ʻcv :: inRange` (OpenCV)

Ich habe ein Bild von einer Kaffeedose mit orangefarbenem Deckel, von der ich finden möchte, dass es hier ist image.

das Dienstprogramm gcolor2 zeigt HSV in der Mitte des Deckels (22, 59, 100) ..__ an. Die Frage ist, wie die Grenzen der Farbe dann zu wählen sind. Ich habe min = (18, 40, 90) und max = (27, 255, 255) ausprobiert, bin aber unerwartet gekommen 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 __== '__main__':
    test1()
57
Student FourK

Problem 1: Unterschiedliche Anwendungen verwenden unterschiedliche Skalen für HSV. Zum Beispiel verwendet gimp H = 0-360, S = 0-100 and V = 0-100. OpenCV verwendet jedoch H: 0 - 180, S: 0 - 255, V: 0 - 255. Hier habe ich in Gimp einen Farbtonwert von 22 erhalten. Also nahm ich die Hälfte davon, 11 und definierte den Bereich dafür. dh (5,50,50) - (15,255,255).

Problem 2: Außerdem verwendet OpenCV das BGR-Format, nicht RGB. So ändern Sie Ihren Code, der RGB in HSV konvertiert, wie folgt:

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

Jetzt führe es aus. Ich habe eine Ausgabe wie folgt erhalten:

enter image description here

Hoffen Sie, dass Sie das wollten. Es gibt einige falsche Erkennungen, aber diese sind klein, sodass Sie die größte Kontur wählen können, die Ihr Deckel ist.

BEARBEITEN:

Wie Karl Philip in seinem Kommentar sagte, wäre es gut, neuen Code hinzuzufügen. Aber es gibt nur eine einzige Änderung. Ich möchte also den gleichen Code hinzufügen, der im neuen cv2-Modul implementiert ist, damit Benutzer die Einfachheit und Flexibilität des neuen cv2-Moduls 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 ergibt dasselbe Ergebnis wie oben. Aber Code ist viel einfacher.

124
Abid Rahman K

Ich habe dieses einfache Programm erstellt, um HSV-Codes in Echtzeit zu erhalten

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()
22
Aruldd

Ok, Farbe im HSV-Raum zu finden, ist eine alte, aber häufige Frage. Ich habe einen hsv-colormap gemacht, um schnell nach Sonderfarben zu suchen. Hier ist es:

 enter image description here

Die x-Achse repräsentiert Hue in [0,180), die y-Achse1 repräsentiert Saturation in [0,255], die y-Achse2 S = 255, während V = 255 beibehalten wird.

Um eine Farbe zu finden, suchen Sie normalerweise nach dem Bereich von 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]. Die Maske ist also cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )

Dann verwenden wir den gefundenen Bereich, um nach der Farbe Orange zu suchen. Dies ist das Ergebnis:

 enter image description here


Die Methode ist einfach, aber häufig zu verwenden:

#!/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. So definieren Sie einen Schwellenwert, um nur grüne Objekte in einem Bild zu erkennen: Opencv

  2. Richtige HSV-Werte für OpenCV-Thresholding mit InRangeS wählen

15
Kinght 金

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

Bei Gimp (oder einem anderen Fotomanipulations-Sw) liegt der Farbtonbereich zwischen 0 und 360. Da opencv Farbinformationen in ein einzelnes Byte einfügt, beträgt der maximale Zahlenwert in einem Byte 255, sodass die Farbwerte von openCV den Farbtonwerten von gimp geteilt durch 2 entsprechen .

Beim Versuch, eine Objekterkennung basierend auf dem HSV-Farbraum durchzuführen, habe ich festgestellt, dass ein Bereich von 5 (opencv-Bereich) ausreicht, um eine bestimmte Farbe herauszufiltern. Ich würde Ihnen empfehlen, einen HSV-Farbpalette zu verwenden, um herauszufinden, welcher Bereich für Ihre Anwendung am besten geeignet ist.

 HSV color palate with color detection in HSV space

3
sami dalati

Um den HSV-Wert von Grün zu ermitteln, führen Sie die folgenden Befehle im Python-Terminal aus

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[ 60 255 255]]]
0
Masum Billah