обработчик мыши в opencv для больших изображений, неправильные координаты x, y? - PullRequest
2 голосов
/ 30 октября 2010

Я использую изображения размером 2048 x 500, и когда я использую cvShowImage, я вижу только половину изображения.Это не имеет большого значения, потому что интересная часть находится на верхней половине изображения.Теперь, когда я использую mouseHandler, чтобы получить координаты x, y моих кликов, я заметил, что координата для y (размер, который не помещается на экране) неверна.

Кажется, OpenCV думает, что это целое изображение и перекалибрует систему координат, хотя мы эффективно показываем только половину изображения.

Мне нужно знать, как сделать 2 вещи: - отобразитьизмененное изображение, которое уместилось бы на экране

  • получить правильную координату.

Кто-нибудь сталкивался с подобными проблемами?

Спасибо!

Обновление: кажется, координата y делится на 2 от того, что должно быть

код:

EXPORT void click_rect(uchar * the_img, int size_x, int size_y, int * points)
{
CvSize size;
size.height = size_y ;
size.width = size_x;

IplImage * img;
img = cvCreateImageHeader(size, IPL_DEPTH_8U, 1);
img->imageData = (char *)the_img;
img->imageDataOrigin = img->imageData;

img1 = cvCreateImage(cvSize((int)((size.width)) , (int)((size.height)) ),IPL_DEPTH_8U, 1);

cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE); 
cvMoveWindow("mainWin", 100, 100);

cvSetMouseCallback( "mainWin", mouseHandler_rect, NULL );

cvShowImage("mainWin", img1 );

//// wait for a key
cvWaitKey(0);

points[0] = x_1;
points[1] = x_2;
points[2] = y_1;
points[3] = y_2;

//// release the image
cvDestroyWindow("mainWin");
cvReleaseImage(&img1 );
cvReleaseImage(&img);
}

Ответы [ 4 ]

1 голос
/ 19 апреля 2014

Я использую OpenCV2.1 и компилятор Visual Studio C ++.Я исправляю эту проблему с другим флагом CV_WINDOW_NORMAL и работаю правильно и возвращает правильные координаты, этот флаг позволяет изменить размер окна изображения.

cvNamedWindow("Box Example", CV_WINDOW_NORMAL);
1 голос
/ 04 января 2012

Вы должны создать окно с флагом CV_WINDOW_KEEPRATIO вместо флага CV_WINDOW_AUTOSIZE.Это временно устраняет проблему с неверными значениями y.

0 голосов
/ 15 февраля 2011

У меня та же проблема с OpenCV 2.1, использующим его с Windows и компилятором mingw. У меня ушло навсегда, чтобы выяснить, в чем дело. Как вы описываете, cvSetMouseCallback получает большие координаты y. Это, по-видимому, связано с изображением и тем, что cvNamedWindow показано больше моего разрешения экрана; поэтому я не вижу нижней части изображения.

В качестве решения я изменяю размеры изображений до фиксированного размера, чтобы они помещались на экране (в данном случае с разрешением 800x600, которое может принимать любые другие значения:

// g_input_image, g_output_image and g_resized_image are global IplImage* pointers.

int img_w = cvGetSize(g_input_image).width;
int img_h = cvGetSize(g_input_image).height;

// If the height/width ratio is greater than 6/8 resize height to 600.
if (img_h > (img_w*6)/8) {
    g_resized_image = cvCreateImage(cvSize((img_w*600)/img_h, 600), 8, 3);
}
// else adjust width to 800.
else {
    g_resized_image = cvCreateImage(cvSize(800, (img_h*800)/img_w), 8, 3);
}

cvResize(g_output_image, g_resized_image);

Не идеальное решение, но у меня работает ...

Ура, Линус

0 голосов
/ 30 октября 2010

Как вы строите окно?Вы не передаете CV_WINDOW_AUTOSIZE в cvNamedWindow (), не так ли?

Поделитесь каким-нибудь источником, @ Denis.

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