一.实现目标
首先对图像 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>