• 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处理鼠标事件

  • 相关阅读:
    iOS UIScrollView 停止滑动 减速
    移动App-UI配制篇
    pathload --有效的网络带宽估计方法
    页面提交错误,页面间参数传递java.lang.NumberFormatException: null
    jquery easyui Accordion的使用
    利用开源HTML5引擎lufylegend.js结合javascript实现的五子棋人机对弈
    POJ 3221 Diamond Puzzle(BFS)
    信息管理系统怎样获取当前日期时间
    Unity3d-XML文件数据解析&JSON数据解析
    oracle data file header replace(測)
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8119996.html
Copyright © 2020-2023  润新知