如何在opencv中点击鼠标在图像上绘制线条?

时间:2014-08-29 01:50:30

标签: c++ opencv image-processing

因此,在遵循stackexchange用户关于鼠标事件的建议之后,我能够通过鼠标点击来理解并实现一些简单的任务。因此,下一个目标是使用鼠标左键单击并鼠标右键单击绘制一条简单的线条。不幸的是,在我实施我的程序后,我看不到任何行。

int x,y;
Point p(0,0);
Point q(0,0);

Mat xal;

void drawimage()
{
    a = q.x - p.x; //i am just checking out the values of a and b to see if the     drawimagefunction is being called in the rightmouse click event
              b = q.y - p.y;
              cout<<" a is :"<<a<<endl;
              cout<<"b is:"<<b<<endl;
    line(xal,Point(p.x,p.y),Point(q.x,q.y),Scalar(0,0,255),2,8);
}

void onMouse( int event, int x, int y, int f, void* )
{
    switch (event)
    {
        case EVENT_LBUTTONDOWN:


            cout<<"Left button was pressed"<<x<<" "<<y<<" "<<endl;

            {
                p.x = x;
                p.y = y;
                cout<<"p is:"<<p.x<<p.y<<endl;
            }
            break;

        case EVENT_RBUTTONDOWN:
            cout<<"Right button was pressed at :"<<x <<" "<<y<<endl;


            {
                q.x = x;
                q.y = y;
                drawimage();//no line is being drawn though i can see that i get the values of a and b in the drawimage function.
            }
            break;

        default:
            break;
    }
}
int main()
{
    xal = imread("pic.JPG);
    namedWindow("Picture",1);
    setMouseCallback("Picture",onMouse,NULL);
    imshow("Picture",xal);
    cvwaitkey(0);
}

2 个答案:

答案 0 :(得分:0)

在&#34;行(..)&#34;之后添加以下内容在drawLine()函数中调用:

imshow("Picture", xal);

问题在于你是在xal矩阵中写行,但你没有在屏幕上更新图像,这就是imshow(..)调用会做的。

答案 1 :(得分:-1)

试试这一个代码。它对你有用。

#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

void drawimage()
{
    line(xal,Point(p->x,p->y),Point(q->x,q->y),Scalar(0,0,255),2,8);
}

void CallBackFunc(int event, int x, int y, int flags, void *ptr )
{
    if ( event == EVENT_LBUTTONDOWN )
    {
        Point*p = (Point*)ptr;
        p->x = x;
        p->y = y;
        drawimage();
    }
    else if  ( event == EVENT_RBUTTONDOWN )
    {
        Point*q = (Point*)ptr;
        q->x = x;
        q->y = y;
        drawimage();
    }
}

int main(int argc, char** argv)
{
    // Read image from file 
    Point p;
    Point q;
    Mat xal = imread("MyPic.JPG");

    //if fail to read the image
    if ( xal.empty() ) 
    { 
        cout << "Error loading the image" << endl;
        return -1; 
    }

    //Create a window
    namedWindow("My Window", 1);

    //set the callback function for any mouse event
    setMouseCallback("My Window", CallBackFunc,&p);
    setMouseCallback("My Window", CallBackFunc,&q);

    //show the image
    imshow("My Window", xal);

    // Wait until user press some key
    waitKey(0);

    return 0;
}