【opencv3】滑动条调节RGB颜色阈值并输出滑动条的值

一、实现目标

首先对图像 RGB 色彩空间进行分割,然后根据分割出来的各个通道的图像进行二值化处理,通过滑动条(cvCreateTrackbar)可以调节二值化的阈值。

本篇博客将给出两个版本的程序,一个是在程序内部设置二值化的阈值,另一个是通过文件读取预设阈值。

二、程序1

// 利用滑动条调节RGB颜色阈值
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

// 声明存储图像的变量
Mat roi_image, mask_color;

// 选择分割通道:0--red;1--blue;2--green
const int color = 0; 

// 预设值
int blue_color_th = 40;
int red_color_th = 40;
int green_color_th = 40;

// 回调函数
void on_trackbar_color(int pos)
{
	threshold(roi_image, mask_color, pos, 255, CV_THRESH_BINARY); 
	// 图像二值化:1--输入;2--输出;3--阈值;4--当第五个参数取 THRESH_BINARY或THRESH_BINARY_INV时的最大值;5--阈值类型,取THRESH_BINARY时,当前点值大于阈值时,取第四个参数
	imshow("Trackbar", mask_color);
}

int main()
{
	roi_image = imread("H:\\RM.jpg");
	namedWindow("roi_image");
	imshow("roi_image", roi_image);

	vector<cv::Mat> bgr;
	split(roi_image, bgr); // RGB 分割

	// 创建滑动条依附的窗口
	namedWindow("Trackbar", WINDOW_NORMAL);

	if (color == 0)
	{
		subtract(bgr[2], bgr[1], roi_image); // 颜色通道相减
		cvCreateTrackbar("red_color", "Trackbar", &red_color_th, 255, on_trackbar_color);	
		// 创建轨迹条:1--滑动空间的名称;2--滑动空间用于依附的图像窗口的名称;3--初始化阈值;4--滑动控件的刻度范围;5--回调函数
		on_trackbar_color(red_color_th);
	}
	else if(color == 1)
	{
		subtract(bgr[0], bgr[2], roi_image);
		cvCreateTrackbar("blue_color", "Trackbar", &blue_color_th, 255, on_trackbar_color);
		on_trackbar_color(blue_color_th);
	}
	else
	{
		subtract(bgr[1], bgr[2], roi_image);
		cvCreateTrackbar("green_color", "Trackbar", &green_color_th, 255, on_trackbar_color);
		on_trackbar_color(green_color_th);
	}

	waitKey();
	return 0;
}

三、运行效果1

原图:
原图

选择蓝色通道,利用滑动条调节阈值
阈值为40:
滑动条40

阈值为80:
滑动条80

阈值为120:
滑动条120
如果想要从 xml 文件中读取预设阈值,并输出调节后的阈值到 xml 中,可以使用 FileStorage 类,参考程序2。

四、程序2

// 从config.xml读入阈值,并将滑动条调节后的阈值存入output.xml
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

// 声明存储图像的变量
Mat roi_image, mask_color;

// 选择分割通道:0--red;1--blue;2--green
const int color = 0;

// 预设值
int blue_color_th;
int red_color_th;
int green_color_th;

// 回调函数
void on_trackbar_color(int pos)
{
	threshold(roi_image, mask_color, pos, 255, CV_THRESH_BINARY);
	// 图像二值化:1--输入;2--输出;3--阈值;4--当第五个参数取 THRESH_BINARY或THRESH_BINARY_INV时的最大值;5--阈值类型,取THRESH_BINARY时,当前点值大于阈值时,取第四个参数
	imshow("Trackbar", mask_color);

	// 退出时保存滑动条的值
	FileStorage fs("H:\\RM2021\\output.xml", FileStorage::WRITE);
	fs << "blue_color_max" << blue_color_th;
	fs << "red_color_max" << red_color_th;
	fs << "green_color_max" << green_color_th;
}

