有时候需要对 opencv 某个函数进行动态调参,这时候就要使用到 opencv 提供的滑动条工具
该滑动条滑动时可以动态的改变我们的参数,对图像处理时有非常好的辅助效果
该滑动条是由 createTrackbar() 函数创建
二、createTrackbar 函数createTrackbar 函数原型
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
trackbarname:滑动条的名字(就是滑动条旁边那个标签名字)
winname : 附在的窗口名字(要与 cv::namedWindow 创建的名字一致 )
value: 就是滑动条当前位置的值
count: 滑动条最大的值
onChange : 这是一个回调函数,要传一个函数指针进去
userdata: 用户自定义的数据,比如你想传什么数据过去
TrackbarCallback onChange 回调函数原型
三、测试例子typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);
举个栗子,可以这样定义
static void onTrack(int pos, void* usrdata) { cv::subtract(*((cv::Mat*)usrdata), cv::Scalar(pos, pos, pos), dst); cv::imshow(window_name, dst); }
#include#include cv::Mat src, dst; const char *window_name = "滑块调整图像亮度";// 窗口名字 int light_value_cur = 50; // 初始亮度值 int light_value_max = 255; // 亮度最大值 // 滑块回调函数 static void onTrack(int pos, void* usrdata) { cv::subtract(*((cv::Mat*)usrdata), cv::Scalar(pos, pos, pos), dst); cv::imshow(window_name, dst); } int main() { src = cv::imread("./image/4.jpg"); if (src.empty()) { std::cout << "imread image fail!" << std::endl; return -1; } cv::namedWindow(window_name, cv::WINDOW_AUTOSIZE); // 创建鼠标滑块 范围[0, light_value_max] cv::createTrackbar(cv::String("亮度:"), window_name, &light_value_cur, light_value_max, onTrack, &src); onTrack(50, &src); // 手动调用,方便图像根据值进行初始化 cv::waitKey(0); cv::destroyAllWindows(); return 0; }
调试结果
四、_End
1



