找回密码
 立即注册
首页 业界区 安全 【OpenCV教程】Trackbar到底怎么用?

【OpenCV教程】Trackbar到底怎么用?

郦珠雨 昨天 18:55
@
目录

  • 1.createTrackbar创建滚动条

    • 1.1 API

  • 2.getTrackbarPos获得滚动条当前的值
  • 3.使用方式一(recommended)

    • 3.1 原理
    • 3.2 效果

  • 4.使用方式二

    • 4.1 原理
    • 4.2 效果


1.createTrackbar创建滚动条

1.1 API
  1. CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
  2.                               int* value, int count,
  3.                               TrackbarCallback onChange = 0,
  4.                               void* userdata = 0);
复制代码

  • 参数如下
参数含义trackbarname滚动条名字winname(window name)窗体名字。要先用nameWindow创建好同名窗体,滚动条才会出现value欲控制的变量的地址count欲控制的变量的最大值(最小为0)onChange回调函数,默认为空。如果想要传入,那么其参数是固定的userdata万能指针,默认为空。如果想要传入,通常用一个类的对象的地址。作为可使用的数据库,用来给回调函数提供变量支持
  1. void onChange(int,void*);
复制代码
2.getTrackbarPos获得滚动条当前的值
  1. 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 效果
  1. Mat xuenai = imread("xuenai.jpg");
  2. imshow("xuenai",xuenai);
  3. namedWindow("xuenai_rotate");
  4. Mat xuenai_rotate(xuenai.size(), xuenai.type());
  5. createTrackbar("angle","xuenai_rotate", nullptr,360);
  6. while (1) {
  7.     int angle= getTrackbarPos("angle","xuenai_rotate");
  8.     Mat M = getRotationMatrix2D(Point2f(xuenai.cols / 2, xuenai.rows / 2), angle, 1);
  9.     warpAffine(xuenai, xuenai_rotate, M, xuenai.size());
  10.     imshow("xuenai_rotate",xuenai_rotate);
  11.     waitKey(20);
  12. }
复制代码
1.png

2.png

4.使用方式二

4.1 原理

不使用getTrackbarPos函数,使用createTrackbar的全部参数,在onChange回调函数中完成所有操作,由于回调函数的参数表是固定的,因此需要userdata传入所需数据。在每次移动滚动条时,相当于调用了一次回调函数,就完成了操作。结尾没有waitKey(0)就显示不了多久。
4.2 效果
  1. class TrackbarUserdata{
  2. public:
  3.     Mat input;
  4.     Mat output;
  5.     int angle=0;
  6.     string winname;
  7. };
  8. void RotateonChange(int,void *userdata) {
  9.     TrackbarUserdata *data = (TrackbarUserdata *) userdata;
  10.     int rows = data->input.rows;
  11.     int cols = data->output.cols;
  12.     Mat M = getRotationMatrix2D(Point2f(rows / 2, cols / 2), data->angle, 1);
  13.     warpAffine(data->input,data->output,M,data->input.size());
  14.     imshow(data->winname,data->output);
  15.     waitKey(10);
  16. }
  17. int main(){
  18.     Mat xuenai = imread("xuenai.jpg");
  19.     imshow("xuenai",xuenai);
  20.     Mat xuenai_rotate(xuenai.size(), xuenai.type());
  21.   
  22.     TrackbarUserdata userdata;
  23.     userdata.input=xuenai;
  24.     userdata.output=xuenai_rotate;
  25.     userdata.winname="xuenai_rotate";
  26.     namedWindow(userdata.winname);
  27.     createTrackbar("angle",userdata.winname, &userdata.angle,360, RotateonChange,&userdata);
  28.     waitKey();
  29.   
  30.     return 0;
  31. }
复制代码
3.png

4.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册