Opencv笔记(五)——把鼠标当画笔

学习目标:

  •  学习使用 OpenCV 处理鼠标事件
  • 学会使用函数cv2.setMouseCallback()

简单演示:

        首先我们来创建一个鼠标事件回调函数,但鼠标事件发生是他就会被执行。鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。该函数还提供了鼠标点击的位置。

Event中文释义
cv2.EVENT_MOUSEMOVE鼠标移动
cv2.EVENT_LBUTTONDOWN左键点击
cv2.EVENT_RBUTTONDOWN右键点击
cv2.EVENT_MBUTTONDOWN中间点击

cv2.EVENT_LBUTTONUP

左键释放
cv2.EVENT_RBUTTONUP右键释放
cv2.EVENT_MBUTTONUP中间释放
cv2.EVENT_LBUTTONDBLCLK左键双击
cv2.EVENT_RBUTTONDBLCLK右键双击
cv2.EVENT_MBUTTONDBLCLK中间双击

import numpy as np
import cv2
def draw_circle(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONUP :
        cv2.circle(img,(x,y),20,(255,0,0),-1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('opencv')
cv2.setMouseCallback('opencv',draw_circle)
while(1):
    cv2.imshow('opencv',img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
  • 先创建一个鼠标事件回调函数,event表示鼠标事件,x,y表示鼠标事件的位置,flags代表鼠标拖拽事件。自己在函数中定义事件的类型,上述代码定义的是左键释放画圈。
  • cv2.setMouseCallback('Window_name',def),第一个参数是窗口名,第二个参数是用于处理的回调函数。

高级演示:

        用鼠标左键点击后拖动画矩形,按下m建变换模式,改画圆。

import numpy as np
import cv2

drawing = False
mode = True
ix,iy = -1,-1

def draw_circle(event,x,y,flags,param):
    global drawing,mode,ix,iy
    if event==cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event==cv2.EVENT_MOUSEMOVE :
        if drawing == True:
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(255,0,0),2)
            else:
                cv2.circle(img,(x,y),50,(0,255,0),3)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False

img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('opencv')
cv2.setMouseCallback('opencv',draw_circle)
while(1):
    cv2.imshow('opencv',img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    elif cv2.waitKey(1) &0xFF == ord('m'):
        mode = not mode
cv2.imwrite('/home/wl/1.jpg',img)
cv2.destroyAllWindows()

posted @ 2018-07-11 10:48  龙~白  阅读(475)  评论(0编辑  收藏  举报