Heim >Backend-Entwicklung >Python-Tutorial >Wie wähle ich die richtigen oberen und unteren HSV-Grenzen für eine genaue Farberkennung in OpenCV aus?

Wie wähle ich die richtigen oberen und unteren HSV-Grenzen für eine genaue Farberkennung in OpenCV aus?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-02 01:36:10842Durchsuche

How to Choose the Correct HSV Upper and Lower Boundaries for Accurate Color Detection in OpenCV?

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

Beim Erkennen von Farben in Bildern mithilfe von cv::inRange-Funktion in OpenCV verwenden, ist es wichtig, geeignete obere und untere Grenzen für den HSV (Farbton, Sättigung, Wert) auszuwählen. Farbraum. Dies gewährleistet eine genaue Farberkennung und ermöglicht eine effiziente Segmentierung.

Problem:

Stellen Sie sich ein Bild vor, das einen orangefarbenen Deckel einer Kaffeedose zeigt. Der HSV-Wert in der Mitte des Deckels, der mit dem Dienstprogramm gcolor2 ermittelt wurde, beträgt (22, 59, 100). Die Verwendung der anfänglichen Grenzen, die als min = (18, 40, 90) und max = (27, 255, 255) definiert sind, führte zu unerwarteten Erkennungsergebnissen.

Lösung:

Problem 1: HSV-Bereichsvariation

Verschiedene Anwendungen verwenden oft unterschiedliche Maßstäbe für HSV-Werte. GIMP verwendet beispielsweise eine Skala von H: 0–360, S: 0–100, V: 0–100, während OpenCV H: 0–179, S: 0–255, V: 0–255 verwendet. In diesem Fall sollte der Farbtonwert von 22 in GIMP in 11 in OpenCV umgewandelt werden, indem die Hälfte seines Wertes genommen wird. Somit wird die überarbeitete Grenze zu (5, 50, 50) – (15, 255, 255).

Problem 2: Farbraumkompatibilität

OpenCV verwendet die BGR (Blau-Grün-Rot) Farbformat, nicht RGB. Um die Kompatibilität sicherzustellen, sollte der Code, der RGB in HSV konvertiert, wie folgt geändert werden:

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

Aktualisierter Code:

import cv

in_image = 'kaffee.png'
out_image = 'kaffee_out.png'
out_image_thr = 'kaffee_thr.png'

ORANGE_MIN = cv.Scalar(5, 50, 50)
ORANGE_MAX = cv.Scalar(15, 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_BGR2HSV)
    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()

Ergebnis:

Das Ausführen des aktualisierten Codes führt zu einer genaueren Segmentierung der Orange Deckel.

Hinweis:

Aufgrund ähnlicher Farbtöne im Hintergrund kann es zu kleinen Fehlerkennungen kommen. Um dieses Problem zu beheben, kann eine weitere Verarbeitung wie eine Konturanalyse angewendet werden, um die größte Kontur zu isolieren, die dem Deckel entspricht.

Das obige ist der detaillierte Inhalt vonWie wähle ich die richtigen oberen und unteren HSV-Grenzen für eine genaue Farberkennung in OpenCV aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn