Wybór prawidłowych górnych i dolnych granic HSV do wykrywania kolorów za pomocą'CV:: inRange` (OpenCV)

Mam zdjęcie puszki po kawie z pomarańczową pokrywką, którą chcę znaleźć. Oto on obraz.

Narzędzie gcolor2 pokazuje HSV na środku pokrywy jako (22, 59, 100). Pytanie brzmi, jak wybrać granice koloru? Próbowałem min = (18, 40, 90) i max = (27, 255, 255), ale mam nieoczekiwane wynik

Oto Kod Pythona:

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()
Author: Silencer, 2012-06-08

4 answers

Problem 1: różne aplikacje używają różnych skal dla HSV. Na przykład gimp używa H = 0-360, S = 0-100 and V = 0-100. Ale OpenCV używa H: 0 - 180, S: 0 - 255, V: 0 - 255. Tutaj mam wartość odcień 22 w gimp. Więc wziąłem połowę, 11, i zdefiniowałem na to zakres. ie (5,50,50) - (15,255,255).

Problem 2: poza tym OpenCV używa formatu BGR, a nie RGB. Więc zmień kod, który konwertuje RGB do HSV w następujący sposób:

cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)
Uruchom go. Mam wyjście w następujący sposób:

Tutaj wpisz opis obrazka

Mam nadzieję, że tego właśnie chciałeś. Tam są to fałszywe wykrywanie, ale są małe, więc możesz wybrać największy kontur, który jest twoją pokrywą.

EDIT:

Jak powiedział Karl Philipw swoim komentarzu, dobrze byłoby dodać nowy kod. Ale jest zmiana tylko jednej linii. Chciałbym więc dodać ten sam kod zaimplementowany w nowym module cv2, aby użytkownicy mogli porównać łatwość i elastyczność nowego modułu 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)

Daje taki sam wynik jak powyżej. Ale kod jest znacznie prostszy.

 115
Author: Abid Rahman K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-08 15:13:10

Stworzyłem ten prosty program, aby uzyskać kody HSV w czasie rzeczywistym

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()
 21
Author: Aruldd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-25 16:58:13

Ok, znajdź kolor w przestrzeni HSV to stare, ale powszechne pytanie. Zrobiłem hsv-colormap, aby szybko wyszukać specjalny kolor. Tutaj jest:

Tutaj wpisz opis obrazka

Oś x reprezentuje Hue w [0,180), y-axis1 reprezentuje Saturation w [0,255], y-axis2 reprezentuje S = 255, natomiast keep V = 255.

Aby znaleźć kolor, zwykle po prostu poszukaj zakresu H i S i ustaw v w zakresie(20, 255).

Aby znaleźć pomarańczowy kolor, szukamy Mapy i znajdujemy najlepsze zakres: H :[10, 25], S: [100, 255], and V: [20, 255]. Więc maska jest cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )

Następnie używamy znalezionego zakresu, aby wyszukać kolor pomarańczowy, jest to wynik:

Tutaj wpisz opis obrazka


Metoda jest prosta, ale powszechna w użyciu:

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

Podobne odpowiedzi:

  1. Jak zdefiniować wartość progową, aby wykrywać tylko obiekty koloru zielonego na obrazie: Opencv

  2. Wybór prawidłowych wartości HSV dla progu OpenCV z InRangeS

 12
Author: Silencer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-21 13:18:50

Zakres OpenCV HSV jest: H: 0 do 179 S: 0 do 255 V: 0 do 255

W Gimp GIMP (lub innym programie do manipulacji zdjęciami) zakres odcieni od 0 do 360, ponieważ opencv umieszcza informacje o kolorze w jednym bajcie, maksymalna wartość liczbowa w jednym bajcie wynosi 255, dlatego wartości odcienia openCV są równoważne wartościom odcienia z gimp podzielonym przez 2.

Podczas próby detekcji obiektów w oparciu o przestrzeń kolorów HSV odkryłem, że zakres 5 (Zakres opencv) był wystarczający do odfiltrowania określonego koloru. Radzę ci użyj palety kolorów HSV, aby określić zakres, który najlepiej pasuje do Twojej aplikacji.

Podniebienie kolorów HSV z detekcją kolorów w przestrzeni HSV

 3
Author: sami dalati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-01 00:27:55