Der Vorteil von HSV ist, dass Sie die Farbe mit Unter- und Oberfarbe auswählen können, aber ich hatte Schwierigkeiten, da die Unter- und Oberfarbe für die Farbe unbekannt sind. Machen Sie sich also eine Notiz.
Es ist wie eine Erweiterung von RGB und besteht aus Farbton, Sättigung und Leichtigkeit. Was mich glücklich macht, ist, dass es einfach ist, die Farbpalette festzulegen. Der H-Teil entspricht dem RGB-Teil.
Farbton Typ 0-360 Bereich Sättigungsfarbe Lebendigkeit im Bereich von 0-100%. Helligkeit-Farbhelligkeit im Bereich von 0-100%.
Es scheint, dass der eingestellte Wert je nach Software unterschiedlich ist. Bei opencv liegt die Helligkeit meiner Meinung nach zwischen 100 und 255.
Siehe Wiki https://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
Simulator http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
convert.py
import sys
import numpy as np
import cv2
#rgb
red = sys.argv[1]
green = sys.argv[2]
blue = sys.argv[3]
color = np.uint8([[[blue, green, red]]])
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
hue = hsv_color[0][0][0]
print("Lower bound is :"),
print("[" + str(hue-10) + ", 100, 100]\n")
print("Upper bound is :"),
print("[" + str(hue + 10) + ", 255, 255]")
python convert.py 255 255 255
Ich konvertiere es so, aber dieses kann nur grob konvertiert werden.
hsv.py
import cv2
import numpy as np
image_hsv = None # global ;(
pixel = (20,60,80) # some stupid default
# mouse callback function
def pick_color(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDOWN:
pixel = image_hsv[y,x]
#you might want to adjust the ranges(+-10, etc):
upper = np.array([pixel[0] + 10, pixel[1] + 10, pixel[2] + 40])
lower = np.array([pixel[0] - 10, pixel[1] - 10, pixel[2] - 40])
print(pixel, lower, upper)
image_mask = cv2.inRange(image_hsv,lower,upper)
cv2.imshow("mask",image_mask)
def main():
import sys
global image_hsv, pixel # so we can use it in mouse callback
image_src = cv2.imread(sys.argv[1]) # pick.py my.png
if image_src is None:
print ("the image read is None............")
return
cv2.imshow("bgr",image_src)
## NEW ##
cv2.namedWindow('hsv')
cv2.setMouseCallback('hsv', pick_color)
# now click into the hsv img , and look at values:
image_hsv = cv2.cvtColor(image_src,cv2.COLOR_BGR2HSV)
cv2.imshow("hsv",image_hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__=='__main__':
main()
python hsv.py hoge.png
Es wird beim Start maskiert und auf dem hsv-Bildschirm doppelklickt. Zum Beispiel sind Gelb und Grün sehr ähnlich. Pink und Rot auch. In diesem Fall reagiert auch Rot, obwohl Sie auf Pink klicken. Mit anderen Worten, Sie müssen die Farbtiefe und Helligkeit fein einstellen. Ich wusste nicht, wie ich es automatisch machen sollte, also spielte ich manuell damit.
hsv_sample.py
import sys
import cv2
import numpy as np
import sys
import cv2
import numpy as np
#yellow
# lower = np.array([30,100,250])
# upper = np.array([40,255,255])
#pink
lower = np.array([160,50,50])
upper = np.array([180,255,255])
#yellowgreen
# lower = np.array([30,100,200])
# upper = np.array([60,255,250])
image_src = cv2.imread(sys.argv[1])
image_src = cv2.cvtColor(image_src,cv2.COLOR_BGR2HSV)
image_src = cv2.inRange(image_src,lower,upper)
while True:
cv2.imshow("image_src",image_src)
if cv2.waitKey(10) == 27: # ESC
break
Eine sehr primitive Methode, aber auch eine gelbgrüne Maske, die Gelb sehr ähnlich ist, hat funktioniert.
Aus diesem Grund war es möglicherweise möglich, es zu automatisieren, indem es angezeigt und der Chot-Bereich angegeben wurde.
python
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
How to define the “lower” and “upper” range of a color? http://answers.opencv.org/question/134248/how-to-define-the-lower-and-upper-range-of-a-color/ http://docs.opencv.org/trunk/df/d9d/tutorial_py_colorspaces.html
Recommended Posts