当你学习OpenCV的时候,处理一张图片往往需要逐步修改相应的参数才能达到理想的处理效果,这个时候,添加一个滑动条就可以省去往返开启调试功能的麻烦操作。
先上效果图:
主要是三个函数:
第一个函数:创建滑动条
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
参数说明:
trackbarname:滑动条的名称;
winname:滑动条用于依附的图像窗口的名称;
value:初始化阈值;
count:滑动控件的刻度范围;
TrackbarCallback 是自定义的回调函数,其定义形式如下:
typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);
第二个函数:设置滑动条位置
CV_EXPORTS_W void setTrackbarPos(const string& trackbarname, const string& winname, int pos);
参数说明:
trackbarname:滑动条的名称;
winname:滑动条用于依附的图像窗口的名称;
pos :要设置的阈值;
第三个函数:读取滑动条位置
CV_EXPORTS_W int getTrackbarPos(const string& trackbarname, const string& winname);
参数说明:
trackbarname:滑动条的名称;
winname:滑动条用于依附的图像窗口的名称;
完整代码:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
//为窗口标题定义的宏
#define WINDOW_NAME "腐蚀效果图"
//声明存储图像的变量
Mat g_srcImage;
Mat g_dstImage;
//滑动条中最大值----内核的长与宽
const int g_MaxSize = 100;
//滑动条中变量
int g_SizeValueSlider;
char TrackbarName[50];
//-----------------------------------【on_Trackbar( )函数】--------------------------------
// 描述:响应滑动条的回调函数
//------------------------------------------------------------------------------------------
void on_Trackbar(int, void*)
{
if (g_SizeValueSlider < 1)
{
g_SizeValueSlider = 1;
setTrackbarPos(TrackbarName, WINDOW_NAME, g_SizeValueSlider);
}
//获取自定义核,getStructuringElement函数可以获取自定义的形状与尺寸的内核
Mat element = getStructuringElement(MORPH_RECT, Size(g_SizeValueSlider, g_SizeValueSlider));
//用自定义的内核进行腐蚀操作
erode(g_srcImage, g_dstImage, element);
imshow(WINDOW_NAME, g_dstImage);
//获取滑动条当前位置
int l_pos;
l_pos = getTrackbarPos(TrackbarName, WINDOW_NAME);
char l_strpos[20];
sprintf(l_strpos, "当前位置是%d\r\n", l_pos);
printf(l_strpos);
}
//--------------------------------------【main( )函数】-----------------------------------------
int main()
{
//加载图像 (两图像的尺寸需相同)
g_srcImage = imread("F:/Image/girl.jpeg");
if (!g_srcImage.data)
{
printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n");
return -1;
}
//设置滑动条初值为10
g_SizeValueSlider = 10;
//创建窗体
namedWindow(WINDOW_NAME, 0);
//在创建的窗体中创建一个滑动条控件
sprintf(TrackbarName, "内核%d", g_MaxSize);
createTrackbar(TrackbarName, WINDOW_NAME, &g_SizeValueSlider, g_MaxSize, on_Trackbar);
//结果在回调函数中显示
on_Trackbar(g_SizeValueSlider, 0);
//按任意键退出
waitKey(0);
destroyAllWindows();
return 0;
}