در نوشته تشخیص گوشه ها با الگوریتم Harris در OpenCV تشخیص دهنده هَریس برای یافتن گوشه ها (Harris Corner Detector) را گفتیم. در بینایی ماشین چندین تشخیص دهنده هست ولی همگی برای کاربردهای بلادرنگ (Real Time) پسندیده نیستند، زیرا همگی به بسیار تند (و سریع) نیستند. برای نمونه، در حرکت ربات دوربین دار در خیابان یا SLAM (کوتاه شده Simultaneous Localization and Mapping) از کاربردهایی بلادرنگ هستند که تشخیص نقطه های مورد علاقه یا گوشه ها باید به تندی انجام شود.

الگوریتم دیگری برای تشخیص گوشه ها به نام FAST (کوتاه شده Features from Accelerated Segment Test) هست که برای کاربردهای بلادرنگ پسندیده است. رویکرد این الگوریتم بر پایه به کاربردن پیکسل همسایگی یا مجاورت (Pixel Neighborhood) برای پیدا کردن نقطه مورد علاقه در تصویر است.

الگوریتم FAST در بینایی ماشین و OpenCV

توجه کنید الگوریتم های Harris و FAST و دیگر الگوریتم های پیش رو، همگی برای تشخیص دهنده ویژگی (Feature Detector) هستند که برای تشخیص گوشه های تصویر به کار می روند. برای یادآوری، گوشه ها ناحیه هایی درون تصویر هستند که در درون آنها، تغییرات زیادی در شدت گرادیات در هر دو راستا هست. در ادامه گام های الگوریتم FAST گفته شده است.

  • یک پیکسل دواطلب (نامزد برای) نقطه مورد علاقه P درون تصویر انتخاب می شود که شدت آن را Ip در نظر گرفته می شود.
  • یک مقدار آستانه t پسندیده نیز باید انتخاب شود.
  • همانند شکل زیر یک دایره با ۱۶ پیکسل پیرامون پسکیل آزمایشی در نظرگرفته می شود. (شماره پیکسل های دایره از ۱ تا ۱۶ است)
  • اکنون پیکسل P گوشه است، اگر مجموعه ای از n پیکسل پیوسته درون دایره باشد که همگی آنها روشن تر از شدت Ip + t باشند یا اینکه همگی تیره تر از شدت Ip – t باشند. شماره n باید برابر با ۱۲ باشد.
  • یک آزمایش با سرعت بالا (High Speed Test) به منظور حذف شمار زیادی از نا گوشه ها (Non-Corners) انجام می شود. از این رو تنها چهار پیکسل ۱ با ۹ و ۵ با ۱۳ بررسی می شوند. نخست پیکسل های ۱ و ۹ در دایره همراه هم آزمایش می شوند، اگر آنها هر دو روشن تر یا تیره تر باشند. اگر اینگونه نبود، پس دو پیکسل دیگر، یعنی پیکسل های ۵ و ۱۳ بررسی می شوند. به هر حال، P زمانی گوشه خواهد بود که، دست کم سه تا از این پیکسل ها روشن تر از Ip + t و یا تیره تر از Ip – t باشند. بنابراین اگر چنین چیزی نبود، پس پیکسل P گوشه نخواهد بود.

ایرادهای الگوریتم FAST

با اینکه الگوریتم FAST بسیاری ویزگی دارد که یافتن گوشه ها را بهبود می دهد و برای کاربردهای بلادرنگ (همانند فریم های دوربین) بسیار کارآمد است ولی بازهم دارای برخی از ایرادها نیز است که در زیر فهرست شده اند. 

  • آزمایش یا سرعت بالا برای n < 12 به خوبی قابل تعمیم نیست. اگر n <12 باشد، شاید که یک پیکسل نامزد P یک گوشه باشد و به گونه ای که تنها 2 از 4 نمونه پیکسل آزمایش هر دو روشن تر از Ip + t یا تیره تر از Ip – t باشند در حالی که دست کم باید سه از چهار نمونه پیکسل انتظار ما است.
  • راندمان تشخیص دهنده (Detector) به انتخاب و ترتیب این پیکسل های تست شده بستگی دارد.
  • چندین ویژگی در مجاورت (Adjacent) یکدیگر تشخیص داده می شوند.

محو نا بیشینه

