(一)OpenCV的GUI特性:4_鼠标当作画笔

如果觉得本篇文章对您的学习起到帮助作用,请 点赞 + 关注 + 评论 ,留下您的足迹

本篇文章为我在学习Opencv时的理解与笔记,一是为了日后查找方便并加深对代码的理解,二是希望能帮助到正在学习Opencv时遇到困难的人。

本文相关推荐阅读:
(一)Opencv的GUI特性:1_图像入门
(一)Opencv的GUI特性:2_视频入门
(一)Opencv的GUI特性:3_OpenCV中的绘图函数

文章目录

    • 学习目标
    • 简单演示
    • 更加复杂的例子

学习目标

  1. 在OpenCV中处理鼠标触发的事件
  2. 学习功能函数 cv2.setMouseCallback()

简单演示

我们创建了一个简单的应用程序,在双击图像的任何地方画一个圆。
首先,我们创建一个当鼠标事件触发则执行的鼠标调用函数。鼠标事件可以是任何涉及鼠标的动作,例如:左击鼠标,右击鼠标,双击鼠标等等。

如下代码,展示鼠标事件所以事件:

import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)

out:共18个

['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']

创建鼠标回调函数有一个特定的格式,以下代码完成功能为鼠标双击位置画一个圆,请看下面的代码。


函数:cv2.setMouseCallback(winname, onMouse, userdata)

  • winname:指定窗口进行鼠标处理程序;
  • onMouse:鼠标事件处理函数;
  • userdata:默认值为0。
import cv2
import numpy as np

def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img, (x, y), 100, (255,0,0), 1)
# 创建一个黑色图片
img = np.zeros((512,512,3), np.uint8)
# 命名一个窗口
cv2.namedWindow('image')
# 为指定窗口设置鼠标处理程序
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(2) & 0xFF == 27:
        break
cv2.destroyAllWindows()

更加复杂的例子

import numpy as np
import cv2
drawing = False # 鼠标按下为True
mode = True # True则画矩形,按'm'切换为画曲线
ix,iy = -1,-1
# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode   # 四个变量定义为全局变量
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击
        drawing = True  # 鼠标状态标识变为True
        ix,iy = x,y # 此处为鼠标的x, y坐标
    elif event == cv2.EVENT_MOUSEMOVE:  # 鼠标滑动
        if drawing == True:
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv2.circle(img,(x,y),5,(0,0,255),-1)
    elif event == cv2.EVENT_LBUTTONUP:  # 左键松开
        drawing = False
        if mode == True:
            cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1)

img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == 27:
        break
cv2.destroyAllWindows()

看到这里,赶快开始敲代码练习一下吧!!

你可能感兴趣的:(opencv,opencv)