int main()
{
	roi_image = imread("H:\\RM.jpg");
	namedWindow("roi_image");
	imshow("roi_image", roi_image);

	vector<cv::Mat> bgr;
	split(roi_image, bgr); // RGB 分割

	// 创建滑动条依附的窗口
	namedWindow("Trackbar", WINDOW_NORMAL);
	
	// 加载滑动条的值
	FileStorage fs("H:\\RM2021\\config.xml", FileStorage::READ);

	// 通道参数
	fs["blue_color_max"] >> blue_color_th;
	fs["red_color_max"] >> red_color_th;
	fs["green_color_max"] >> green_color_th;

	if (color == 0)
	{
		subtract(bgr[2], bgr[1], roi_image); // 颜色通道相减
		cvCreateTrackbar("red_color", "Trackbar", &red_color_th, 255, on_trackbar_color);
		// 创建轨迹条:1--滑动空间的名称;2--滑动空间用于依附的图像窗口的名称;3--初始化阈值;4--滑动控件的刻度范围;5--回调函数
		on_trackbar_color(red_color_th);
	}
	else if (color == 1)
	{
		subtract(bgr[0], bgr[2], roi_image);
		cvCreateTrackbar("blue_color", "Trackbar", &blue_color_th, 255, on_trackbar_color);
		on_trackbar_color(blue_color_th);
	}
	else
	{
		subtract(bgr[1], bgr[2], roi_image);
		cvCreateTrackbar("green_color", "Trackbar", &green_color_th, 255, on_trackbar_color);
		on_trackbar_color(green_color_th);
	}

	waitKey();
	return 0;
}

config.xml

<?xml version="1.0"?>

<opencv_storage>
<blue_color_max>60</blue_color_max>
<red_color_max>40</red_color_max>
<green_color_max>80</green_color_max>
</opencv_storage>

五、运行结果2

滑动条的值为75
75

output.xml

<?xml version="1.0"?>

<opencv_storage>
<blue_color_max>75</blue_color_max>
<red_color_max>40</red_color_max>
<green_color_max>80</green_color_max>
</opencv_storage>

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当使用OpenCV进行图像处理时,可以使用滑动调节HSV颜色空间的阈值。下面是一个示例代码,演示了如何创建一个窗口,并在窗口中添加滑动调节HSV阈值: ```python import cv2 def on_trackbar(val): pass # 创建一个空白图像 image = np.zeros((300, 300, 3), dtype=np.uint8) # 创建一个窗口 cv2.namedWindow('Threshold') # 创建滑动 cv2.createTrackbar('Hue Min', 'Threshold', 0, 255, on_trackbar) cv2.createTrackbar('Hue Max', 'Threshold', 255, 255, on_trackbar) cv2.createTrackbar('Saturation Min', 'Threshold', 0, 255, on_trackbar) cv2.createTrackbar('Saturation Max', 'Threshold', 255, 255, on_trackbar) cv2.createTrackbar('Value Min', 'Threshold', 0, 255, on_trackbar) cv2.createTrackbar('Value Max', 'Threshold', 255, 255, on_trackbar) while True: # 获取滑动 hue_min = cv2.getTrackbarPos('Hue Min', 'Threshold') hue_max = cv2.getTrackbarPos('Hue Max', 'Threshold') saturation_min = cv2.getTrackbarPos('Saturation Min', 'Threshold') saturation_max = cv2.getTrackbarPos('Saturation Max', 'Threshold') value_min = cv2.getTrackbarPos('Value Min', 'Threshold') value_max = cv2.getTrackbarPos('Value Max', 'Threshold') # 将图像转换为HSV颜色空间 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 创建一个掩膜,根据滑动阈值化图像 mask = cv2.inRange(hsv, (hue_min, saturation_min, value_min), (hue_max, saturation_max, value_max)) # 显示原始图像和阈值化后的图像 cv2.imshow('Original', image) cv2.imshow('Thresholded', mask) # 按下ESC键退出循环 if cv2.waitKey(1) == 27: break # 销毁窗口 cv2.destroyAllWindows() ``` 在这个示例代码中,我们首先创建了一个空白图像,并创建了一个名为"Threshold"的窗口。然后,我们使用`cv2.createTrackbar()`函数创建了六个滑动,分别用于调节Hue、Saturation和Value的最小和最大阈值。每个滑动都有一个回调函数`on_trackbar()`,但在这个示例中我们暂时不需要它,所以回调函数中只有一个空的`pass`语句。 在主循环中,我们使用`cv2.getTrackbarPos()`函数获取滑动的当前,并将图像转换为HSV颜色空间。然后,我们使用`cv2.inRange()`函数根据滑动创建一个掩膜,将图像阈值化。最后,我们使用`cv2.imshow()`函数显示原始图像和阈值化后的图像。 你可以根据需要调整滑动的初始和范围,并在回调函数中添加适当的处理代码来实现你的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不雨_亦潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值