zoukankan      html  css  js  c++  java
  • opencv-python教程学习系列5-处理鼠标事件

    前言

    opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍opencv-python处理鼠标事件,坚持学习,共同进步。

    系列教程参照OpenCV-Python中文教程

    系统环境

    系统:win_x64;

    python版本:python3.5.2;

    opencv版本:opencv3.3.1;

    内容安排

    1.知识点介绍;

    2.测试代码;

    具体内容

    1.知识点介绍;

    鼠标事件使用的包是cv2,函数主要是cv2.setMouseCallback()函数;

    一般首先创建鼠标事件回调函数,当鼠标事件发生时就会被执行。

    通过鼠标事件获得相对应图像的坐标执行对应的功能。

    所有鼠标事件回调函数都有一个统一的格式,不同的是被调用之后的功能。

    1.1 查看所有被支持的鼠标事件

    import cv2
    events = [i for i in dir(cv2) if 'EVENT' in i]
    print (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'
    

    1.2 在鼠标双击位置绘制一个圆;

    1)定义鼠标事件回调函数;

    # mouse callback function
    def draw_circle(event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDBLCLK:
            cv2.circle(img, (x, y), 100, (255, 0, 0), -1)
    

    2)将图像窗口与回调函数绑定;

    cv2.setMouseCallback('image', draw_circle)
    

    1.3 根据选择的模式在拖动鼠标时绘制矩形,故回调函数包含两个部分;

    1)回调函数绘图的步骤:step1,按下左键时记录起始位置坐标;step2,按下左键并移动时根据模式的选择绘制图形;step3,鼠标松开时停止绘图;

    2)将回调函数和窗口绑定在一起,同时在循环中将‘m’键与模式转换绑定在一起;

    具体代码可参考测试代码;

    2. 测试代码;

    2.1在图像双击位置画圆;

    import cv2
    import numpy as np
    
    # mouse callback function
    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((500, 500, 3), np.uint8)
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', draw_circle)
    
    while (1):
        cv2.imshow('image', img)
        if cv2.waitKey(1)&0xFF == ord('q'):#按q键退出
            break
    cv2.destroyAllWindows()

    2.2 选择不同的模式在拖动鼠标时绘制矩形;

    import cv2
    import numpy as np
    #当鼠标按下时为True
    drawing = False
    #如果mode为true时绘制矩形,按下'm'变成绘制曲线
    mode = True
    ix,iy = -1,-1
    
    #创建回调函数
    def draw_circle(event,x,y,flags,param):
        global ix,iy,drawing,mode
        #当按下左键时返回起始位置坐标
        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True
            ix,iy=x,y
        #当左键按下并移动时绘制图形,event可以查看移动,flag查看是否按下
        elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
            if drawing == True:
                if mode == True:
                    cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
                else:
                    #绘制圆圈,小圆点连在一起就成了线,3代表笔画的粗细
                    cv2.circle(img,(x,y),3,(0,0,255),-1)
                  
        #当鼠标松开时停止绘图
        elif event ==cv2.EVENT_LBUTTONUP:
            drawing == False
    
    '''
    下面把回调函数与OpenCV窗口绑定在一起,在主循环中将'm'键与模式转换绑定在一起
    '''
    img = np.zeros((500,500,3),np.uint8)
    cv2.namedWindow('image')
    cv2.setMouseCallback('image',draw_circle)
    while(1):
        cv2.imshow('image',img)
        k=cv2.waitKey(1)
        if k ==ord('m'):
            mode=not mode
        elif k==ord('q'):
            break
    cv2.destroyAllWindows()

    参考

    1. opencv-python处理鼠标事件

  • 相关阅读:
    [置顶] windows player,wzplayerV2 for windows
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    编译cegcc 0.59.1
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    windows player,wzplayerV2 for windows(20140416)更新
    编译cegcc 0.59.1
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8119996.html
Copyright © 2011-2022 走看看