美文网首页
OpenCV_005-OpenCV 鼠标作为画笔

OpenCV_005-OpenCV 鼠标作为画笔

作者: hanpfei | 来源:发表于2022-03-20 14:37 被阅读0次

本文主要内容来自于 OpenCV-Python 教程OpenCV 中的 GUI 功能 部分,这个部分的主要内容如下:

目标

简单的演示程序

这里,我们将创建一个简单的应用程序,当双击鼠标左键时,它在一幅图像上绘制一个圆。

首先我们创建一个鼠标事件回调函数,当鼠标事件发生时它将被执行。鼠标事件可以是任何与鼠标相关的事件,比如左键按下,左键抬起,左键双击等等。它给我们每个鼠标事件的坐标 (x,y)。通过这个事件和位置,我们可以做任何我们想做的。要列出所有可用的事件,可以在 Python 终端中执行如下的代码:

events = [i for i in dir(cv) if 'EVENT' in i]
print('\n'.join(events))

执行这段代码将得到类似下面这样的输出:

EVENT_FLAG_ALTKEY
EVENT_FLAG_CTRLKEY
EVENT_FLAG_LBUTTON
EVENT_FLAG_MBUTTON
EVENT_FLAG_RBUTTON
EVENT_FLAG_SHIFTKEY
EVENT_LBUTTONDBLCLK
EVENT_LBUTTONDOWN
EVENT_LBUTTONUP
EVENT_MBUTTONDBLCLK
EVENT_MBUTTONDOWN
EVENT_MBUTTONUP
EVENT_MOUSEHWHEEL
EVENT_MOUSEMOVE
EVENT_MOUSEWHEEL
EVENT_RBUTTONDBLCLK
EVENT_RBUTTONDOWN
EVENT_RBUTTONUP

创建鼠标事件回调函数具有特定的格式,在任何地方都是相同的。它们仅在函数做什么方面不同。即鼠标事件回调函数可以是参数列表满足条件的任何函数。我们的鼠标事件回调函数只做一件事,它在双击发生的位置绘制一个圆。参见下面的代码。代码是自解释的:

def draw_circle_follow_mouse():
    img = np.zeros((512, 512, 3), np.uint8)

    # mouse callback function
    def draw_circle(event, x, y, flags, param):
        if event == cv.EVENT_LBUTTONDBLCLK:
            # Create a black image, a window and bind the function to window
            img.fill(0)
            cv.circle(img, (x, y), 100, (255, 0, 0), -1)
            cv.imshow('image', img)

    cv.namedWindow('image')
    cv.imshow('image', img)
    cv.setMouseCallback('image', draw_circle)
    while (1):
        if cv.waitKey(20) & 0xFF == 27:
            break
    cv.destroyAllWindows()

这里的鼠标事件回调函数其实是个闭包,它绑定了局部上下文。为了防止两次鼠标双击事件中的绘制相互干扰,每次在鼠标事件回调函数中绘制之前都会先清空图像。ASCII 码 27 表示 ESC 键,即按下 ESC 键是应用程序退出。

更高级的演示程序

现在我们继续开发一个更好的应用程序。这次,我们像在 Paint 应用程序中一样,通过拖动鼠标绘制矩形或者圆(依赖我们选择的模式)。因此我们的鼠标事件回调函数有两部分,一部分用于绘制矩形,另一部分用于绘制圆形。这个具体的例子将非常有助于创建和理解一些交互式应用程序,如对象跟踪、图像分割等。

def draw_shape_follow_mouse():
    drawing = False  # true if mouse is pressed
    mode = True  # if True, draw rectangle. Press 'm' to toggle to curve
    ix, iy = -1, -1

    img = np.zeros((512, 512, 3), np.uint8)
    # mouse callback function
    def draw_shape(event, x, y, flags, param):
        nonlocal ix, iy, drawing, mode
        if event == cv.EVENT_LBUTTONDOWN:
            drawing = True
            ix, iy = x, y
            img.fill(0)
        elif event == cv.EVENT_MOUSEMOVE:
            if drawing == True:
                if mode == True:
                    cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
                else:
                    cv.circle(img, (x, y), 5, (0, 0, 255), -1)
        elif event == cv.EVENT_LBUTTONUP:
            drawing = False
            if mode == True:
                cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
            else:
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)

        cv.imshow('image', img)

    cv.namedWindow('image')
    cv.imshow('image', img)
    cv.setMouseCallback('image', draw_shape)
    while (1):
        key = cv.waitKey(20) & 0xFF
        if key == ord('m'):
            mode = not mode
        elif key == 27:
            break
    cv.setMouseCallback(None)
    cv.destroyAllWindows()

这里的鼠标事件回调函数同样是闭包,通过 cv.setMouseCallback() 将回调函数绑定到 OpenCV 窗口。在主循环中,我们应该为键 'm' 设置一个键盘绑定,以在矩形和圆形之间切换。

参考文档

Mouse as a Paint-Brush

Done.

相关文章

  • OpenCV_005-OpenCV 鼠标作为画笔

    本文主要内容来自于 OpenCV-Python 教程[https://docs.opencv.org/4.5.5/...

  • 小伙子自学C++编程简单DIY,即让你拥有一个屏幕画笔,非常实用

    VC++ 编写的一个屏幕画笔程序,编译运行后可在屏幕上随便画画,鼠标就成了画笔,单击鼠标右键可以选择颜色、改变画笔...

  • Photoshop CC 2019学习记录day9

    画笔的属性参数: 点按可打开“画笔预设”选取器: 大小:鼠标圆的大小;(按住Alt键不要松,同时按住鼠标右键,左右...

  • OpenCV-Python教程:5.鼠标作为画笔

    简单例子 我们创建一个简单的应用来,我们在图片上双击,就会在那画一个圆 首先我们创建一个鼠标回调函数,当一个鼠标事...

  • 零基础学PS

    那里不要圈哪里 污点修复画笔工具(shift+j)(按住鼠标涂抹需要去除的图后,接着松开鼠标) 修复画笔工具(sh...

  • photo shop零基础6

    画笔:点击画笔工具,按住鼠标左键并拖动,画笔工具会以前景色为颜料,轻松绘制出线条,画笔虚设选取器中有多个不同类型的...

  • 1.3 OpenCV 中处理鼠标事件

    把鼠标当画笔 根据我们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)

  • 去掉水印或者杂物

    使用修复画笔工具修复画笔工具 PS顶部配置如图 按住Alt键+鼠标左键 移动选择要被下消除的区域 4.选完区域后,...

  • Android自定义控件系列(一、Paint画笔的基本使用)

    创建画笔 画笔颜色 抗锯齿 画笔宽度 填充样式 Paint顾名思义为画笔,此篇作为android自定义控件系列的基...

  • c4d求大神

    c4d画笔工具作图时 为什么描点 当鼠标点击描下一个点时 所画的线条会被隐藏 松开鼠标又会显示 就是点击是会所画...

网友评论

      本文标题:OpenCV_005-OpenCV 鼠标作为画笔

      本文链接:https://www.haomeiwen.com/subject/ihnodrtx.html