【问题标题】:How to use setMouseCallback to draw random line?如何使用 setMouseCallback 绘制随机线?
【发布时间】:2015-07-17 05:58:13
【问题描述】:

我研究过 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 实现我的要求吗?

【问题讨论】:

  • 使用 buttondown 事件开始绘图(设置 bool 为 true),记住最后鼠标位置。然后 mousemove 事件(如果 drawBool​​ 设置为 true)从最后一个鼠标位置到当前鼠标位置绘制一条线。 mouseup 事件时停止绘图
  • 谢谢你的建议,不知怎的给了我一个提示。

标签: c++ opencv


【解决方案1】:

我自己想通了,

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);
    .
    .
    .
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-07
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多