opencv 鼠標(biāo)事件

  • 目標(biāo)

  1. 學(xué)習(xí) opencv的鼠標(biāo)事件和鼠標(biāo)事件回調(diào)函數(shù)cv2.setMouseCallback()的使用胰柑。
  2. 根據(jù)獲取到的鼠標(biāo)的位置坐標(biāo)繪制不同的圖形。
  • 示例代碼

  • 查看opencv支持的鼠標(biāo)事件
python    
   
  # -*- coding:utf-8-*-     
 
  import numpy as np  
import cv2    
  
  events=[i for i in dir(cv2) if 'EVENT'in i]
print events

輸出結(jié)果

['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_MOUSEMOVE', 'EVENT_RBUTTONDBLCLK',  
'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
  • 利用鼠標(biāo)事件,以圖片上雙擊的位置為中心妇斤,繪制一個(gè)圓
python    
     
  # -*- coding:utf-8-*-     
 
  import numpy as np  
import cv2    
              
  def draw_circle(event, x, y, flags, param):    
     if event == cv2.EVENT_LBUTTONDBLCLK:        
        cv2.circle(img, (x, y), 100, (255, 0, 0), -1)    
  
  # 新建圖像窗口并將窗口與回調(diào)函數(shù)綁定
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')      
cv2.setMouseCallback('image', draw_circle)    
        
 while (1):     
# 顯示圖像并且按鍵盤上的**ESC**鍵即可關(guān)閉窗口  
    cv2.imshow('image', img)    
    if cv2.waitKey(20) & 0xFF == 27:       
        break    
# 最后銷毀窗口  
  cv2.destroyAllWindows()

顯示結(jié)果
以雙擊鼠標(biāo)的位置為圓心椎组,100px為半徑,畫出的圓如下


雙擊鼠標(biāo)后畫出的圓
  • 利用鼠標(biāo)事件赶盔,拖動(dòng)鼠標(biāo)時(shí)繪制矩形或圓
python    

  # -*- coding:utf-8-*-    
  
  import numpy as np  
import cv2    
    
  # 默認(rèn)繪圖狀態(tài)不可用企锌,為False,當(dāng)鼠標(biāo)按下時(shí)值為True   
  drawing = False  
# mode為True時(shí)畫矩形招刨,值為False時(shí)畫圓  
  mode = True  
# 定義x1, y1兩個(gè)值
x1, y1 = -1, -1  
  
  # 創(chuàng)建回調(diào)函數(shù)    
def draw_circle(event, x, y, flags, param):    
    global ix, iy, drawing, mode    
    # 按下鼠標(biāo)左鍵時(shí)返回起始位置坐標(biāo)    
    if event == cv2.EVENT_LBUTTONDOWN:        
        drawing = True        
        x1,  y1 = x, y  
  
    # 當(dāng)鼠標(biāo)左鍵按下并移動(dòng)時(shí)繪制圖形
    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:    
        if drawing == True:        
            if mode == True:  
                #  (x1, y1)為矩形起點(diǎn)霎俩,矩形顏色為(0, 255, 0)哀军,線條粗細(xì)為1px           
                cv2.rectangle(img, (x1, y1), (x, y), (0, 255, 0),1)            
            else:            
                # 起始點(diǎn)為圓心,起點(diǎn)到終點(diǎn)為半徑的圓
                r=int(np.sqrt((x-x1)**2+(y-y1)**2)) 
                cv2.circle(img,(x,y),r,(0,0,255),-1)  
    # 當(dāng)鼠標(biāo)松開停止繪畫  
    elif event==cv2.EVENT_LBUTTONUP:   
        drawing==False  
 
  # 新建圖像窗口并將窗口與回調(diào)函數(shù)綁定
  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  
      # 鍵盤輸入**m**時(shí)打却,畫圓 
      if k==ord('m'):
         mode=not mode 
      elif k==27: 
          break
cv2.destroyAllWindows()

顯示結(jié)果

矩形和圓

注:在拖動(dòng)鼠標(biāo)移動(dòng)的過程中杉适,隨著鼠標(biāo)的移動(dòng)會(huì)不斷地畫圓和矩形。
若利用鼠標(biāo)拖動(dòng)畫圓柳击,最后畫出的可能是一條線猿推,將上述畫起點(diǎn)到終點(diǎn)為半徑的圓的代碼改為如下代碼cv2.circle(img,(x,y),3,(0,0,255),-1)表示以拖動(dòng)時(shí)的鼠標(biāo)位置為圓心,半徑為3px的圓捌肴,結(jié)果如下

圓組成的線圈

可見在鼠標(biāo)拖動(dòng)過程中會(huì)不斷以起始點(diǎn)為圓心蹬叭,不斷畫圓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末状知,一起剝皮案震驚了整個(gè)濱河市秽五,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饥悴,老刑警劉巖坦喘,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異西设,居然都是意外死亡瓣铣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門贷揽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棠笑,“玉大人,你說我怎么就攤上這事禽绪”途龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵丐一,是天一觀的道長(zhǎng)藻糖。 經(jīng)常有香客問我,道長(zhǎng)库车,這世上最難降的妖魔是什么巨柒? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮柠衍,結(jié)果婚禮上洋满,老公的妹妹穿的比我還像新娘。我一直安慰自己珍坊,他們只是感情好牺勾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阵漏,像睡著了一般驻民。 火紅的嫁衣襯著肌膚如雪翻具。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天回还,我揣著相機(jī)與錄音裆泳,去河邊找鬼。 笑死柠硕,一個(gè)胖子當(dāng)著我的面吹牛工禾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝗柔,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼闻葵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了癣丧?” 一聲冷哼從身側(cè)響起槽畔,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坎缭,沒想到半個(gè)月后竟痰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體签钩,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掏呼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铅檩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憎夷。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昧旨,靈堂內(nèi)的尸體忽然破棺而出拾给,到底是詐尸還是另有隱情,我是刑警寧澤兔沃,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布蒋得,位于F島的核電站,受9級(jí)特大地震影響乒疏,放射性物質(zhì)發(fā)生泄漏额衙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一怕吴、第九天 我趴在偏房一處隱蔽的房頂上張望窍侧。 院中可真熱鬧,春花似錦转绷、人聲如沸伟件。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斧账。三九已至谴返,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咧织,已是汗流浹背亏镰。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拯爽,地道東北人索抓。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像毯炮,于是被迫代替她去往敵國(guó)和親逼肯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容