S Andrew
S Andrew

Reputation: 7218

How to get low and high values of hsv color in python opencv

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

enter image description here

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

Answers (2)

lakjeewa Wijebandara
lakjeewa Wijebandara

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:

enter image description here

After clicking on the ball you will get an image like,

enter image description here

And finally: true BGR value, lower and upper HSV boundaries will be printed in the terminal as follows,

enter image description here

Upvotes: 1

Anubhav Singh
Anubhav Singh

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:

enter image description here

Check this stackoverflow discussion on how to correctly select the upper and lower hsv values for color detection.

Upvotes: 3

Related Questions