我正在使用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);
}
答案 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);
不是一个完美的解决方案,但对我有用......
干杯, 莱纳斯