【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>


相关文章
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
OpenCV这么简单为啥不学——1.8、threshold阈值0-4效果对照图
35 0
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.9、cvtColor颜色空间转换(全色值效果演示)
OpenCV这么简单为啥不学——1.9、cvtColor颜色空间转换(全色值效果演示)
20 0
|
8月前
|
计算机视觉
opencv 之 图像阈值处理
opencv 之 图像阈值处理
|
4月前
|
计算机视觉 Python
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
103 0
|
4月前
|
计算机视觉
OpenCV(五):图像颜色空间转换
OpenCV(五):图像颜色空间转换
54 0
|
6月前
|
计算机视觉 C++
OpenCV-单峰三角阈值法Thresh_Unimodal
OpenCV-单峰三角阈值法Thresh_Unimodal
|
6月前
|
机器学习/深度学习 人工智能 算法
OpenCV-差分法实现绿叶识别(图像差分+颜色通道)
OpenCV-差分法实现绿叶识别(图像差分+颜色通道)
|
6月前
|
算法 计算机视觉
OpenCV-自适应阈值函数cv::adaptiveThreshold
OpenCV-自适应阈值函数cv::adaptiveThreshold
OpenCV-自适应阈值函数cv::adaptiveThreshold
|
6月前
|
算法 计算机视觉
OpenCV-阈值函数cv::threshold
OpenCV-阈值函数cv::threshold
|
8月前
|
计算机视觉
opencv 之 颜色通道提取
opencv 之 颜色通道提取
144 0