تعامل با ماوس در OpenCV

در این مطلب می خواهیم توسط متد ()setMouseCallback برنامه ساده ای را بنویسیم که با دو بار کلیک کردن کلید سمت راست ماوس، یک دایره کشیده شود. Callback ها توابعی هستند که به صورت مستقیم توسط برنامه نویس فراخوانی نمی شوند، بلکه با بروز یک رویداد (Event)، این توابع فراخوانی خواهند شد. اگر با برنامه نویسی گرافیکی آشنا باشید، به طور مثال زمانی که کلید چپ ماوس فشرده شده (left-button down) یک رویداد رخ داده است و از این رو باید رویداد اداره (Handle) شود، اداره این رویداد در غالب یک تابع نوشته خواهد شد. فهرست زیر نام تمامی رویدادهای درون OpenCV را نشان می دهد.

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_MOUSEHWHEEL
EVENT_MOUSEMOVE
EVENT_MOUSEWHEEL
EVENT_RBUTTONDBLCLK
EVENT_RBUTTONDOWN
EVENT_RBUTTONUP

آرگومان نخست متد ()setMouseCallback نام متغیری است که به ماتریس تصویری اشاره می کند که رویداد ماوس روی آن رخ داده است و آرگومان دوم نام تابع Callback است که نوع رویداد و مختصات بروز رویداد از سوی متد ()setMouseCallback به آن فرستاده می شود و سپس درون بدنه آن و بر اساس نوع رویداد، تصمیم گرفته می شود که چه پاسخی در قبال رویدادها انجام شود.

در کدهای زیر متغیر drawing برابر True باشد، یعنی کلید ماموس فشرده شده است، پس می توانیم شکل را رسم کنیم. برای رسم شکل نیاز به مختصات داریم. اینکه کدام رویداد رخ داده و مختصات جایی که ماوس در آنجا کلیک شده از طریق تابع Callback بدست می آید. ترتیب آرگومان های تابع Callback به صورت زیر هستند:

۱ – آرگومان اول نوع رویداد رخ داده را تعیین می کند. به طور مثال زمانی که کلید سمت چپ را دو بار کلیک می کنید، رویداد EVENT_LBUTTONDBLCLK از سمت متد ()setMouseCallback به تابع Callback فرستاده شده و درون این آرگومان ذخیره می شود. معمولا نام این آرگومان event است ولی اجباری به استفاده از این نام نیست.

۲ – آرگومان های دوم و سوم به ترتیب مختصات محلی است که ماموس در آنجا رخ داده است. در کدهای زیر و درون بدنه تابع draw_circle مقدار آرگومان های دوم و سوم به ترتیب درون متغیرهای ix و iy ذخیره می شوند.

۳ – آرگومان سوم ی

۴ – آرگومان چهارم س

در خط های ۱۱ تا ۱۳ از کدهای زیر ابتدا بررسی می شود که آیا رویداد  رخ داده است و در این صورت متغیر drawing برابر با True و متغیر ix و iy نیز با مختصات بروز رویداد مقدار دهی می شوند. توجه کنید در حالت کشیدن مستطیل در خط ۱۸، مقدار آرگومان های دوم و سوم برابر با مختصات گوشه بالا سمت راست است ولی در کشیدن دایره در خط ۲۰، مختصات مرکز دایره هستند.

سورس برنامه این مطلب Mouse callback opencv

کد کامل برنامه