今天我们要来点稍微高级的东西。在我们按下鼠标时可以画矩形,而我们按下键盘m键时,切换到画圆的模式,再按下m键,回到画矩形模式。
一起来写下代码,首先当然还是调用库
- import cv2
- import numpy as np
当我们按下鼠标左键时时,我们才开始画矩形,所以初始时默认是
- drawing=False
当鼠标左键按下时,drawing变量变为True,当鼠标左键抬起时又变回False,这个函数时控制画不画图的关键性变量
- mode=True
这里的mode变量控制着是画矩形,还是圆
我们要画一个封闭填充矩形的,前几张都有涉及,今天复习一下:线宽为-1,当线宽-1时表示封闭图形的颜色填充
所以可以这么写
- ix,iy=-1,-1
可以开始创建回调函数了
- def draw_circle(event,x,y,flags,param):
- global ix,iy,drawing,mode
global是python将变量定义为全局变量的函数,就是画矩形就那么画=。=
- if event==cv2.EVENT_LBUTTONDOWN:
- drawing=True
- ix,iy=x,y
这是当鼠标左键按下时,画矩形,ix,iy等于新的x,y
- elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
- if drawing==True:
当不是上一中情况是,就是这种:鼠标移动时检查变量,flags代表拖拽事件,表示按住左键拖拽。(这是百度的)drawing=True时画矩形,
- if mode==True:
- 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
祝大家新年快乐,