cvSetMouseCallback в OpenCV 2.1 Managed C ++ (CLI / C ++) - PullRequest
3 голосов
/ 27 июня 2011

Мое имя класса - HandMotionRecognition, и я вызываю метод getColorPixel при обратном вызове мыши.Это в OpenCV с использованием Visual Studio 2010, и тип проекта - c ++ -> cli.

Стандартный код (если я не ошибаюсь) для обработки событий мыши -

cvSetMouseCallback( "CameraIn", getColorPixel, (void*) frameHSV);

Но когда якомпиляция выдает ошибку времени компиляции

ошибка C3867: 'HandMotionRecognition :: getColorPixel': вызов функции отсутствует список аргументов;используйте '& HandMotionRecognition :: getColorPixel', чтобы создать указатель на член

Затем я делаю, как я сказал, и помещаю код следующим образом ...

cvSetMouseCallback( "CameraIn", &HandMotionRecognition::getColorPixel, (void*) frameHSV);

Но снова я получаюошибка компиляции ..

ошибка C3374: невозможно получить адрес 'HandMotionRecognition :: getColorPixel', если не создается экземпляр делегата

Так что я создаю такой делегат... [создание делегата .. Я не знаю, что это на 100% правильно]

  1. Я положил delegate void MouseCallbackDelegate( int event, int x, int y, int flags, void *param ); в HandMotionRecognition.h

  2. Iпоместите этот код в HandMotionRecognition.cpp вместо cvSetMouseCallback( "CameraIn", &HandMotionRecognition::getColorPixel, (void*) frameHSV);

    MouseCallbackDelegate ^StaticDelInst = gcnew MouseCallbackDelegate(this, &HandMotionRecognition::getColorPixel);
    

    cvSetMouseCallback ("CameraIn", StaticDelInst, (void *) frameHSV);

Но этозатем выдает ошибку компиляции: (это единственная ошибка, которую я получаю)

ошибка C2664: «cvSetMouseCallback»: невозможно преобразовать параметр 2 из «HandMotionRecognition :: MouseCallbackDelegate ^» в «CvMouseCallback»

(Насколько я могу видеть ... это связано с использованием cli вместо win32)

Есть ли обходной путь или я здесь что-то не так делаю ???

Пожалуйста, помогите ...

1 Ответ

4 голосов
/ 27 июня 2011

Метод обратного вызова должен быть статическим (или не являющимся членом функции), как вы обнаружили.Стандартная идиома в этом случае - передать указатель экземпляра класса в параметре void* param и использовать функцию static для вызова функции-члена.Поскольку в настоящее время вы используете param для хранения frameHSV, вам нужно передать его другим способом (например, путем сохранения его в экземпляре вашего класса).

Пример:

class HandMotionRecognition { 
/* your code */
private:
  void getPixelColor(int event, int x, int y, int flags, void* param) {
  }
public:
  static void mouseCallback(int event, int x, int y, int flags, void* param) {
    static_cast<HandMotionRecognition*>(param)->getPixelColor(event, x, y, flags);       
  }
}

И зарегистрироваться:

HandMotionRecognition* hmr = /* ... */
hmr->setFrameHSV(frameHSV);
cvSetMouseCallback("CameraIn", &HandMotionRecognition::mouseCallback, hmr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...