تشخیص Shape ها در OpenCv
از سری مقالات آموزش OpenCv اندروید, مبحث تشخیص Shape ها را بر میگزینیم.
در مقاله قبل روش های تشخیص edge را بررسی کردیم. پردازش pixel-by-pixel لبه هارا مشخص میکند. در مبحث تشخیص Shape ها, به روش های بیشتر و دقیق تری نیاز داریم. برای تشخیص Shape, ابتدا باید لبه ها را پیدا کنیم. پس از اعمال روش تشخیص لبه ها, نقاط بسیاری به عنوان لبه برای ما مشخص میشود. از اتصال این نقاط به یکدیگر میتوان یک شکل را ایجاد کرد. اما نکته مهم چگونگی و ترتیب اتصال این نقاط به یکدیگر است.
روش های زیادی برای اتصال چندین نقطه به یگدیگر وجود دارد. در این مقاله به مبحث Hough Transform میپردازیم. در این روش یک نقطه را پیدا میکنیم و تمام خطوطی که میتواند از این نقطه عبور کند را مشخص میکنیم. این عمل را برای تمام نقاط یافت شده نیز انجام میدهیم. در مرحله بعد خطوط را ارزش دهی میکنیم و ملاک ارزش دهی نیز تعداد نقاطی است که خط از آنها عبور میکند. بنابراین خطی که از تعداد بیشتری از نقاط مشخص شده توسط الگوریتم های تشخیص لبه, عبور کند, ارزش بیشتری دارد.
شکل فوق نمونهای از اعمال این الگوریتم بر پنج نقطه است. سپس پرارزش ترین خط را مشخص میکنیم.
پیاده سازی این الگوریتم به دو صورت میباشد:
- Standard Hough Transform : این روش بر پایه الگوریتم hough transform است و تمام نقاط را بررسی میکند. در نهایت نقاط را به یکدیگر متصل میکند و شکل ها را تشکیل میدهند.
- Probabilistic Hough Transform : در این الگوریتم, هدف بر این است که پیچیدگی و حجم پردازش کمتر شود. برای کاهش میزان پردازش, تعداد نقاط را کمتر میکند. در این روش ارزش خطوط را بر تعداد خطوط تقسیم میکنیم. به این ترتیب بازه ارزش دهی کاهش مییابد و خطوط با ارزش بیشتری انتخاب میشوند.
برای ترسیم خطوط در صفحه از معادله y=ax+b استفاده میشود که a برابر شیب خط است. اما اگر یک خط عمودی باشد, شیب آن بینهایت است. بنابراین برای رفع این مشکل از دستگاه قطبی استفاده میشودو معادله دستگاه قطبی به صورت
است و در اینجا برای مشخص شدن مقدار x و y, دو متغیر r و teta را مقدار دهی میکنیم.
برای پیاده سازی این الگوریتم ابتدا با استفاده از روش های تعریف شده در مقاله قبل, نقاط را مشخص میکنیم (در این مقاله از الگوریتم Canny استفاده میکنیم). سپس با استفاده از الگوریتم probabilistic hough transform این نقاط را به یکدیگر متصل میکنیم. پروژه ای که از ابتدا سری مقالات آغاز کردیم را ادامه میدهیم و این متد را به آن اضافه میکنیم:
private void probabilisticHoughTransform(Mat src) { cannyEdgeDetector(src); Mat lines = new Mat(); int threshold = 50; Imgproc.HoughLinesP(src, lines, 1, Math.PI / 180, threshold); Imgproc.cvtColor(src, src, Imgproc.COLOR_GRAY2BGR); int i = 0; while (i < lines.cols()) { double[] l = lines.get(0, i); double xStrt = l[0]; double yStrt = l[1]; double xEnd = l[2]; double yEnd = l[3]; org.opencv.core.Point lStart = new org.opencv.core.Point(xStrt, yStrt); org.opencv.core.Point lEnd = new org.opencv.core.Point(xEnd, yEnd); Imgproc.line(src, lStart, lEnd, new Scalar(0, 0, 255), 3); i++; }
در کد بالا ابتدا متد canny edge detector را که در مقاله قبل نوشتیم, فراخوانی کردیم. توجه داشته باشید که بهتر است حداقل و حداکثر مقدار threshold برای canny edge detector را به ترتیب برابر ۸۰ و ۱۰۰ قرار دهید. سپس متد HoughLinesP را فراخوانی میکنیم. متغیر اول این متد Mat ورودی و متغیر دوم یک Mat برای نگهداری خطوط است. مقادیر ذخیره شده در این Mat, متغیر های xStrt, yStrt, xEnd و yEnd است. متغیر سوم مقدار r را مشخص میکند که در اینجا برابر با یک pixel در نظر گرفته ایم. متغیر چهارم مقدار teta را مشخص میکند که در اینجا برابر مقدار یک زاویه بر حسب درجه است. متغیر پنجم نیز حداقل مقدار ارزش یک خط را مشخص میکند. توجه داشته باشید که علت اینکه مقدار threshold را کم در نظر گرفته ایم, تقسیم ارزش خط بر تعداد خطوط توسط probabilistic hough transform است. وقتی از standard hough transform استفاده میکنید, مقدار threshold باید بیشتر باشد. در نهایت با استفاده از متد line خط را رسم کرده ایم. متغیر پنجم متد line ضخامت خط را مشخص میکند.
در این مقاله سعی شد تا با استفاده از مفاهیم تعریف شده در مقالات قبل و متد hough transform, چگونگی تشخیص Shape ها را بررسی کنیم.
در اینجا به سری مقالات آموزش OpenCv پایان میدهیم.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
آموزش Gradle – اهمیت Project Automation
درک مفهوم کدنویسی تمیز در اندروید
5 هک ساده برای کاهش سایز فایل APK
آشنایی با RecyclerView در اندروید
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام.وبسایتتون خیلی خوب و
مفیده.به کارتون ادامه بدین
سلام. ممنون از همراهیتون دوست عزیز. سری مقالات OpenCv در اندروید به اتمام رسیده اما اگر مقاله ای مد نظرتون هست میتونین بگین تا در سایت قرار داده بشه