Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> <unresolved overloaded function type> 
V
    Опции темы
Xonxt
Дата 14.7.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Доброе время суток.
Возникла следующая проблема.

Пишу небольшую программу, использующую openCV. 

Есть функция processVideo(), в которой осуществляется захват изображения с камеры и его вывод на экран: 
Код
void processVideo(callback_prototype custom_cb) {
    CvCapture *capture = 0;
    capture = cvCaptureFromCAM(-1);

    cvNamedWindow("result", CV_WINDOW_AUTOSIZE);

    IplImage* frame = 0;
    while (true) 
    {
        IplImage* processed_frame = (*custom_cb)(frame);

        // Display processed frame
        cvShowImage("result", processed_frame);
    
        // Release resources
        cvReleaseImage(&processed_frame);
    }

    cvDestroyWindow("result");
    cvReleaseCapture(&capture);
}
 И есть вторая функция - processFrame(), в которой осуществляется некоторая обработка кадра: 
Код
IplImage* LicensePlateRecognizer::processFrame(IplImage* frame) {  
  IplImage* newFrame;

  newFrame = cvCloneImage(frame);

  // ... Некоторая обработка кадра

  return newFrame; 
}
Кроме того, деляется typedef следующего вида: 
Код
typedef IplImage* (*callback_prototype)(IplImage*);
 и непосредственно вызов всего этого добра выглядит вот так: 
Код
int main(int argc, char **argv)
{  
  processVideo(processFrame); 
    
  return 0;
}
 И всё это, как ни странно, работает нормально. Сам код был взят из какого-то примера по openCV.
Но вот мне захотелось (не спрашивайте зачем, может просто для тренировки?) переделать все и засунуть в некий класс.
Получается что-то вроде этого: 
Код
class MyClass {
private:
  typedef IplImage* (*callback_prototype)(IplImage*);
  IplImage* processFrame(IplImage* frame);
  void processVideo(callback_prototype custom_cb);
public:
  void start();
};

void MyClass::start() {  
  processVideo(processFrame);
}

IplImage* MyClass::processFrame(IplImage* frame) { 
 // тут то же самое, что выше ...
}

void LicensePlateRecognizer::processVideo(callback_prototype custom_cb) {      
// то же самое ...
}

int main(int argc, char **argv) {  
  MyClass *test = new MyClass();
  
  test->start();
    
  return 0;
}
При компиляции всего этого добра выдаётся следующая ошибка:
Код
camtest.cpp: In member function ‘void MyClass::start()’:
camtest.cpp:61: error: no matching function for call to ‘MyClass::processVideo(<unresolved overloaded function type>)’
camtest.cpp:34: note: candidates are: void MyClass::processVideo(IplImage* (*)(IplImage*))
make: *** [all] Error 1
Прошу помощи. 

Я понимаю что моё ООП очень сильно хромаёт на все конечности... но всё же.
PM MAIL ICQ Skype   Вверх
boostcoder
Дата 14.7.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Xonxt @  14.7.2011,  19:50 Найти цитируемый пост)
typedef IplImage* (*callback_prototype)(IplImage*);

тут ты тайпдефишь указатель на функцию.

и метод MyClass::processVideo() так же ожидает указатель на функцию.

а тут:
Цитата(Xonxt @  14.7.2011,  19:50 Найти цитируемый пост)
processVideo(processFrame);

ты передаешь указатель на метод.

по идее, можно решить с помощью промежуточного статического метода. т.е. указатель на этот статический метод передавай в "processVideo(processFrame);". а сам этот метод внутрях должен вызывать реальный метод "MyClass::processFrame()"

надеюсь понятно объяснил...
PM WWW   Вверх
Xonxt
Дата 14.7.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Цитата(boostcoder @ 14.7.2011,  19:02)
Цитата(Xonxt @  14.7.2011,  19:50 Найти цитируемый пост)
typedef IplImage* (*callback_prototype)(IplImage*);

тут ты тайпдефишь указатель на функцию.

и метод MyClass::processVideo() так же ожидает указатель на функцию.

а тут:
Цитата(Xonxt @  14.7.2011,  19:50 Найти цитируемый пост)
processVideo(processFrame);

ты передаешь указатель на метод.

по идее, можно решить с помощью промежуточного статического метода. т.е. указатель на этот статический метод передавай в "processVideo(processFrame);". а сам этот метод внутрях должен вызывать реальный метод "MyClass::processFrame()"

