اهداف
- هندل کردن ایونت های موس
- یادگیری تابع
cv.setMouseCallback()
یک نمونه ساده
برنامه ای منویسیم که هنگام دوبار کلیک کردن یک دایره روی عکس بکشد
اول یک callback function
برای موس ایجاد میکنیم که هنگامی که ایونت موس ایجاد میشود عمل میکند
ایونت موس هر چیزی مثل کلیک چپ و کلیک راست و .... میتواند باشد
یک مختصات (x,y)
به ازای هر ایونت دریافت میکنیم
با داشتن این مختصات و تابع میتوانیم هرکاری بکنیم
یک نمونه ساده کد در مثال زیر آمده
import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print( events )```
ساخت `callback function` یک قاعده ثابتی دارد که در همه جا قابل اجراست
یک نمونه کد :
```python
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()
اکنون میرویم سراغ یک کد پیچیده تر میخواهیم یک مستطیل یا دایره را روی حرکت موس رسم کنیم
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
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)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
اکنون باید یک callback function
و سیستمی برای تغییر حالت بین مستطیل و دایره ایجاد کنیم
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()