【发布时间】:2015-09-28 12:48:57
【问题描述】:
在我的项目中,用户应该为某个进程选择一种颜色。互联网上有一些应用程序。他们为颜色的 RGB 值创建了三个轨迹栏,但我不想那样做。我想在下面创建一个跟踪栏或类似的东西。
如何创建这样的轨迹栏?和
如何获取标记所在颜色的 RGB 值?
【问题讨论】:
标签: c++ opencv image-processing colors trackbar
在我的项目中,用户应该为某个进程选择一种颜色。互联网上有一些应用程序。他们为颜色的 RGB 值创建了三个轨迹栏,但我不想那样做。我想在下面创建一个跟踪栏或类似的东西。
如何创建这样的轨迹栏?和
如何获取标记所在颜色的 RGB 值?
【问题讨论】:
标签: c++ opencv image-processing colors trackbar
OpenCV GUI 功能并不丰富。您可能想使用Qt 或类似的工具来创建一个漂亮的 GUI,并且仍然在 OpenCV 中进行图像处理。
关于 OpenCV 上的跟踪栏,您可能希望使用 HSV(色相、饱和度、值)颜色空间而不是 RGB。修复S=255和V=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;
}
【讨论】:
我生成图像,然后使用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
【讨论】: