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

简介: 【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:



阈值为80:



阈值为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




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>


相关文章
|
7月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
72 0
|
5月前
|
计算机视觉 Python
opencv识别颜色
opencv识别颜色
|
4月前
|
计算机视觉 C++
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
这篇文章介绍了基于HSV颜色空间的图像分割原理,包括HSV模型的基本概念和如何在OpenCV中通过设置HSV的色彩范围来实现图像中特定颜色的物体分割,并通过示例代码展示了在静态图像和视频流中进行颜色分割的方法。
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
|
4月前
|
算法
OpenCV-Python】滑动条Trackbar的创建和使用(createTrackbar())
该文章介绍了如何在OpenCV-Python中创建和使用滑动条(Trackbar)来动态调节参数,并通过实际代码示例演示了如何通过滑动条控制图像颜色。
|
4月前
|
计算机视觉
OpenCV滑动条(createTrackbar()函数)如何在多个维度进行同步调整?
这篇文章介绍了如何在OpenCV中使用`createTrackbar()`函数创建多个滑动条以同步调整图像的多个维度(如亮度和对比度),通过将不同滑动条的回调函数合并为一个,确保它们在同一图像基础上进行调整。
|
6月前
|
存储 Cloud Native Linux
OpenCV随机数与随机颜色绘制
OpenCV随机数与随机颜色绘制
|
6月前
|
计算机视觉
OpenCV亮度对比度调节
OpenCV亮度对比度调节
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像阈值操作 threshold】
【Qt&OpenCV 图像阈值操作 threshold】
73 0
|
7月前
|
前端开发 计算机视觉 C++
【OpenCV】—分离颜色通道、多通道图像混合
【OpenCV】—分离颜色通道、多通道图像混合
|
7月前
|
计算机视觉
OpenCV图像阈值
OpenCV图像阈值
31 0

热门文章

最新文章