надеюсь понятно объяснил...

Т.е. что-то типа этого:
Код
static IplImage* Foo()
{
  MyClass::processFrame();
}

...

int main(int argc, char **argv)
{  
  processVideo(Foo); 
    
  return 0;
}


Кстати я видел примеры, что подобная ситуация разрешалась использованием некой библиотеки "Boost". Но когда я увидел сколько она весит, то я ужаснулся. Учитывая что у меня тут и так уже висит openCV в купе с Матлабом.

Это сообщение отредактировал(а) Xonxt - 14.7.2011, 22:12
PM MAIL ICQ Skype   Вверх
boostcoder
Дата 14.7.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Xonxt @  14.7.2011,  22:08 Найти цитируемый пост)
подобная ситуация разрешалась использованием некой библиотеки "Boost"

да. при помощи boost::bind()/
но опять же, в данном случае это будет не выход, т.е. boost::bind() создает функциональный объект, а функция cvReleaseImage() ожидает аргументом указатель на IplImage.
и вообще, функция cvReleaseImage() - это Си-функция. поэтому функциональный объект она не поймет.


Цитата(Xonxt @  14.7.2011,  22:08 Найти цитируемый пост)
Т.е. что-то типа этого:

можно и типа этого. только в функцию Foo() нужно передать адрес класса, и адрес метода.
PM WWW   Вверх
Xonxt
Дата 14.7.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Цитата(boostcoder @ 14.7.2011,  21:13)
Цитата(Xonxt @  14.7.2011,  22:08 Найти цитируемый пост)
Т.е. что-то типа этого:

можно и типа этого. только в функцию Foo() нужно передать адрес класса, и адрес метода.

Хм, если можно приблизительный пример. А то как раз с указателя на метод проблема и началась.
PM MAIL ICQ Skype   Вверх
boostcoder
Дата 14.7.2011, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Xonxt @  14.7.2011,  22:08 Найти цитируемый пост)
Но когда я увидел сколько она весит

в исходниках она имеет большой объем. а при компиляции приложения с ней, объем исполняемого файла вырастит совсем чуток, по сравнению с той же OpenCV ;)

Добавлено через 12 минут и 23 секунды
запутался.. smile 
PM WWW   Вверх
Xonxt
Дата 14.7.2011, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Цитата(boostcoder @ 14.7.2011,  21:18)
Цитата(Xonxt @  14.7.2011,  22:08 Найти цитируемый пост)
Но когда я увидел сколько она весит

в исходниках она имеет большой объем. а при компиляции приложения с ней, объем исполняемого файла вырастит совсем чуток, по сравнению с той же OpenCV ;)

Добавлено @ 22:31
запутался.. smile

А примера кода не будет? А то я тут уже эникейством заниматься начал.
PM MAIL ICQ Skype   Вверх
boostcoder
Дата 14.7.2011, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Xonxt @  14.7.2011,  22:42 Найти цитируемый пост)
А примера кода не будет?

будет.
моцг под вечер плохо соображает..
PM WWW   Вверх
Xonxt
Дата 14.7.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Я вроде примерно разобрался.
Выглядит это вот так:
Код
typedef IplImage* (*callback_prototype)(IplImage*, MyClass*)
...
void MyClass::processVideo(callback_prototype custom_cb) {
    ...
    while (true) 
    {
        IplImage* processed_frame = (*custom_cb)(frame, this);
        ...
    }
    ...
}
...
static IplImage* Foo(IplImage* frame, MyClass* mcl)
{
    return mcl->processFrame(frame);
}
...
void MyClass::start() {  
  processVideo(Foo);
}

Однако оно не работает. Т.е. если поставить куда-то в processFrame какой-то маркер, типа вывода символа "!" в консоль, то видно, что оно срабатывает только один раз, а затем виснет.

Добавлено через 5 минут и 39 секунд
Хмык, странно. И пару раз даже запустилось и сработало. Видимо где-то с утечками памяти намудрил. Или просто руки кривые.
PM MAIL ICQ Skype   Вверх
Xonxt
Дата 15.7.2011, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



В общем, вроде с проблемой разобрался.
Просто убрал нафиг этот callback и передачу ссылки на метод. Сделал простое присваивание а ля "картинка = Метод(картинка)".

И всё же интересно почему предыдущий код не работал. 
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.