Перейти к содержимому
Compvision.ru
Fresh

Показать изображение по координатам

Recommended Posts

Здравствуйте. Подскажите, каким образом можно показать полученное изображение на экране но по заданным координатам?

(допустим, экран 1024*768, а изображение размером 100*50 должно показаться на экране по координате x=20, y=30).

Программа консольная, написанная на MSVS2010.

Сейчас показывается так:

        // окно для отображения картинки

        cvNamedWindow("original",CV_WINDOW_AUTOSIZE);


        // показываем картинку

        cvShowImage("original",image);

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

думаю, нет, ROI тут не помощник.

Видимо, плохо объяснил.:)

Есть изображение. Его вывожу на экран с помощью cvShowImage("original",image);

Но окошко с изображением появляется каждый раз в разных местах, а мне нужно, чтобы всегда в одном месте.

допустим, слева в верхнем углу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тогда SetWindowPos

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Оказалось достаточно 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 ); (можно, конечно, дать координату где-то за границей экрана, но ...)

и продолжить работу в программе...

Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно попробовать через:


cvDestroyWindow
[/code] или через WinAPI
[code]
HWND myWin = *((HWND *)cvGetWindowHandle( "windowName" ));

и затем ShowWindow

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx

или здесь

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

// обработчик событий от мышки

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"); - закрывает окно. То что нужно.

Подскажите, как ждать клика мыши по картинке и после этого не нажимая ничего на клавиатуре сразу продолжить обработки

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю что можно сделать что то в таком духе (вместо cvWaitKey(0) ; ) :

while(!flag)
{
cvWaitKey(10);
}[/code]

flag - глобальная переменная, устанавливаемая в true при нажатии на кнопку мыши.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всё. Сдаюсь. Не работает :(

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");

  ...

}

+ еще бы координату по икс достать из обработчика

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А в чем выражается, то что не работает?

Я пока вижу, что flags обнуляется только вначале.

Координаты можно сделать глобальными, о тогда их можно будет считать в основной программе,

но правильнее соорудить структуру или класс, который содержит все передаваемые данные (изображение, координаты и т.п.) и передавать их через void* param.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
А в чем выражается, то что не работает?

Выводит картинку, кликаю мышкой по ней.. printf() - пишет координаты x и y ... снова кликаю и снова координаты ... и так до бесконечности.

А нужно, чтобы после первого клика координаты записались в переменную (это еще подумаю как сделать), картинка закрылась и пошла дальнейшая обработка.

но правильнее соорудить структуру или класс,

тяжело новичкам ).. пойду в библиотеку - почитаю ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

поменяйте flags на другое имя :)

int flags = 0;

// обработчик событий от мышки

void myMouseCallback( int event, int x, int y, int flags, void* param)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

изменил, НО ничего в поведении программы не изменилось

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я у себя проверял, щелкаешь мышкой окно - закрывается.

Приделал еще передачу 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]

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×