شناسایی چندین نقطه مورد علاقه در مکانهای مجاور یکی دیگر از مشکلات است. این ایراد به کمک روش محو نا بیشینه یا محو غیر حداکثر (Non-maximal Suppression) پوشش داده می شود. به گفته دیگر، گاهی الگوریتم هر شی را به جای یک بار، چندین بار تشخیص می دهد. محو نا بیشینه که آن را NMS می نامیم، روشی است که اطمینان می دهد تا هر شی (Object) بدست الگوریتم مربوطه، تنها یک بار شناسایی و تشخیص داده شود. گام های زیر چگونگی کارکرد محو نا بیشینه را نشان می دهد.

  • یک تابع امتیاز به نام V را برای همه نقطه ویژگی شناسایی شده محاسبه کنید. تابع V برابر با قدر مجموع، قدر مطلق اختلاف های میان مقدار پیکسل P و 16 پیکسل پیرامون است.
  • دو نقطه مورد علاقه مجاور را در نظر گرفته می شوند و مقدارهای V آنها را محاسبه می کند.
  • آن که مقدار V کمتری دارد، کنار گذاشته می شود.

 

گام های به کار گیری الگوریتم FAST در OpenCV

الگوریتم FAST، یک الگوریتم همگانی در بینایی ماشین که در Opencv نیز پیاده سازی شده است. در ادامه گام هایی را فهرست کرده ایم که باید در کتابخانه OpenCV دنبال کنید تا بتوانید از ابزار آماده شده در OpenCV برای تشخیص گوشه ها کمک بگیرید.

  • نخست باید یک تشخیص دهنده را از روی تابع ()FastFeatureDetector_create بسازیم. در واقع متغیری از روی این تابع ساخته می شود که از این پس به کمک آن به دیگر متدها و ابزارها دسترسی خواهیم داشت.
  • تنظیم و شناساندن پارامتر آستانه برای فیلتر کردن نقطه های (یا گوشه های) تشخیص داده شده. بر پایه شکل زیر و به ساده ترین گفته، هر چه این شماره بزرگتر باشد پس فیلتر بر روی شمار گوشه ها زیاد تر و گوشه های کمتری یافت می شود. برای تنظیم آستانه باید مقدار دلخواه به تابع ()setThreshold فرستاده شود.
  • تنظیم اینکه ایا شیوه Non-maximal Suppression به کار گرفته شود یا نه؟ برای این باید مقدار Flag های از پیش آماده به تابع ()setNonmaxSuppression فرستاده شوند.

در کد زیر دو متغیر به نام  input_image و output_image شناسانده شده است که به ترتیب تصویر ورودی که می خواهیم گوشه های آن را تشخیص دهیم و تصویر خروجی که می خواهیم تصویر همراه با گوشه های تشخیص داده شده را در خود نگه می دارند. در بند ۲۵ از کد، به کمک تابع ()imwrite تصویر همراه گوشه های تشخیص داده شده در متغیر و بهتر است بگوییم در مسیر متغیر output_image نوشته می شود.

در بندهای ۱۱ و ۱۲ به ترتیب دو متغیر use_nms و threshold تعریف شده اند. مقدار use_nms برابر با True است و در بند ۱۶ بررسی می شود که آیا مقدار آن درست باشد و اگر بود، مقدار 0 به تابع ()setNonmaxSuppression و همچنین مقدار متغیر threshold نیز برای تعیین پارامتر آستانه، به تابع ()setThreshold فرستاده می شود.

در بند ۱۴ یک متغیر از روی تابع ()FastFeatureDetector_create به نام fast_detector ساخته شده است و سپس در بندهای ۱۷و ۱۹ به ترتیب تابع های ()setNonmaxSuppression و ()setThreshold با مقداری دلخواه فراخوانی شده اند. توجه کنید متغیر threshold پیش فرض دارای مقدار ۱۰ است ولی برای آزمایش می توانید مقدارهای دیگر مانند ۳۰ و ۵۰ را به بدهید تا خروجی ها را با یکدیگر مقایسه کنید.

سپس در بند ۲۱ برای انجام تشخیص گوشه ها باید تابع ()detect فراخوانی شود و همانگونه که می بینید متغیر gray که همان تصویر خاکستری بدست آمده از تابع ()cvtColor را به آن فرستاده ایم. سپس به کمک تابع دیگری از خود OpenCV به نام () می خواهیم دایره هایی را برای نمایش گوشه ها بکشیم. آرگومان نخست همان متغیر gray یا برابر با تصویری ورودی است به تابع ()detect است. آرگومان دوم خروجی تابع ()detect است که در اینجا intrest_points نامیده شده است. آرگومان سوم متغیری است که خروجی تابع () در آن ریخته می شود که دربرگیرنده گوشه های مشخص شده با دایره های کوچک است. همانگونه که می بینید همین متیغر به تابع ()imwrite برای نوشته شدن روی دیسک فرستاده شده است. پارامتر color رنگ دایره ها را نشان می دهد.