关闭

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

55人阅读 评论(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()
1
0
查看评论

vim 鼠标

vim 下有时需要将部分字符拷贝以便在其他地方搜索或者翻译,自然要用到鼠标复制。 vim下鼠标有关的就是下面这句: set mouse=a 这个是用来开启鼠标功能的。a表示所有模式 vi的三种模式:命令模式,插入模式,可视模式.鼠标可以启动于各种模式中: The mouse can b...
  • yangzhongxuan
  • yangzhongxuan
  • 2011-06-13 19:52
  • 5375

kuangbin求带飞DP1 FatMouse's Speed

J - FatMouse's Speed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...
  • u013555159
  • u013555159
  • 2016-08-15 16:57
  • 312

.vimrc使能鼠标后,vim鼠标右键不能复制

转自:http://blog.sina.com.cn/s/blog_622d95080100ny94.html 在~/.vimrc中加入 set mouse=a 后,vim鼠标右键变得不能复制了,解决办法如下: 按住 shift 键,然后选择,此时表示由 X 处理该选择,copy 选...
  • sinkary
  • sinkary
  • 2012-05-03 15:37
  • 6184

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

在写题解之前给自己打一下广告哈~。。抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下:http://edu.csdn.net/course/detail/209题目:FatMouse's SpeedTime Limit: 2000/1000 MS (Java/Others) Memo...
  • caihongshijie6
  • caihongshijie6
  • 2015-02-10 17:07
  • 910

vim中使用鼠标

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

Win32 Series - Capturing the Mouse

Capturing the Mouse A window procedure normally receives mouse messages only when the mouse cursor is positioned over the client or nonclient area of...
  • fanbird2008
  • fanbird2008
  • 2013-12-28 20:44
  • 653

mouse down和mouse up的合用

今天在回放脚本中,copy了一份脚本
  • zhouxuan623
  • zhouxuan623
  • 2014-04-24 13:38
  • 811

虚拟化KVM的使用 - mouse without borders

最早的时候是读到一篇文章,讲
  • rockewei
  • rockewei
  • 2014-07-17 12:29
  • 1048

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

最近在使用vim,忽然发现vim也能使用鼠标,本章主要说明如何使用鼠标功能。
  • qq_27968607
  • qq_27968607
  • 2017-02-10 11:53
  • 2612

如何让Magic Mouse真正拥有Magic

Magic Mouse是苹果电脑的专属配件,它的庐山真面目就如题图一样,乍一看觉得除了外形像个鼠标,其它地方貌似都和普通的鼠标格格不入,起码连个最基本的滚轮都没有,但是既然敢叫Magic Mouse,必然有它的magical之处 它是为苹果电脑专门设计,如果你拿着它在windows上打游戏,或...
  • littlewhite1989
  • littlewhite1989
  • 2014-12-03 13:55
  • 2285
    个人资料
    • 访问:126512次
    • 积分:3214
    • 等级:
    • 排名:第12600名
    • 原创:187篇
    • 转载:4篇
    • 译文:9篇
    • 评论:33条
    RUNNING|~_~|My web
    微信公众号
    课程设计、视频资源、有料趣文
    Worldhello


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