【OpenCv-Python】四、Mouse as a Paint-Brush

72人阅读 评论(0) 收藏 举报
分类:

把鼠标作为画笔

目标

  • 学会在OpenCv中处理鼠标事件
  • 你将要学习这个函数:cv2.setMouseCallback()

4.1 简单的演示

在这里,我们创建一个简单的应用程序,只要双击它,它就在图像上绘制一个圆。

首先,我们创建一个鼠标回调函数,该函数在鼠标事件发生时执行。鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。我们可以通过鼠标事件获得与鼠标光标对应的图片上的坐标。根据这些信息我们可以做任何我们想做的事。你可以通过执行下列代码查看所有被支持的鼠标事件。

import cv2

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

创建鼠标回调函数有一个特定的形式,在任何地方都是相同的。它们仅仅是函数的功能不同。所以我们的鼠标回调函数只能做一件事,它在鼠标双击的地方画一个圆。下面是代码,不懂得地方可以看注释。

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(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

4.2 高级一点的示例

现在我们创建一个更好的程序。这次我们的程序要完成的任务是根据我们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以我们的回调函数包括两部分,一部分画矩形,一部分画圆。这是一个典型的例子,它可以帮助我们更好的理解与构建人机交互程序,比如物体跟踪,图像分割等。

import cv2
import numpy as np

drawing = False #如果按下鼠标,则为true
mode = True #如果是 True 则画矩形。按 m 键变成绘制曲线。

#鼠标回调函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    #当按下左键时返回起始位置坐标
    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),(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)

下面我们要把这个回调函数与 OpenCv 窗口绑定在一起。在主循环中我们需要讲键盘上的 “m“ 键与模式转换绑定在一起。

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()
查看评论

vim中使用鼠标

1 简介 CleverCode最近在使用vim的鼠标模式。本节说明在终端或者终端窗口里如何使用鼠标。 2 打开鼠标     :set mouse=a          3 关闭鼠标     :...
  • CleverCode
  • CleverCode
  • 2016年05月15日 14:02
  • 11176

win7 x64下安装python-opencv 及 “not a supported wheel”解决

Windows7 x64下在已经完成安装pip和Python(3.5.2)后安装opencv的步骤:(1)下载opencv python安装文件 下载地址:http://www.lfd.uci.ed...
  • JerryZhang__
  • JerryZhang__
  • 2017年03月31日 16:36
  • 459

OpenCV-Python-Tutorial[3]

参考:https://github.com/makelove/OpenCV-Python-Tutorialch21-轮廓Contours 12 怎样绘制轮廓py 4 轮廓-更多函数py 43-形状匹配...
  • wc781708249
  • wc781708249
  • 2017年11月14日 11:04
  • 576

vim 鼠标

vim 下有时需要将部分字符拷贝以便在其他地方搜索或者翻译,自然要用到鼠标复制。 vim下鼠标有关的就是下面这句: set mouse=a 这个是用来开启鼠标功能的。a表示所有模式 vi的...
  • yangzhongxuan
  • yangzhongxuan
  • 2011年06月13日 19:52
  • 5396

uva 11818 Mouse & a Cheese

uva 11818 Mouse & a Cheese 题目大意: 一个老鼠想吃蛋糕,但是老鼠四周都被东西挡住了,两个人玩游戏,轮流拿掉一根火柴,问你谁能赢。 解题思路: 记忆优化DP,DP(当前的...
  • a1061747415
  • a1061747415
  • 2014年03月29日 12:41
  • 919

Unusual Team Gym - 101350B (水)

A lion, a mouse, and a beaver are one of the best teams at Animal University, and they have qualifie...
  • The_star_is_at
  • The_star_is_at
  • 2017年04月21日 20:24
  • 349

hdu 1160 FatMouse's Speed(动态规划)

问题描述: FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want ...
  • u012248410
  • u012248410
  • 2013年10月08日 16:25
  • 435

(hdu step 3.2.4)FatMouse's Speed(在第一关键字升序的情况下,根据第二关键字来求最长下降子序列)

在写题解之前给自己打一下广告哈~。。抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下:http://edu.csdn.net/course/detail/209题目:FatMouse's Sp...
  • caihongshijie6
  • caihongshijie6
  • 2015年02月10日 17:07
  • 935

[Debug] - No.4 Python 3.5 安装Opencv

Anaconda python3.5的环境中安装python-opencv失败在cmd中使用pip安装python-opencv pip install python-opencv 出现以下报错信...
  • tjuyanming
  • tjuyanming
  • 2018年01月14日 15:18
  • 153

Vim配置#Vim中使用鼠标功能

最近在使用vim,忽然发现vim也能使用鼠标,本章主要说明如何使用鼠标功能。...
  • qq_27968607
  • qq_27968607
  • 2017年02月10日 11:53
  • 3277
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 13万+
    积分: 3327
    排名: 1万+
    微信公众号
    课程设计、视频资源、有料趣文
    Worldhello


    微信公众号:Worldhello
    期待您的关注!
    博客专栏
    最新评论