zoukankan      html  css  js  c++  java
  • Opencv稍微高级点的鼠标事件-OpenCV步步精深

    今天我们要来点稍微高级的东西。在我们按下鼠标时可以画矩形,而我们按下键盘m键时,切换到画圆的模式,再按下m键,回到画矩形模式。

    一起来写下代码,首先当然还是调用库

    1. import cv2
    2. import numpy as np

    当我们按下鼠标左键时时,我们才开始画矩形,所以初始时默认是

    1. drawing=False

    当鼠标左键按下时,drawing变量变为True,当鼠标左键抬起时又变回False,这个函数时控制画不画图的关键性变量

    1. mode=True

    这里的mode变量控制着是画矩形,还是圆

    我们要画一个封闭填充矩形的,前几张都有涉及,今天复习一下:线宽为-1,当线宽-1时表示封闭图形的颜色填充

    所以可以这么写

    1. ix,iy=-1,-1

    可以开始创建回调函数了

    1. def draw_circle(event,x,y,flags,param):
    2.     global ix,iy,drawing,mode

    global是python将变量定义为全局变量的函数,就是画矩形就那么画=。=

    1. if event==cv2.EVENT_LBUTTONDOWN:
    2.     drawing=True
    3.     ix,iy=x,y

    这是当鼠标左键按下时,画矩形,ix,iy等于新的x,y

    1. elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
    2.     if drawing==True:

    当不是上一中情况是,就是这种:鼠标移动时检查变量,flags代表拖拽事件,表示按住左键拖拽。(这是百度的)drawing=True时画矩形,

    1.  if mode==True:
    2.     cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)

    以后代码自己想想怎么写,原理都是一样的,主要就是mode和drawing两个变量,我已经讲述过了,复习一遍:

    drawing默认为False,在鼠标左键为按下(及LBUTTONDOWN)的时候变成true,左键抬起(LBUTTONUP)就变成False。这个变量控制着画图还是不画图,当鼠标移动(及MOUSEMOVE)的时候检查这个变量的状态,只有为true才画图

    mode这个变量控制着画出图形是矩形还是圆,在MOUSEMOVE时它为True画矩形,为False画圆。


    下面上代码

    # -*- coding:utf-8 -*-
    """
    Created on Tue Jan 03 19:15:27 2017
    @author: Y
    """
    import cv2
    import numpy as np

    drawing=False

    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
    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:

    cv2.circle(img,(x,y),3,(0,0,255),-1)

    elif event==cv2.EVENT_LBUTTONUP:
    drawing==False

    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

    画矩形(没有按m键)
    按下m键后画圆,这个圆,就是一个个点,我不好说他是点,因为他有半径,我就不造作自己了。。。

    祝大家新年快乐,

    祝大家新年快乐!

    大家新年快乐,近期更新可能会变慢,大家好好领悟前几章的东西,等一切准备就绪,就搞大的!

  • 相关阅读:
    使用 elementUI 的表单进行查询,表单中只有一个文本框时,回车会自动触发表单的提交事件,导致页面的刷新。
    Vue+elementUI 创建“回到顶部”组件
    elementUI 表格 table 的表头错乱问题
    阿拉伯数字转中文大写(整数)方法
    vue开发 回到顶部操作
    vue-cli 项目中使用 v-chart 及导出 chart 图片
    vue-router路由钩子
    vue随记
    vue中的watch
    Ajax 同步异步互相转换以及区别
  • 原文地址:https://www.cnblogs.com/yujiachen/p/7680355.html
Copyright © 2011-2022 走看看