【问题标题】:mouse handler in opencv for large images, wrong x,y coordinates?opencv中用于大图像的鼠标处理程序,错误的x,y坐标?
【发布时间】:2019-08-28 19:51:31
【问题描述】:

我使用的是 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);
}

【问题讨论】:

  • 您使用的是 Windows、Linux 或 Mac OS X 和 OpenCV 版本吗?
  • 我用的是windows,用的是microsoft visual c++ 2008 express

标签: opencv mouseevent


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我使用 OpenCV2.1 和 Visual Studio C++ 编译器。我用另一个标志 CV_WINDOW_NORMAL 解决了这个问题并正常工作并返回正确的坐标,这个标志使您能够调整图像窗口的大小。

    cvNamedWindow("Box Example", CV_WINDOW_NORMAL);
    

    【讨论】:

      【解决方案3】:

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

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

      干杯, 莱纳斯

      【讨论】:

        【解决方案4】:

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

        分享一些来源,@Denis。

        【讨论】:

        • 请注意,我已经尝试过使用和不使用 CV_WINDOW_AUTOSIZE 选项,它给了我相同的结果。
        猜你喜欢
        • 2019-12-07
        • 1970-01-01
        • 2016-02-02
        • 2011-01-10
        • 2021-07-10
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多