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 .
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
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()
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:
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.
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()
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:
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:
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:
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.
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