本来还觉得滚动条功能没什么用处,结果今天调canny算子的参数突然发现这个功能的强大,可以实现实时调参,实时观察。
直接上代码:
// 滚动条测试
// 利用滚动条实时调整canny边缘提取算子的两个阈值参数,方便查找最佳参数
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
//全局图片变量
Mat image;
//滚动条参数
#define WINDOW_NAME "【滚动条试验】"//窗体名
#define BAR_NAME1 "Canny1"//滚动条1的名称
#define BAR_NAME2 "Canny2"//滚动条2的名称
#define BAR_NAME3 "Canny1_m"//滚动条3的名称
#define BAR_NAME4 "Canny2_m"//滚动条4的名称
const int CANNY_THESHOLD1_MAX = 200;//CANNY_THESHOLD1最大值
const int CANNY_THESHOLD2_MAX = 200;//CANNY_THESHOLD2最大值
const int CANNY_THESHOLD1_microMAX = 600;//CANNY_THESHOLD1微调量最大值
const int CANNY_THESHOLD2_microMAX = 600;//CANNY_THESHOLD2微调量最大值
int canny_theshold1_value = 5;//theshold1变量
int canny_theshold2_value = 10;//theshold2变量
int canny_theshold1_microvalue = 0;//theshold1微调变量
int canny_theshold2_microvalue = 0;//theshold2微调变量
//滚动条回调函数
void RunTrackBar(int, void*)
{
Mat edge_enhanced_image;
double canny1 = canny_theshold1_value + 0.01*canny_theshold1_microvalue - 3;
double canny2 = canny_theshold2_value + 0.01*canny_theshold2_microvalue - 3;
//Canny边缘增强
Canny(image, edge_enhanced_image, canny1, canny2, 3);
//图片输出
imshow(WINDOW_NAME, edge_enhanced_image);
}
//滚动条试验
void TrackBarTest()
{
//读取图片,灰度化模式
image = imread("image.jpg", IMREAD_GRAYSCALE);
//如果读取失败则报错
if (!image.data)
cout << "图片读取失败!" << endl;
//3x3内核降噪
blur(image, image, Size(3, 3));
//创建窗体
namedWindow(WINDOW_NAME, 1);
//创建滚动条
createTrackbar(BAR_NAME1, WINDOW_NAME, &canny_theshold1_value, CANNY_THESHOLD1_MAX, RunTrackBar);
createTrackbar(BAR_NAME2, WINDOW_NAME, &canny_theshold2_value, CANNY_THESHOLD2_MAX, RunTrackBar);
createTrackbar(BAR_NAME3, WINDOW_NAME, &canny_theshold1_microvalue, CANNY_THESHOLD1_microMAX, RunTrackBar);
createTrackbar(BAR_NAME4, WINDOW_NAME, &canny_theshold2_microvalue, CANNY_THESHOLD2_microMAX, RunTrackBar);
//回调函数
RunTrackBar(1, 0);
//等待用户按键
waitKey(0);
}
int main()
{
TrackBarTest();
return 0;
}
运行结果:
移动滚动条位置后:
调试效果良好。
但是可以看到窗口宽度因为图片宽度而偏小,导致滚动条显示不完全,有待完善。