Monday, April 20, 2015

OpenCV: Passing Parameters to Trackbar Callback Function

OpenCV Trackbars are created through the system call like below, with a callback function which is called when there is any change on the bar.

createTrackbar("Dummy Trackbar Name", "Dummy Window Name", &pos, max_pos, onTrackbarChange, &u);

Here pos is the pass-by-ref variable that records the current position of trackbar, max_pos denotes its maximum possible value of this variable that the bar can handle. onTrackbarChange is the callback function u is the user data that is passed to the callback function.

onTrackbarChange is prototyped as

void onTrackbarChange(int, void*);

Since there is only limited parameters, the data has to be packaged into an object or a structure like this,

typedef struct {
 Mat* grad;
 Mat* dst;
 Mat* detected_edges;
 int* pos;
 int* ratio;
 int* kernel_size;
 char* window_name;
} userdata;

Of cource, the members within userdata structure could be whatever type you might need. Here I grab a snippet of what my demo is using. Thus you can implement the callback function on demand.

void onTrackbarChange(int pos, void* ud) {
 userdata u = *static_cast(ud);

 // Reduce noise with a kernel 3x3
 blur(*u.grad, *u.detected_edges, Size(3, 3));

 // Canny detector
 Canny(*u.detected_edges, *u.detected_edges, *u.pos, *u.pos*(*u.ratio), *u.kernel_size);

 // Using Canny's output as a mask, we display our result
 *u.dst = Scalar::all(0);

 (*u.grad).copyTo(*u.dst, *u.detected_edges);
 imshow(u.window_name, *u.dst);
        waitKey(0);
}