Source code for draugr.opencv_utilities.windows.color_picker

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")