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鍵后畫圓,這個圓,就是一個個點,我不好說他是點,因為他有半徑,我就不造作自己了。。。

祝大家新年快樂,

祝大家新年快樂!

大家新年快樂,近期更新可能會變慢,大家好好領悟前幾章的東西,等一切准備就緒,就搞大的!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM