در مطلب تشخیص خط در OpenCV در مورد HoughLineP برای شناسایی خط ها صحبت کرده ایم. در ادامه مبحث Hough Transformation می خواهیم چگونگی شناسایی دایره ها را درون تصویریا ویدیو دوربین سیستم آموزش دهیم. برای آغاز، در این نوشته نخست شکل زیر را به ورودی کد زیر می فرستیم و سپس در خروجی هم شمارگان (تعداد) دایره های تشخیص داده شده بر روی تصویر نشان داده می شود و همچنین دایره تشخیص داده شده نیز به همراه کانون (مرکز) آن مشخص شده است.

در کد بالا، نخست فیلتر بلور (برای حذف نویزها) بر روی آن اعمال می شود و سپس تصویر فیلتر شده (که در متغیر cimage نگهداری می شود) از فضای BGR به فضای GRAY تبدیل می شود. در دنباله تابع ()HoughCircles که کاربردی شبیه تابع ()HoughLinesP دارد به تصویر خاکستری اعمال می شود. متغیر circle خروجی ()HoughCircles را در خود نگه می دارد که عضو نخست آن با اندیس صفر یک آرایه دو بعدی ماژول NumPy است که هر آرایه درونی آن، مشخصات یک دایره (مختصات مرکز دایره و شعاع دایره) را در خود دارد. از تابع ()len در پایتون می توانیم اندازه آرایه دو بعدی در اندیس صفر را بدست آوریم که برابر یا همان تعداد دایره های تشخیص داده شده است. خط زیر از کد پیامی را آماده می کند که، در بالا تصویر خروجی، تعداد دایره های تشخیص داده شده را نشان می دهد.

مات کردن تصویر با OpenCV و پایتون

هموار سازی تصویر با OpenCV و پایتون

ایجاد آرایه ها بوسیله ماژول NumPy

اسلایس بندی آرایه های NumPy

در کد بالا، اندازه نخستین عنصر متغیر circles با اندیس صفر، [circles[0 را پیدا کردیم، زیرا همین نخستین المان خروجی ()HoughCircles است که خصوصیت های دایره را در خود دارد، در شکل زیر تصویر اصلی و تصویر خروجی نشان داده شده است و می بینید که در تصویر خروجی، ۷ دایره تشخیص داده شده است. در واقع [circles[0 برابر با مختصات همین ۷ دایره است که در این نوشته و بر اساس این تصویر و پارامترهای فرستاده شده به تابع ()HoughCircles تشخیص داده شده اند.

در خط های ۱۶ تا ۱۹ از کد بالا که در زیر نوشته شده اند، می خواهیم با کمک تابع ()circle دایره و کانون (مرکز) دایره را مشخص کنیم. بنابراین در یک حلقه for، همه آرایه های درونی عنصر با اندیس صفر متغیر circles پیمایش شده که در واقع در هر گام یک مختصات دایره برداشته شده و سپس رسم می شود. در پایان بدست تابع ()putText متن پیغام درون متغیر message در مختصات مورد نظر نشان داده می شود.

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

قرار دادن متن روی تصویر و ویدیو در OpenCV

در کد زیر، نخست دوربین رایانه خوانده شده و سپس در خط ۱۷، برای هر فریم خوانده شده، تشخیص دایره انجام می شود، سپس در خط ۱۹ بررسی می شود که آیا متغیر circles (در خط ۱۷) پوچ یا None نباشد، زیرا اگر در خط ۱۷ برای هر فریم، دایره ای تشخیص داده نشود، پس متغیر circles برابر با None خواهد بود. کد زیر، بسیار همانند کدی است که در بالا گفتیم و تنها شما باید یک شی دایره ای را پیش روی دوربین بگیرید و شاید باید کمی شی در در پیرامون دوربین جابجا کنید.

دانلود سورس کد این نوشته Find Circle OpenCV