使用鼠标单击无法在图像上绘制多条线

时间:2014-07-07 06:56:28

标签: c++ opencv

我已经学会了如何使用line( frame, Point( 15, 20 ), Point( 70, 50), 'r', 2, 8 );

在OpenCV中的图像上绘制线条

我还学会了如何使用鼠标点击在图像上绘制一条线。例如,以下代码绘制一条线,用于连接用户在图像上点击的两个点:

using namespace cv;
using namespace std;


void onMouse(int evt, int x, int y, int flags, void* param) {
    if(evt == CV_EVENT_LBUTTONDOWN) {
        std::vector<cv::Point>* ptPtr = (std::vector<cv::Point>*)param;
        ptPtr->push_back(cv::Point(x,y));
    }
}

int main()

{

std::vector<Point> points;

cv::namedWindow("Output Window");

Mat frame = cv::imread("chhha.png");

cv::setMouseCallback("Output Window", onMouse, (void*)&points);
int X1=0, Y1=0, X2=0, Y2=0; 

while(1)
{
    cv::imshow("Output Window", frame);

    if (points.size() > 1) //we have 2 points
    {

        for (auto it = points.begin(); it != points.end(); ++it)
        {


        }

        break;
    }
    waitKey(10);
}


 // Now let us draw a line on the image 
  line( frame, points[0], points[1], 'r',  2, 8 );
  cv::imshow("Output Window", frame);

  waitKey( 10 );

getch(); 

return 0;  
}

现在基本上我想要的是继续绘制线条,直到我右键单击或输入某些字符。

到目前为止,我尝试使用do-while循环:

char m; 
do{
while(1)
{
    cv::imshow("Output Window", frame);

    if (points.size() > 1) //we have 2 points
    {

        for (auto it = points.begin(); it != points.end(); ++it)
        {


        }


        break;
    }
    waitKey(10);


}


//      Draw a line 
line( frame, points[0], points[1], 'r',  2, 8 );
cv::imshow("Output Window", frame);


cout<<"do you want more lines, if so , press 'y'"<<endl; 
cin>>m; 

// instead of this a right click check would be much better 
if(m!='y')

{
    break; 
}


}while(m=='y');

但问题是这样的方式甚至不会划出一条线,只需点击几下并输入“#”,应用程序就不会响应。

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

您的代码可能存在一些问题,导致它无法执行您想要的操作。首先想到的是你没有清除用于捕获坐标的矢量。画一条线后

line( frame, points[0], points[1], 'r',  2, 8 );

你应该像这样重置矢量

points.clear();

以便下一次鼠标点击的坐标转到points[0]。否则它会附加到矢量上,你会一遍又一遍地在前两个鼠标坐标之间画线。