OpenCV 2.3 с VS 2008 - События мыши - PullRequest
8 голосов
/ 21 июля 2011

Обязателен - я новичок. Есть работа, которая включает в себя программирование, и я учу себя, как я иду. Само собой разумеется, как учитель, я часто и полностью ошибаюсь.

Где я сейчас нахожусь: я создал класс «График», он (как ни удивительно) создает графики. Но теперь я хочу сделать так, чтобы по щелчку мыши я модифицировал график. Но я не могу заставить обработчик мыши быть функцией-членом класса.

cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse

Не работает с

cv::setMouseCallback(windowName, Graph::onMouse, 0);

Это дает мне отсутствие ошибок параметров. Согласно это я не могу сделать его функцией-членом. После выполнения данного ответа он компилируется, но мой указатель this обнуляется. Тьфу.

OnMouse выглядит так:

void onMouse(int event, int x, int y,int, void*)
{
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        cvMoveWindow("Window", 500, 500); //Just to see if stuff happened
    }
    return;
}

Меня не волнует перемещение окна, я хочу изменить сам график - который хранится как переменная cv :: Mat в объекте Graph. И я не могу понять, как это сделать.

Буду признателен за любую помощь, и я действительно надеюсь, что это не просто бред.

Ответы [ 2 ]

11 голосов
/ 21 июля 2011

Да, функции обратного вызова в C ++ радуют, не так ли? На самом деле вы должны дать OpenCV функцию (а не метод класса), как вы уже узнали. Тем не менее, вы можете взломать этот ужас, используя следующую технику:

class MyClass
{
public:
     void realOnMouse(int event, int x, int y, int flags)
     {
         // Do your real processing here, "this" works fine.
     }
};

// This is a function, not a class method
void wrappedOnMouse(int event, int x, int y, int flags, void* ptr)
{
    MyClass* mcPtr = (MyClass*)ptr;
    if(mcPtr != NULL)
        mcPtr->realOnMouse(event, x, y, flags);
}

int main(int argv, char** argc)
{
    // OpenCV setup stuff...

    MyClass processor;
    cv::setMouseCallback(windowName, wrappedOnMouse, (void*)&processor);

    // Main program logic

    return 0;
}

Этот последний параметр в setMouseCallback весьма полезен для преодоления некоторых проблем, с которыми вы обычно сталкиваетесь, вот так.

1 голос
/ 06 сентября 2011

Вы также можете использовать метод onMouse в качестве статического метода.

class Graph
{
public:
     static void onMouse(int event, int x, int y, void* param)
     {
          //Your code here
     }

     //Everything else you may need
}

Теперь вы сможете вызывать метод onMouse с помощью:

cv::setMouseCallback(windowName, onMouse, (void*) param);

Параметр может быть НЕДЕЙСТВИТЕЛЕН.или все, что вы хотите передать в качестве параметра методу, но вам нужно будет привести тип к нужному типу.

Надеюсь, это было полезно.Bye.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...