HSV Debugging Tool

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

To facilitate usage, I developed a small tool that can import an image and set the upper and lower limits of the three HSV values through the operation of six sliders, displaying the results in real-time on the mask and result layers to alleviate the aforementioned issues.

image-20240229161212053

Simply drag the sliders to quickly locate the HSV range of multiple targets, even down 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'  # Location of the image, only need to modify this attribute when using
# Callback function for the sliders to get the value at the slider position  
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 to 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 slider values  
    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 a mask within the specified color range  
    mask = cv2.inRange(imgHSV, lower, upper)  
    # Perform bitwise AND operation on the original image, keeping the mask 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%