from pathlib import Path
from typing import Iterable
import cv2
import numpy
from draugr.opencv_utilities.color_space.threshold import hsv_min_max_clip_mask
from draugr.opencv_utilities.windows.elements import add_trackbar
from draugr.opencv_utilities.windows.image import show_image
__all__ = ["interactive_hsv_color_picker"]
[docs]def interactive_hsv_color_picker(
ps: Iterable, wait_time: int = 33, verbose: bool = False
) -> None:
"""
:param ps:
:type ps:
:param wait_time:
:type wait_time:
:param verbose:
:type verbose:
"""
show_image(numpy.zeros((600, 600)), "image")
add_trackbar(
"image", "HMin", default=0, max_val=179
) # Hue is from 0-179 for Opencv
add_trackbar("image", "HMax", default=179, max_val=179)
add_trackbar("image", "SMin", default=0)
add_trackbar("image", "SMax", default=255)
add_trackbar("image", "VMin", default=0)
add_trackbar("image", "VMax", default=255)
# Initialize to check if HSV min/max value changes
h_min = s_min = v_min = h_max = s_max = v_max = 0
ph_min = ps_min = pv_min = ph_max = ps_max = pv_max = 0
for p in ps:
if not p.exists():
continue
img = cv2.imread(str(p))
output = img
while 1:
h_min = cv2.getTrackbarPos("HMin", "image")
h_max = cv2.getTrackbarPos("HMax", "image")
s_min = cv2.getTrackbarPos("SMin", "image")
s_max = cv2.getTrackbarPos("SMax", "image")
v_min = cv2.getTrackbarPos("VMin", "image")
v_max = cv2.getTrackbarPos("VMax", "image")
output = cv2.bitwise_and(
img,
img,
mask=hsv_min_max_clip_mask(
img,
numpy.array([h_min, s_min, v_min]),
numpy.array([h_max, s_max, v_max]),
),
)
# Print if there is a change in HSV value
if (
(ph_min != h_min)
| (ps_min != s_min)
| (pv_min != v_min)
| (ph_max != h_max)
| (ps_max != s_max)
| (pv_max != v_max)
):
if verbose:
print(
f"(hMin = {h_min:d} , sMin = {s_min:d}, vMin = {v_min:d}), (hMax = {h_max:d} , sMax = {s_max:d}, vMax = {v_max:d})"
)
# TODO :look at neater handling of min-maxing values
th_min = min(h_min, h_max)
ts_min = min(s_min, s_max)
tv_min = min(v_min, v_max)
h_max = max(h_min, h_max)
s_max = max(s_min, s_max)
v_max = max(v_min, v_max)
h_min = th_min
s_min = ts_min
v_min = tv_min
cv2.setTrackbarPos("HMin", "image", h_min)
cv2.setTrackbarPos("HMax", "image", h_max)
cv2.setTrackbarPos("SMin", "image", s_min)
cv2.setTrackbarPos("SMax", "image", s_max)
cv2.setTrackbarPos("VMin", "image", v_min)
cv2.setTrackbarPos("VMax", "image", v_max)
ph_min = h_min
ps_min = s_min
pv_min = v_min
ph_max = h_max
ps_max = s_max
pv_max = v_max
if show_image(output, "image", wait=wait_time):
break
cv2.destroyAllWindows()
if __name__ == "__main__":
pss = (
Path.home()
/ "ProjectsWin/AiBitbucket/Internal/OptikosPrime/exclude/new_images/adam_plus0p5/215asd.jpg",
Path(r"C:\Users\Christian\OneDrive\Billeder\buh\7BIsT.png"),
Path(r"C:\Users\Christian\OneDrive\Billeder\Portraits\thomas.jpg"),
)
if any(p.exists() for p in pss):
interactive_hsv_color_picker(iter(pss))
else:
print(f"{pss} does not exist")