diff --git a/src/05.MouseHandling.md b/src/05.MouseHandling.md new file mode 100644 index 0000000..845e555 --- /dev/null +++ b/src/05.MouseHandling.md @@ -0,0 +1,100 @@ +# اهداف +* هندل کردن ایونت های موس +* یادگیری تابع `cv.setMouseCallback()` + +# یک نمونه ساده +برنامه ای منویسیم که هنگام دوبار کلیک کردن یک دایره روی عکس بکشد + +اول یک `callback function` برای موس ایجاد میکنیم که هنگامی که ایونت موس ایجاد میشود عمل میکند + +ایونت موس هر چیزی مثل کلیک چپ و کلیک راست و .... میتواند باشد + +یک مختصات `(x,y)` به ازای هر ایونت دریافت میکنیم + +با داشتن این مختصات و تابع میتوانیم هرکاری بکنیم + +یک نمونه ساده کد در مثال زیر آمده + +```python +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() +``` + +اکنون میرویم سراغ یک کد پیچیده تر +میخواهیم یک مستطیل یا دایره را روی حرکت موس رسم کنیم + +```pyhton + +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` و سیستمی برای تغییر حالت بین مستطیل و دایره ایجاد کنیم + +```python +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() +``` \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 1705043..4ed3652 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -3,4 +3,5 @@ - [نصب و راه اندازی](./01.installation.md) - [ شروع به کار با عکس](./02.StartWithImage.md) - [شروع به کار با ویدیو](./03.StartWithVideo.md) -- [توابع رسم](./04.DrawingFunc.md) \ No newline at end of file +- [توابع رسم](./04.DrawingFunc.md) +- [مدیریت موس](./05.MouseHandling.md) \ No newline at end of file