OpenCV學習系列教程第一篇:處理鼠標事件


來自opencv-python官方學習文檔,本人謹做翻譯和注釋,以及一些自己的理解

本文由作者翻譯並進行代碼驗證,轉載請注明出處~

官方文檔請參閱:https://docs.opencv.org/4.0.1/db/d5b/tutorial_py_mouse_handling.html

運行環境:

windows 10+pycharm professional 2018.3+python 3.7.1+opencv 4.0.1

目標:

1,學習到如何處理鼠標事件

2,學習 cv.setMouseCallback()函數

簡單示例

創建一張黑色背景的圖------>處理鼠標點擊事件:當鼠標點擊兩次時,以點擊的點為圓心,創建半徑為100的圓

import numpy as np
import cv2 as cv # mouse callback function def draw_circle(event,x,y,flags,param): if event == cv.EVENT_LBUTTONDBLCLK: cv.circle(img,(x,y),100,(255,0,0),-1) # Create a black image, a window and bind the function to window img = np.zeros((512,512,3), np.uint8) cv.namedWindow('image') cv.setMouseCallback('image',draw_circle) while(1): cv.imshow('image',img) if cv.waitKey(20) & 0xFF == 27: break cv.destroyAllWindows()

復雜示例:

針對鼠標滑動、點擊等產生的事件,選擇不同的方法,實現繪制矩形或者是圓形的功能。

所以該鼠標回調函數由兩部分組成:一是繪制矩形,一是繪制圓形。

第一次修改:cv.setMouseCallback('image',draw_circle) #這一句為image這個窗口增加了一個鼠標事件的回調函數

import numpy as np
import cv2 as cv
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
# mouse callback function
# img=cv.imread('C:\\Users\\xjtu\\Desktop\\1.jpg')
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv.imshow('img',img)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
cv.imshow('img', img)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv.imshow('img', img)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
cv.imshow('img', img)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv.destroyAllWindows()
 

案例運行照片:

運行照片截圖如下,隨意點擊兩處,即可生成矩形

 

英文狀態下,輸入m之后,點擊,即可生成圓,運行截圖如下

第一次修改:

setMouseCallback(

const String  winname

MouseCallback  onmouse

void*  userdata=0)

winname:窗口名

onmouse:鼠標事件的回調函數

userdata:回調函數的可選參數項

 


免責聲明!

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



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