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

标签 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');

但是问题是这样一来,甚至连一条线都不会画出来,并且在单击几次并输入“y”后,应用程序将不会响应。

请帮我解决这个问题。

最佳答案

您的代码可能存在多个问题,这些问题阻止其执行您想要的操作。首先想到的是您没有清除用于捕获坐标的 vector 。画一条线之后

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

您应该像这样重置 vector
points.clear();

这样,下一次鼠标单击的坐标将变为points[0]。否则,它将附加到 vector 上,并且您将一遍又一遍地在前两个鼠标坐标之间保持绘制线。

关于c++ - 使用鼠标单击无法在图像上绘制多条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24604621/

相关文章:

c++ - 在标记内使用定义的常量

python - 创建视频前后的帧大小差异

python - MatplotLib (TKinter) + OpenCV 在 Python 3 中崩溃

c++ - 如果 CImage::Load 方法失​​败会发生什么?

c++ - 将整数分配给变体

c++ - 如何将 bool 值类型转换为C中的位字段

python - 如何访问凸包内的像素?

c++ - 热插拔 C++ 库可能吗?

python - 从图像中提取水平和垂直线

python - 如何在opencv-python中将文本打印到框架