HSV Debugging Tool

OpenCV often reads images in the HSV color space, and using a color extractor on the image often cannot yield accurate results; if there are multiple different targets with multiple colors in the image, the color extraction work is also very troublesome.

For convenience, I developed a small tool that can import an image and achieve the setting of the upper and lower limits of the three HSV values through dragging operations of six progress bars, and display the results in real-time on the mask and result layers, thus alleviating the aforementioned problems.

image-20240229161212053

Simply by dragging the progress bars, one can quickly locate the HSV range of multiple targets, and even be precise to a specific value. The code is as follows:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import cv2  
import numpy as np  

path = r'D:\PlayGround\CVP\return.png'  # The location of the image, only need to modify this attribute when using
# Callback function for the slider, getting the value at the position of the slider  
def empty(a):  
    h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")  
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")  
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")  
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")  
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")  
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")  
    print(h_min, h_max, s_min, s_max, v_min, v_max)  
    return h_min, h_max, s_min, s_max, v_min, v_max  
    
# Create a window and place 6 sliders  
cv2.namedWindow("TrackBars")  
cv2.resizeWindow("TrackBars", 640, 240)  
cv2.createTrackbar("Hue Min", "TrackBars", 0, 179, empty)  
cv2.createTrackbar("Hue Max", "TrackBars", 19, 179, empty)  
cv2.createTrackbar("Sat Min", "TrackBars", 110, 255, empty)  
cv2.createTrackbar("Sat Max", "TrackBars", 240, 255, empty)  
cv2.createTrackbar("Val Min", "TrackBars", 153, 255, empty)  
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)  
  
while True:  
    img = cv2.imread(path)  
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  
    # Call the callback function to get the value of the slider  
    h_min, h_max, s_min, s_max, v_min, v_max = empty(0)  
    lower = np.array([h_min, s_min, v_min])  
    upper = np.array([h_max, s_max, v_max])  
    # Obtain the mask within the specified color range  
    mask = cv2.inRange(imgHSV, lower, upper)  
    # Perform a bitwise-and operation on the original image, retaining the masked area  
    imgResult = cv2.bitwise_and(img, img, mask=mask)  
    cv2.imshow("Mask", mask)  
    cv2.imshow("Result", imgResult)  
    cv2.waitKey(1)
Buy me a coffee~
Tim AlipayAlipay
Tim PayPalPayPal
Tim WeChat PayWeChat Pay
0%