用于大图像的opencv中的鼠标处理程序,错误的x,y坐标?

时间:2010-10-29 20:31:46

标签: opencv mouseevent

我正在使用2048 x 500的图像,当我使用cvShowImage时,我只看到一半的图像。这不是什么大问题,因为有趣的部分是在图像的上半部分。现在,当我使用mouseHandler获取点击的x,y坐标时,我注意到y的坐标(不适合屏幕的尺寸)是错误的。

OpenCV似乎认为这是整个图像并重新校准坐标系,尽管我们只是有效地显示了一半的图像。

我需要知道如何做两件事: - 显示适合屏幕的调整大小的图像

  • 获得正确的坐标。

有没有人遇到类似的问题?

谢谢!

更新:似乎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 个答案:

答案 0 :(得分:1)

您应该使用CV_WINDOW_KEEPRATIO标志而不是CV_WINDOW_AUTOSIZE标志创建一个窗口。这暂时解决了y值错误的问题。

答案 1 :(得分:1)

我使用OpenCV2.1和visual studio C ++编译器。我用另一个标志CV_WINDOW_NORMAL解决了这个问题,并且正常工作并返回正确的坐标,这个标志可以让你调整图像窗口的大小。

cvNamedWindow("Box Example", CV_WINDOW_NORMAL);

答案 2 :(得分:0)

你是如何建造窗户的?您没有将CV_WINDOW_AUTOSIZE传递给cvNamedWindow(),是吗?

分享一些来源,@ Denis。

答案 3 :(得分:0)

我在使用Windows和mingw编译器的OpenCV 2.1时遇到了同样的问题。我花了很长时间才发现出了什么问题。正如您所描述的那样,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);

不是一个完美的解决方案,但对我有用......

干杯, 莱纳斯