اهداف

  • هندل کردن ایونت های موس
  • یادگیری تابع 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()