Fresh 0 Жалоба Опубликовано June 8, 2012 Здравствуйте. Подскажите, каким образом можно показать полученное изображение на экране но по заданным координатам? (допустим, экран 1024*768, а изображение размером 100*50 должно показаться на экране по координате x=20, y=30). Программа консольная, написанная на MSVS2010. Сейчас показывается так: // окно для отображения картинки cvNamedWindow("original",CV_WINDOW_AUTOSIZE); // показываем картинку cvShowImage("original",image); Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 8, 2012 Спасет Вас ROI: http://robocraft.ru/blog/computervision/289.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано June 8, 2012 думаю, нет, ROI тут не помощник. Видимо, плохо объяснил. Есть изображение. Его вывожу на экран с помощью cvShowImage("original",image); Но окошко с изображением появляется каждый раз в разных местах, а мне нужно, чтобы всегда в одном месте. допустим, слева в верхнем углу. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 8, 2012 Тогда SetWindowPos 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано June 13, 2012 Оказалось достаточно cvMoveWindow. Такая проблема. Есть такое: // обработчик событий от мышки void myMouseCallback( int event, int x, int y, int flags, void* param ) { IplImage* img = (IplImage*) param; switch( event ) { case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: printf("%d x %d\n", x, y); break; case CV_EVENT_LBUTTONUP: break; } } Кусочек из main() //вывод картинки по заданным координатам и клик мышью с записью координаты cvNamedWindow( "Window", CV_WINDOW_AUTOSIZE ); cvMoveWindow("Window", 500, 100); cvShowImage( "Window", bin ); cvSetMouseCallback( "Window", myMouseCallback, (void*) bin); cvWaitKey(0); //тут дальнейшие обработки cvReleaseImage(&bin); cvDestroyAllWindows(); Получаю координату клика мыши. При этом нужно убрать с экрана (закрыть) cvShowImage( "Window", bin ); (можно, конечно, дать координату где-то за границей экрана, но ...) и продолжить работу в программе... Заранее благодарен. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 13, 2012 Можно попробовать через: cvDestroyWindow [/code] или через WinAPI [code] HWND myWin = *((HWND *)cvGetWindowHandle( "windowName" )); и затем ShowWindow http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx или здесь 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано June 13, 2012 // обработчик событий от мышки void myMouseCallback( int event, int x, int y, int flags, void* param ) { IplImage* img = (IplImage*) param; switch( event ) { case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: printf("%d x %d\n", x, y); break; case CV_EVENT_LBUTTONUP: break; } } Кусочек из main() //вывод картинки по заданным координатам и клик мышью с записью координаты cvNamedWindow( "Window", CV_WINDOW_AUTOSIZE ); cvMoveWindow("Window", 500, 100); cvShowImage( "Window", bin ); cvSetMouseCallback( "Window", myMouseCallback, (void*) bin); cvWaitKey(0); //заставляет нажать на клавиатуре кнопку, но клавиатуры нет и хотелось бы избавиться от этого шага сvDestroyWindows("Window"); //тут дальнейшие обработки сvDestroyWindows("Window"); - закрывает окно. То что нужно. Подскажите, как ждать клика мыши по картинке и после этого не нажимая ничего на клавиатуре сразу продолжить обработки Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 13, 2012 Думаю что можно сделать что то в таком духе (вместо cvWaitKey(0) ; ) : while(!flag) { cvWaitKey(10); }[/code] flag - глобальная переменная, устанавливаемая в true при нажатии на кнопку мыши. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано June 14, 2012 Всё. Сдаюсь. Не работает int flags = 0; // обработчик событий от мышки void myMouseCallback( int event, int x, int y, int flags, void* param) { IplImage* img = (IplImage*) param; switch( event ) { case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: printf("%d x %d\n", x, y); flags = 1; break; case CV_EVENT_LBUTTONUP: break; } } int main () { ... cvNamedWindow( "Window", CV_WINDOW_AUTOSIZE ); cvMoveWindow("Window", 50, 300); cvShowImage( "Window", img_crop ); cvSetMouseCallback( "Window", myMouseCallback, (void*) img_crop); while(!flags) { cvWaitKey(10); } cvDestroyWindow("Window"); ... } + еще бы координату по икс достать из обработчика Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 14, 2012 А в чем выражается, то что не работает? Я пока вижу, что flags обнуляется только вначале. Координаты можно сделать глобальными, о тогда их можно будет считать в основной программе, но правильнее соорудить структуру или класс, который содержит все передаваемые данные (изображение, координаты и т.п.) и передавать их через void* param. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано June 14, 2012 А в чем выражается, то что не работает? Выводит картинку, кликаю мышкой по ней.. printf() - пишет координаты x и y ... снова кликаю и снова координаты ... и так до бесконечности. А нужно, чтобы после первого клика координаты записались в переменную (это еще подумаю как сделать), картинка закрылась и пошла дальнейшая обработка. но правильнее соорудить структуру или класс, тяжело новичкам ).. пойду в библиотеку - почитаю Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 14, 2012 поменяйте flags на другое имя int flags = 0; // обработчик событий от мышки void myMouseCallback( int event, int x, int y, int flags, void* param) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано June 15, 2012 изменил, НО ничего в поведении программы не изменилось Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 15, 2012 Я у себя проверял, щелкаешь мышкой окно - закрывается. Приделал еще передачу x, передачу blblbl - приделаете в качестве упражнения class MyParams { public: IplImage* Img; int x; }; int blblbl = 0; // обработчик событий от мышки void myMouseCallback( int event, int x, int y, int flags, void* param) { MyParams* par=(MyParams*) param; IplImage* img = par->Img; //(IplImage*) param; switch( event ) { case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: printf("%d x %d\n", x, y); blblbl = 1; par->x=x; break; case CV_EVENT_LBUTTONUP: break; } } int main () { IplImage* img_crop=cvLoadImage("c:\\ImagesForTest\\lena.jpg"); cvNamedWindow( "Window", CV_WINDOW_AUTOSIZE ); cvMoveWindow("Window", 50, 300); cvShowImage( "Window", img_crop ); MyParams* p=new MyParams; p->Img=img_crop; cvSetMouseCallback( "Window", myMouseCallback, (void*) p); while(!blblbl) { cvWaitKey(10); } cout << "X from callback =" << p->x << endl; delete p; cvDestroyWindow("Window"); } [/code] 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано June 15, 2012 Smorodov, огромное спасибо. Рабооооотает Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах