【OpenCV教程】Trackbar到底怎么用?
1.createTrackbar创建滚动条1.1 APICV_EXPORTS int createTrackbar(const String trackbarname, const String winname, int* value, int count, TrackbarCallback onChange 0, void* userdata 0);参数如下参数含义trackbarname滚动条名字winname(window name)窗体名字。要先用nameWindow创建好同名窗体滚动条才会出现value欲控制的变量的地址count欲控制的变量的最大值最小为0onChange回调函数默认为空。如果想要传入那么其参数是固定的userdata万能指针默认为空。如果想要传入通常用一个类的对象的地址。作为可使用的数据库用来给回调函数提供变量支持void onChange(int,void*);2.getTrackbarPos获得滚动条当前的值CV_EXPORTS_W int getTrackbarPos(const String trackbarname, const String winname);参数如下参数含义trackbarname滚动条名字winname(window name)窗体名字3.使用方式一(recommended)3.1 原理不使用createTrackbar函数的参数value、onChange、userdata参数。通过while(1)的无限循环在循环中不断地用getTrackbarPos函数动态地获取滚动条的值然后在循环内部用这些值进行操作。3.2 效果Mat xuenai imread(xuenai.jpg); imshow(xuenai,xuenai); namedWindow(xuenai_rotate); Mat xuenai_rotate(xuenai.size(), xuenai.type()); createTrackbar(angle,xuenai_rotate, nullptr,360); while (1) { int angle getTrackbarPos(angle,xuenai_rotate); Mat M getRotationMatrix2D(Point2f(xuenai.cols / 2, xuenai.rows / 2), angle, 1); warpAffine(xuenai, xuenai_rotate, M, xuenai.size()); imshow(xuenai_rotate,xuenai_rotate); waitKey(20); }4.使用方式二4.1 原理不使用getTrackbarPos函数使用createTrackbar的全部参数在onChange回调函数中完成所有操作由于回调函数的参数表是固定的因此需要userdata传入所需数据。在每次移动滚动条时相当于调用了一次回调函数就完成了操作。结尾没有waitKey(0)就显示不了多久。4.2 效果class TrackbarUserdata{ public: Mat input; Mat output; int angle0; string winname; }; void RotateonChange(int,void *userdata) { TrackbarUserdata *data (TrackbarUserdata *) userdata; int rows data-input.rows; int cols data-output.cols; Mat M getRotationMatrix2D(Point2f(rows / 2, cols / 2), data-angle, 1); warpAffine(data-input,data-output,M,data-input.size()); imshow(data-winname,data-output); waitKey(10); } int main(){ Mat xuenai imread(xuenai.jpg); imshow(xuenai,xuenai); Mat xuenai_rotate(xuenai.size(), xuenai.type()); TrackbarUserdata userdata; userdata.inputxuenai; userdata.outputxuenai_rotate; userdata.winnamexuenai_rotate; namedWindow(userdata.winname); createTrackbar(angle,userdata.winname, userdata.angle,360, RotateonChange,userdata); waitKey(); return 0; }