继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

UnderTurrets
关注TA
已关注
手记 48
粉丝 1
获赞 2

@TOC


1.createTrackbar创建滚动条

1.1 API


CV_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 | 欲控制的变量的最大值(最小为0) |

| onChange | 回调函数,默认为空。如果想要传入,那么其参数是固定的 |

| 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 angle=0;

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.input=xuenai;

userdata.output=xuenai_rotate;

userdata.winname="xuenai_rotate";

namedWindow(userdata.winname);

createTrackbar("angle",userdata.winname, &userdata.angle,360, RotateonChange,&userdata);

waitKey();

return  0;

}

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP