什么是滑动条
滑动条是 OpenCV 动态调节参数特别好用的工具,它依附于窗口而存在。
创建滑动条
在 OpenCV 中,可以使用createTrackbar函数来创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上。
参考代码
int createTrackbar(const string & trackbarname, const string & winname, int * value, int count, TrackbarCallback onChange = 0, void * userdata = 0)
其中,trackbarname表示我们创建的滑动条的名字。winname表示这个滑动条吸附在的窗口的名字。value表示滑块的位置,在创建时,滑块的初始位置就是该变量的值。count表示滑块可以到达的最大值,最小值始终为 0。onChange表示指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。回调的类型为void xx(int, void*),其中第一个参数表示轨迹条的位置,第二个参数表示用户数据userdata。userdate表示传给回调函数的用户数据。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc_c.h> #include <opencv2/imgproc/types_c.h> #include<opencv2/imgproc.hpp> #include<iostream> using namespace std; using namespace cv; Mat image, srcImage; int thresholds = 50; void threshold_track(int, void*) { Mat result; threshold(srcImage, result, thresholds, 255, THRESH_BINARY); //Canny(srcImage, result, thresholds, thresholds * 3, 3); imshow("边缘检测", result); } int main() { image = cv::imread("...cc.png"); if (!image.data) return 1; cvtColor(image, srcImage, COLOR_BGR2GRAY); namedWindow("边缘检测", WINDOW_AUTOSIZE); createTrackbar("阈值", "边缘检测", &thresholds, 300, threshold_track); waitKey(0); return 0; }
获取当前滑动条位置
在 OpenCV 中,可以使用getTrackbarPos()
函数来获取当前滑动条的位置。
参考代码
int getTrackbarPos(const string& trackbarname, const string& winname);
其中第一个参数表示滑动条的名字,第二个参数表示轨迹条的父窗口的名称。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc_c.h> #include <opencv2/imgproc/types_c.h> #include<opencv2/imgproc.hpp> #include<iostream> using namespace std; using namespace cv; Mat image, srcImage; int thresholds = 50; void threshold_track(int, void*) { Mat result; threshold(srcImage, result, thresholds, 255, THRESH_BINARY); cout << "阈值:" << getTrackbarPos("阈值", "边缘检测") << endl; imshow("边缘检测", result); } int main() { image = cv::imread("C://Users//86173//Desktop//cc.png"); if (!image.data) return 1; cvtColor(image, srcImage, COLOR_BGR2GRAY); namedWindow("边缘检测", WINDOW_AUTOSIZE); createTrackbar("阈值", "边缘检测", &thresholds, 300, threshold_track); waitKey(0); return 0; } 、