Reputation: 7218
I am trying detect few colors in python opencv. For this I need to define the low and high hsv values so that the code can read it and detect colors. Now the issue I am facing is how do I get the high and low hsv colors. I am referring to below image
I need to detect this jacket and thus need to input its high and low hsv. For this I got a reference to this code which allows to select any part of image and will output the high and low hsv values for it. But as far as I know, hsv value cannot be larger than 100 but this code and most of the other codes online gives hsv values which are greater than 100, and this is very I am getting confused as to how these values can be greater than 100.
Can anyone please explain how can we get the values of low and high hsv values
Upvotes: 2
Views: 10049
Reputation: 562
Couldnt find the resource but found something like this and made it useful, thanks to the author
import cv2
import imutils
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("myimage.jpeg") # pick.py my.png
image_src = imutils.resize(image_src, height=800)
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()
Image loaded will look like this:
After clicking on the ball you will get an image like,
And finally: true BGR value, lower and upper HSV boundaries will be printed in the terminal as follows,
Upvotes: 1
Reputation: 8699
Try below code:
import cv2
import numpy as np
img = cv2.imread("jacket.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# mask of green (36,25,25) ~ (86, 255,255)
mask = cv2.inRange(hsv, (36, 25, 25), (70, 255,255))
green = cv2.bitwise_and(img,img, mask= mask)
cv2.imshow('Image', green)
cv2.waitKey(0)
cv2.destroyAllWindowss()
output:
Check this stackoverflow discussion on how to correctly select the upper and lower hsv values for color detection.
Upvotes: 3