[C++] TrackbarCallback 回调函数必须为 void(int,void*)

TrackbarCallback 回调函数必须为 void(int,void*),如果你用了传其它参数的函数,对不起,报错与cv::TrackbarCallback类型的形参不兼容。
同时,这也代表里面用的参数可能得设置成全局变量了,虽然有时候设置过多的全局变量回很复杂,但这里似乎不可避免,首先这里的参数肯定有需要改变的,不能用define,不然你也没必要使用trackbar,其次就是上面说的,会调函数不能传参,也就是每次修改以后,不能通过传参让回调函数知道”这个参数已经被改变了,重新给我算一次“。

----------------------------------------反省的分割线---------------------------------------------------------------------------

之前对TrackbarCallback 理解的不够深入,上面所说的代码风格的缺陷实际上是有办法解决的。
解决办法是引入一个指针,这个指针可以指向一个结构体,而结构体里定义了一系列需要用到的变量。具体如以下代码

//要引入 improc.hpp
struct ED_DATA{
    Mat src'
    Mat dst;
    int elem;
    int size;
    ED_DATA(Mat &s,int e_elem = 0,int e_size = 0):src(s),elem(e_elem),size(e_size){}
};
void Dilation_size(int bar_val,void* data){
    ED_DATA dl_data = *(ED_DATA*)data;    
    int dilation_type;
    if(dl_data.elem ==0){ dilation_type == MORPH_RECT;}
    if(dl_data.elem ==1){ dilation_type == MORPH_CROSS;}
    if(dl_data.elem ==2){ dilation_type == MORPH_ELLIPSE;}
    Mat element = getStructuringElement(dilation_type,Size(2*bar_val+1,2*bar_val+1),Point(bar_val,bar_val));
    erode(dl_data.src,dl_data.dst,element);
}

这样,bar_val就成了最后要滑动的变化值,而void型指针data被初始化为了ED_DATA型的指针后,也拥有了需要改变的其它变量,例如这里dilation type,它可以决定用什么样的元素取腐蚀。

在createTrackbar中,要将一个变量的地址传给 int *value,同时也要传入数据结构data 也就是定义的结构体,函数内部会又自动传给上述函数

posted @ 2018-08-03 15:38  zengzhaocheng  阅读(882)  评论(0编辑  收藏  举报