2013-02-03 40 views
0

我正在尝试使用OpenCV 2.4.3(VS 2010)在用户接受的输入(通常是中心)上显示圆圈。在输出图像上(使用'namedWindow'显示),当一个圆点标记点时,圆圈似乎会逐列移位。不知道我应该如何纠正这一点。在OpenCV中显示错误坐标的用户输入

代码:

struct OPTIONS{ 
     OPTIONS(): X(-1), Y(-1), drawing_dot(false){} 
     int X; 
     int Y; 
     bool drawing_dot; 
    }; 
    OPTIONS options; 
    void my_mouse_callback(int event, int x, int y, int flags, void* param){ 

     IplImage* image = (IplImage*) param; 

     switch(event){ 

     case CV_EVENT_LBUTTONDOWN: 
      options.X = x; 
      options.Y = y; 
      options.drawing_dot = true; 
      break; 
     default: 
      break; 
     } 
    } 
    int main(void){ 
     IplImage* image = cvLoadImage("Images/TestRealData/img1.bmp"); 
     Mat frame = imread("Images/TestRealData/img1.bmp"); 
     namedWindow("Test", CV_WINDOW_KEEPRATIO); 
     cvSetMouseCallback("Test", my_mouse_callback, (void*) image); 
     while(cvWaitKey(15) != 27){ 
      if(options.drawing_dot){ 
       circle(frame, Point(options.X,options.Y), 3, CV_RGB(0,0,255), 2); 
       options.drawing_dot = false; 
      } 
      imshow("Test", frame); 
      waitKey(10); 
     } 
     cvReleaseImage(&image); 
     return 0; 
    } 

回答

1

找到答案后,失去了很多时间 -

请确保在'namedWindow'中指定标志。将标志更改为CV_WINDOW_KEEPRATIO为我做了诀窍。希望这可以帮助那里的人。

2

我想圆不移位。鼠标光标可能欺骗我们的眼睛。你可以简单地通过增加半径检查,并降低像圆轮廓的厚度:

circle(frame, Point(options.X, options.Y/2), 15, CV_RGB(0, 0, 255), 1); 

顺便说一句,我认为,如果你想画的时候,你点击这个圈子,options.Y不应该除以2.

+1

感谢您花时间浏览代码。是的,'options.Y/2'确实是一个错误,但我忘了在这里更新更改。现在已经这样做了。另外,我发现我错了 - 我没有提到'namedWindow'的任何标志。改变这个伎俩。再次感谢! – Pranjal

相关问题