Функция обратного вызова должна быть статической или глобальной, но вы можете передать ей ссылку на объект, с которым хотите работать (см. это сообщение в списке рассылки OpenCV Users).
Метод createTrackbar имеет параметр userdata
, который передается вызывающей функции.В C есть недокументированный метод cvCreateTrackbar2
, определенный в highgui_c.h
, который имеет ту же функциональность:
CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name,
int* value, int count, CvTrackbarCallback2 on_change,
void* userdata CV_DEFAULT(0));
Эти методы позволяют вам создать класс со статической функцией обратного вызова, которая принимает указатель наобъект этого класса.Вы можете создать трекбар следующим образом:
cv:createTrackbar("Label", "Window" &variable, MAX_VAL, &MyClass::func, this);
Обратный вызов будет выглядеть примерно так:
void MyClass:func(int newValue, void * object) {
MyClass* myClass = (MyClass*) object;
// ...do stuff.
}
Обратите внимание, что вам не нужно явно обновлять переменную самостоятельно, покавы указали на него указатель при создании трекбара (как указано выше), но если вам нужно сначала обработать его, я предлагаю вам установить его явно в функции обратного вызова.