一、知识点
1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange = 0, void * userdata = 0);
(1)、创建一个滑动条并将其附在指定窗口上。
(2)、参数说明:
trackbarname: 创建的滑动条显示名称。
winname: 包含滑动条的窗口名称。
value: 将由滑动条更改的整数值的指针。
count: 滑动条的最大位置。
onChange: 回调函数,每次滑块改变位置时会调用此函数。 函数原型void Foo(int, void *),第一个参数是滑动条位置,第二个参数是用户数据。 如果为nullptr,则不会调用回调函数,但是value仍然自动更新。
userdata: 用户数据,传递给回调函数。
二、示例代码: 通过滑动条来调整图像亮度
#include <iostream>
#include <opencv2/opencv.hpp>
void onTrackAdd(int value, void * pSrc)
{
cv::Mat src = ((cv::Mat *)pSrc)->clone();
cv::Mat temp = cv::Mat::zeros(src.size(), CV_8UC3);
temp = cv::Scalar(value, value, value);
cv::Mat dst;
cv::add(src, temp, dst);
cv::imshow("亮度增加", dst);
}
void onTrackSub(int value, void * pSrc)
{
cv::Mat src = ((cv::Mat *)pSrc)->clone();
cv::Mat temp = cv::Mat::zeros(src.size(), CV_8UC3);
temp = cv::Scalar(value, value, value);
cv::Mat dst;
cv::subtract(src, temp, dst);
cv::imshow("亮度减少", dst);
}
int main()
{
cv::Mat src = cv::imread("../images/8.png");
if (src.empty())
{
std::cout << "load src image error..." << std::endl;
return -1;
}
cv::imshow("原始图像", src);
int valueAdd = 50;
cv::namedWindow("亮度增加", cv::WINDOW_AUTOSIZE);
cv::createTrackbar("亮度+", "亮度增加", &valueAdd, 100, onTrackAdd, &src);
int valueSub = 50;
cv::namedWindow("亮度减少", cv::WINDOW_AUTOSIZE);
cv::createTrackbar("亮度-", "亮度减少", &valueSub, 100, onTrackSub, &src);
cv::waitKey(0);
return 0;
}