ماشین های خودران (Self-Driving Car) برای حرکت در جاده ها و خیابان باید ابتدا بتوانند محیط خود را ببینید و سپس بر اساس داده ها دریافتی که همان تصویر محیط شان است، بتوانند حرکت کنند. به عبارت دیگر ماشین خودکار باید بتواند به صورت بلادرنگ (Real Time) تصویر محیط اطرافش را دریافت و سپس اطللاعاتی را از آن مانند خطوط درون و کنار جاده، ماشین های روبرو و غیره را از آن دریافت کند.

تبدیل هاف (Hough Transform) روشی برای استخراج ویژگیها (Feature Extraction) در آنالیز تصاویر، بینایی رایانهای و پردازش تصویر دیجیتال است. این روش در یک تصویر به دنبال نمونههایی از یک الگو (Pattern) میگردددر پردازش تصویر و بینایی رایانه ای، از روش تبدیل هاف، برای تشخیص هر گونه شکلی، مانند یک خط یا دایره استفاده می شود. در OpenCV متدهایی به نام ()HoughLines و ()HoughLinesP وجود دارند که از روش تبدیل هاف برای تشخیص خط (Line Detection) استفاده می کند.

پیش از اینکه از متدهای ()HoughLines یا ()HoughLinesP برای تشخیص خط درون یک ویدیو یا تصویر استفاده کنیم، باید فیلتر تشخیص لبه ها را بر روی آن تصویر اعمال کنیم. بنابراین به صورت خلاصه ابتدا باید گام های زیر را بر روی تصویر یا ویدیو برای تشخیص خط انجام دهید.

۱تبدیل تصویر یا فریم های خوانده شده به فضای رنگ Grayscale برای پردازش سریع

۲اعمال فیلتر تشخیص لبه توسط کلاس Canny

۳استفاده از متدهای ()HoughLines و ()HoughLinesP برای تشخیص خطوط درون یک تصویر یا ویدیو

۴استفاده از متد ()line، برای نمایش خط های تشخیص داده شده از نقطه های پیدا شده توسط متد ()HoughLines یا HoughLinesP

در ریاضی از معادله y = mx + b برای نمایش یک خط استفاده می شود که m شیب خط و b عرض از مبدا است. همچنین می توانیم خط را به صورت معادله r = xcosθ + ysinθ (دستگاه مختصات قطبی) نیز نمایش دهیم که در آن r فاصله عمود از مبدا (Origin) تا خود خط و θ+ نیز زاویه ای است در جهت پاد ساعتگرد که میان خط عمودی با محور افقی (x-axis) ایجاد شده است. در دستگاه مختصات قطبی، منظور از محور قطبی همان محور افقی یا محور x ها است و منظور از قطب همان مبدا مختصات است. در واقع روش تبدیل هاف، یک خط را معادله خط y = mx +b به معادله r تبدیل می کند. شکل زیر معادله دستگاه محتصات قطبی را نشان می دهد.

توجه کنید یک نقطه در مخصتات دکارتی به صورت زوج  (x, y) نشان داده می شود و به توجه به معادله شکل ۲ بالا، می توانیم مختصات یک نقطه را به صورت دو معادله شکل زیر بدست آوریم که در نهایت جمع آنها همان r خواهد بود. بنابراین با توجه به معادله دوم، می توانیم هر نقطه را با دو پارامتر (r, θ) به صورت شکل زیر نمایش دهیم.

در خط  از کد زیر پیش از هر چیز توسط کلاس Canny برای تشخیص لبه ها استفاده شده است که حاصل آن ماتریسی جدید به نام edges است. سپس از متد ()HoughLinesP برای تشخیص خط ها از درون ماتریس لبه ها (متغیر edges) استفاده شده است و در نهایت درون یک حلقه for و توسط متد ()line هر دو مختصات بدست آمده را رسم می کنیم.

به یاد دارید که برای رسم یک خط نیاز دو نقطه ابتدا و انتهای آن خط داریم و همچنین وظیفه متد ()HoughLinesP پیدا کردن همین مختصات های نقطه های درون خطوط است. در کد بالا ما از یک تصویر برای نمایش تشخیص خط توسط OpenCV استفاده کرده ایم.

کشیدن شکل در OpenCV با پایتون

دانلود سورس برنامه این مطلب OpenCV detect lines in images