今天我們要來點稍微高級的東西。在我們按下鼠標時可以畫矩形,而我們按下鍵盤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
-
- 畫矩形(沒有按m鍵)
-
- 按下m鍵后畫圓,這個圓,就是一個個點,我不好說他是點,因為他有半徑,我就不造作自己了。。。
祝大家新年快樂,
-
- 祝大家新年快樂!
大家新年快樂,近期更新可能會變慢,大家好好領悟前幾章的東西,等一切准備就緒,就搞大的!