如何使用setMouseCallback绘制随机行?

时间:2015-07-17 05:58:14

标签: c++ opencv

我研究过Opencv的setMouseCallback函数。

我知道有几个事件,列表如下:

CV_EVENT_MOUSEMOVE 0,
CV_EVENT_LBUTTONDOWN 1, CV_EVENT_RBUTTONDOWN 2, CV_EVENT_MBUTTONDOWN 3, CV_EVENT_LBUTTONUP 4, CV_EVENT_RBUTTONUP 5, CV_EVENT_MBUTTONUP 6, CV_EVENT_LBUTTONDBLCLK 7, CV_EVENT_RBUTTONDBLCLK 8, CV_EVENT_MBUTTONDBLCLK 9,

CV_EVENT_FLAG_LBUTTON 1, CV_EVENT_FLAG_RBUTTON 2, CV_EVENT_FLAG_MBUTTON 4, CV_EVENT_FLAG_CTRLKEY 8, CV_EVENT_FLAG_SHIFTKEY 16, CV_EVENT_FLAG_ALTKEY 32,

并且从我从这些事件得到的坐标,我可以绘制,例如:直线,圆,椭圆......等。

但不是直线,我想绘制随机线,就像"铅笔"或"刷" Microsoft Paint中的函数。

当我的鼠标在图像中移动时,CV_EVENT_MOUSEMOVE会返回所有坐标,但我不知道如何将它与CV_EVENT_LBUTTONDOWN组合以表示"开始绘制线"和CV_EVENT_LBUTTONUP来表示"完成绘制线"?

有没有人知道如何用setMouseCallback实现我的要求?

1 个答案:

答案 0 :(得分:0)

我自己想出来了,

bool trigger;
Mat img;
void onMouse(int event, int x, int y, int flag, int param)
{
    if(event == CV_EVENT_LBUTTONDOWN)
    {
        img = Mat::zeros(320, 240, CV_8UC3);
        trigger = true;
    }
    if(event == CV_EVENT_LBUTTONUP)
    {
        trigger = false;
    }
    if(event == CV_EVENT_MOUSEMOVE)
    {
        if(trigger == true)
        {
            line(img, cvPoint(x, y), cvPoint(x, y), Scalar(0, 0, 255), 3, CV_AA, 0);
            imshow("Drawing", img);
        }

    }

}


int main(int argc, char *argv[])
{
    .
    .
    .
    cvsetMouseCallback("Origin img", onMouse, NULL);
    .
    .
    .
}