【问题标题】:Trackbar to choose color. Using C++, opencv用于选择颜色的轨迹栏。使用 C++、opencv
【发布时间】:2015-09-28 12:48:57
【问题描述】:

在我的项目中,用户应该为某个进程选择一种颜色。互联网上有一些应用程序。他们为颜色的 RGB 值创建了三个轨迹栏,但我不想那样做。我想在下面创建一个跟踪栏或类似的东西。

如何创建这样的轨迹栏?和

如何获取标记所在颜色的 RGB 值?

【问题讨论】:

    标签: c++ opencv image-processing colors trackbar


    【解决方案1】:

    OpenCV GUI 功能并不丰富。您可能想使用Qt 或类似的工具来创建一个漂亮的 GUI,并且仍然在 OpenCV 中进行图像处理。

    关于 OpenCV 上的跟踪栏,您可能希望使用 HSV(色相、饱和度、值)颜色空间而不是 RGB。修复S=255V=255,您可以通过在[0, 180]范围内更改H来选择颜色。请注意,在 OpenCV for CV_8UC3 图像中,HSV 的范围是:

    H in [0, 180]
    S,V in [0, 255]
    

    以下示例可能会为您提供一些关于如何使用轨迹栏和色调值的提示:

    #include <opencv2/opencv.hpp>
    using namespace cv;
    
    Mat3b rgb;
    Mat3b hsv;
    
    void on_trackbar(int hue, void*)
    {
        hsv.setTo(Scalar(hue, 255, 255));
        cvtColor(hsv, rgb, COLOR_HSV2BGR);
        imshow("HSV", rgb);
    }
    
    int main(int argc, char** argv)
    {
        // Init images
        rgb = Mat3b(100, 300, Vec3b(0,0,0));
        cvtColor(rgb, hsv, COLOR_BGR2HSV);
    
        /// Initialize values
        int sliderValue = 0;
    
        /// Create Windows
        namedWindow("HSV", 1);
    
        /// Create Trackbars
        createTrackbar("Hue", "HSV", &sliderValue, 180, on_trackbar);
    
        /// Show some stuff
        on_trackbar(sliderValue, NULL);
    
        /// Wait until user press some key
        waitKey(0);
        return 0;
    }
    

    【讨论】:

    【解决方案2】:

    我生成图像,然后使用setMouseCallback 获取鼠标点击位置并手动绘制滑块。抱歉,我无法提供 C++ 代码 sn-p。

    source code in Python 仅供参考。见on_mouse_event方法:

    import cv2
    import numpy as np
    
    
    class SliderHSV:
        SLIDER_H = 16  # px
        sliding = False
    
        def __init__(self, window_name):
            self.window_name = window_name
            self.pt = 0, 0
            h_comp = np.uint8([np.linspace([0, 255, 255], [179, 255, 255], 180)])
            h_comp = np.broadcast_to(h_comp, (self.SLIDER_H, 180, 3))
            self.h_comp = cv2.cvtColor(h_comp, cv2.COLOR_HSV2BGR)
            self.tpl_hsv = np.uint8(  # This is very very slow!
                [(0, i, j) for i in np.linspace(0, 255, 256) for j in np.linspace(0, 255, 256)]
            ).reshape(256, 256, 3)
            self.set_value(0)
            cv2.setMouseCallback(window_name, self.on_mouse_event, param=self.window_name)
            cv2.setMouseCallback("Sat-Bri", self.on_mouse_event)
    
        def on_mouse_event(self, event, x, y, flags, param):
            # https://docs.opencv.org/4.x/db/d5b/tutorial_py_mouse_handling.html
            if event == cv2.EVENT_LBUTTONDOWN:
                self.sliding = True
                if param == self.window_name:
                    self.set_value(x)
                else:
                    self.pt = x, y
            elif event == cv2.EVENT_MOUSEMOVE:
                if self.sliding:
                    if param == self.window_name:
                        self.set_value(x)
                    else:
                        self.set_rect(self.pt, (x, y))
            elif event == cv2.EVENT_LBUTTONUP:
                self.sliding = False
    
        def set_rect(self, pt1, pt2):
            pt1 = max(min(pt1[0], 255), 0), max(min(pt1[1], 255), 0)
            pt2 = max(min(pt2[0], 255), 0), max(min(pt2[1], 255), 0)
            sv = self.sv.copy()
            cv2.rectangle(sv, pt1, pt2, (255, 255, 255))
            sh_y1 = (24, 12) if pt2[1] > pt1[1] else (-12, 0)
            sh_y2 = (0, -12) if pt2[1] > pt1[1] else (24, 12)
            cv2.putText(sv, f"Sat.{pt1[1]}", (pt1[0], pt1[1] + sh_y1[1]), cv2.FONT_HERSHEY_PLAIN, 0.75, 0, lineType=cv2.LINE_AA)
            cv2.putText(sv, f"Br.{pt1[0]}", (pt1[0], pt1[1] + sh_y1[0]), cv2.FONT_HERSHEY_PLAIN, 0.75, 0, lineType=cv2.LINE_AA)
            cv2.putText(sv, f"Sat.{pt2[1]}", (pt2[0] - 45, pt2[1] + sh_y2[1]), cv2.FONT_HERSHEY_PLAIN, 0.75, 0, lineType=cv2.LINE_AA)
            cv2.putText(sv, f"Br.{pt2[0]}", (pt2[0] - 45, pt2[1] + sh_y2[0]), cv2.FONT_HERSHEY_PLAIN, 0.75, 0, lineType=cv2.LINE_AA)
            cv2.imshow("Sat-Bri", sv)
    
        def set_value(self, hue):
            hue = min(hue, 179)
            hue = max(hue, 0)
            h_comp = self.h_comp.copy()
            cv2.line(h_comp, (hue, 0), (hue, self.SLIDER_H), (255, 255, 255), 2)
            cv2.putText(h_comp, f"Hue {hue}", (0, self.SLIDER_H), cv2.FONT_HERSHEY_PLAIN, 1, 0, lineType=cv2.LINE_AA)
            self.sv = self.create_sat_br_rect(hue)
            cv2.imshow(self.window_name, h_comp)
            cv2.imshow("Sat-Bri", self.sv)
    
        def create_sat_br_rect(self, hue):
            self.tpl_hsv[:, :, 0] = hue
            return cv2.cvtColor(self.tpl_hsv, cv2.COLOR_HSV2BGR)
    
    
    SliderHSV("HSV slider")
    while(1):
        if cv2.waitKey(100) & 0xFF == 27:
            break
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      相关资源
      最近更新 更多