میدونستین در تولیدیهای لوله و اتصالات، برای شمارش لولهها در هر دسته، داخل هر لوله سنگ میذارن؟ چرا سنگ میذارن؟
چون لولهها که کنار هم و روی هم قرار داده میشوند، خطای دید ایجاد میکنند، برای اینکه دچار خطا نشن، داخل لولههای شمرده شده، یک سنگ میذارن، که دوباره نشمارنشون!
در این آموزش، میخواهیم با استفاده از یک رزبری پای و تکنیکهای بینایی ماشین و پردازش تصویر، تعداد لولههای موجود در یک فیلم یا تصویر را بشماریم.
این کار هم خیلی سخته هم خیلی زمان زیادی میبره… حدس زدید چی میخوام بگم؟ بله…! با هوش مصنوعی میتونیم این کار رو تا حد بسیار زیادی خودکار کنیم!
ایده کلی اینه که چند فیلتر روی عکس انجام بدیم و لبهها رو پیدا کنیم، بعد از لبههای شناسایی شده محدودههای به هم پیوسته و محدب رو پیدا کنیم، بعد محاسبه کنیم که این محدودهها چقدر دایره شکل هستند و در نهایت تعداد این دایره شکلها رو محاسبه کنیم.
مثلاً در تصویر زیر به روش Laplacian لبهها تشخیص داده شده:
ابزاری که برای این کار استفاده میکنیم، کتابخانه OpenCV و زبان Python هست و همه کدها قابل اجرا به روی Raspberry Pi Zero هستند.
به جای اینکه ایده کلی رو از 0 تا 100 پیاده سازی کنیم و درگیر محاسبات ریاضی بشیم، از توابع آماده OpenCV استفاده میکنیم.
روش اول، استفاده از HoughCircles
این تابع از روش Hough Gradient استفاده میکنه، برای تشخیص تعداد لوله ها مراحل زیر رو انجام میدیم:
اول تصویر رو از فایل میخونیم و با تابع cvtColor تصویر رو از RGB به GRAY تبدیل میکنیم، چون به اطلاعات رنگها برای تشخیص لبهها نیازی نداریم.
بعد با استفاده از medianBlur تصویر رو کمی محو میکنیم تا نویز کمتر بشه.
این روش برای تصویر اولی که در این مقاله آورده شده، تشخیص درستی نمیده (ممکنه با دستکاری پارامترها به نتیجه برسیم، اما تا میتونیم باید با دستکاری های کمتر نتیجه بگیریم).
ایراد این روش اینه که پارامترهای کمی برای کنترل داره و بیشتر دنبال دایرههای کامل میگرده و اگه ما شبه-دایره ها رو هم بخواهیم (مثل بیضی) استفاده از این روش کار رو سخت میکنه.
معمولاً بسته به اندازه تصویر و زاویهای که با دوربین عکسبرداری میشه، دایرهها حالت بیضی شکل پیدا میکنند یا گاهی قسمتی از لولهها پشت لولههای دیگه پنهان میشن.
روش دوم، استفاده از SimpleBlobDetector_create
این تابع برای تشخیص محدوده هاست و از روش Thresholding چندین تصویر 0 و 1 از تصویر اصلی ایجاد میکنه تا تشخیص خودش رو انجام بده.
برای تشخیص تعداد لوله ها مراحل زیر رو انجام میدیم:
اول تصویر رو میخونیم و پارامترهای مورد نیاز تابع رو با استفاده از دستور SimpleBlobDetector_Params ایجاد میکنیم (اینجا نیازی به تبدیل رنگ تصویر نیست و این کار توسط تابع انجام میشه).
با True کردن filterByArea به تابع میگیم که مساحت محدوده ها رو در نظر بگیره و با تنظیم minArea مساحت رو به حداقل مقداری تنظیم میکنیم.
با True کردن filterByCircularity به تابع میگیم که میزان دایره ای شکل بودن محدوده رو در نظر بگیره، و با تنظیم minCircularity که یک عدد اعشاریع، میزان دایره ای شکل بودن محدوده رو تنظیم میکنیم.
با تنظیم minConvexity و minInertiaRatio میزان محدب بودن و میزان حداقل اینرسی (مقاومت به تغییرات) محدوده رو تنظیم میکنیم.
در ادامه این پارامترها رو پاس میدیم به تابع SimpleBlobDetector_create تا یک شیء تشخیص دهنده به ما برگردونه.
دستور detect رو بر روی تشخیص دهنده صدا میکنیم و به عنوان پارامتر تصویر رو بهش پاس میدیم و محدودههای تشخیص داده شده را دریافت میکنیم.
محدودههای تشخیص داده شده رو با استفاده از تابع drawKeypoints بر روی تصویر نقاشی میکنیم.
این روش نسبت به روش قبلی، انعطاف بالاتری داره و اجازه میده تا اشکالی که کاملاً دایره شکل نیستند رو هم تشخیص بدیم.
سلام وقت بخیر
من میخواستم یه لیزر قرمز یا سبز رو به یه هدفی که شامل رنگ های مختلف هست بندازم ، برای مثال هدفم یه مربع در فاصله ۱۰_۱۵ متری هست که شامل رنگ های مختلفه و حالا با انداختن لیزر و با raspberry zero میخواستم تشخیص بدم که لیزر دقیقه کجای اون قسمت رنگی قرار داره
ممنون میشم اگر بتونید کمکی کنید
ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموتهای درب بازکن تا ریموتهای دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی میکنند و آنهم ارسال اطلاعات بهصورت بیسیم است....
امنیت همیشه و در همهی اعصار، مقولهی مهم و قابلتوجه ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموتهای کنترل خواهیم پرداخت....
سلام وقت بخیر
من میخواستم یه لیزر قرمز یا سبز رو به یه هدفی که شامل رنگ های مختلف هست بندازم ، برای مثال هدفم یه مربع در فاصله ۱۰_۱۵ متری هست که شامل رنگ های مختلفه و حالا با انداختن لیزر و با raspberry zero میخواستم تشخیص بدم که لیزر دقیقه کجای اون قسمت رنگی قرار داره
ممنون میشم اگر بتونید کمکی کنید
سلام
اگه درست متوجه شده باشم، میخواهین مکان نقطهای لیزر رو روی مربع تشخیص بدین؟
بله دقیقا
با استفاده از روش یافتن مربعها یا الگویابی، اون مربع رو پیدا کنید و با استفاده از متدی که در این مقاله هست میتونین اون نقطه رو پیدا کنین.
عالی حالا چطور میشه سایز هاشم جدا کنه؟!
درست متوجه سوالتون نشدم، یعنی بر اساس سایز دسته بندی کنه؟