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

به طور مثال فرض می خواهیم چشم، چهره را درون یک تصویر پیدا کنیم. بنابراین برای مشخص کردن چشم و چهره تشخیص داده شده باید آنها را توسط مستطیل ها و با بهره گیری از مفهوم ROI مشخص کنیم. کاربرد دیگر در شمارش افرادی است که از جلوی یک دوربین می گذرند. قاعدتا تنها افراد نیستند که از جلوی دوربین حرکت می کنند بلکه اشیا دیگری مانند حیوان خانگی، کیف دستی، چمدان یا هر چیز دیگری نیز از جلوی دوربین گذر می کنند ولی ما تنها می خواهیم افراد را شمارش کنیم، پس برنامه تنها باید انسان را تشخیص دهد، بنابراین شکل باید هر کدام از انسان ها را مشخص کند.

تشخیص خط ها درون تصویر توسط کتابخانه OpenCV و پایتون

تشخیص دایره ها تصویر و و ویدیوها توسط کتابخانه OpenCV و پایتون

تشخیص چشم توسط کتابخانه OpenCV و پایتون

تشخیص چهره توسط کتابخانه OpenCV و پایتون

تشخیص و شمارش عابران پیاده توسط کتابخانه OpenCV و پایتون

تشخیص ماشین و وسیله نقلیه توسط کتابخانه OpenCV و پایتون

تشخیص اشیا توسط رنگ ها توسط کتابخانه OpenCV و پایتون

تشخیص عددهای دست نویس (Handwritted Digit) با الگوریتم رگرسیون لجستیک در کتابخانه Scikit-Learn (یادگیری ماشین)

توابعی که از کتابخانه OpenCV در این مطلب گفته می شود در پایتون نوشته شده اند ولی شما می توانید آنها را در زبان سی پلاس پلاس نیز به کار ببرید. توسط کتابخانه OpenCV و توابع آن می توانیم یک نقطه، خط، دایره، بیضی و مستصیل ها را بکشیم. برای این منظور توابع زیر وجود دارند.

۱تابع ()line برای رسم خط در تصویر یا ویدیو

۲تابع ()circle برای رسم دایره در تصویر یا ویدیو

۳تابع () ellipse برای رسم بیضی در تصویر یا ویدیو

۴تابع ()rectangle برای رسم مستصیل در تصویر یا ویدیو

برای رسم شکل پیش از هر چیز باید توسط تابع ()imread یک شکل را بخوانید و آرایه (ماتریس) آنرا ایجاد و در متغیری ذخیره کنید. سپس نام این متغیر را به عنوان آرگومان نخست به تابع های رسم شکل می فرستیم. در نهایت در خط های ۶ تا ۱۴ از کد زیر یک نوع دیکشنری پایتون ایجاد شده است که هر کلید آن نام یک رنگ با مقدار RGB آن رنگ استهمچنین در کدهای زیر و مطابق با مطلب های پیشین در مورد پیدا کردن تعداد سطرها و ستون های تصویر و ویدیو در پایتون، تعداد سطرها را در متغیر imageRows و تعداد سطرها را در متغیر imageCols ذخیره کرده ایم.

توجه کنید که مختصات گوشه سمت راست بالا، برابر با (0, 0)، گوشه سمت چپ بالا برابر بالا، (0, imageCols)، گوشه سمت راست پایین برابر با (imageRows, 0) و گوشه سمت راست پایین برابر با (imageRows, imageHeigh) است. در ادامه و در بخش رسم خط، از این مختصات ها برای رسم خط استفاده کرده ایم.

تابع ()line برای کشیدن خط راست

هر نقطه در محور مختصات از طریق دو مقدار محور افقی (x-axis) و محور عمودی (y-axis) مشخص می شود و از این رو یک پیکسل در تصویر با توجه به پهنای تصویر (تعداد سطرهای ماتریس) که برابر با محور افقی و ارتفاع (درازای) تصویر (تعداد ستون های تصویر) که برابر با محور عمودی است، شناسایی می شوددر مفاهیم ریاضی یک خط باز شامل بی نهایت نقطه است ولی در تصویر یک خط راست، به صورت یک خط بسته است. خط بسته، خطی است که ابتدا و انتهای آن مشخص است، پس برای رسم یک خط راست در تصویر، باید نقطه شروع و پایان خط را مشخص کنیم.

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

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

تابع ()line در خطوط اول و دوم از کد بالا، در واقع قطرهای تصویر را رسم می کنند و هر کدام از چهار خط بعدی، یکی از اضلاع تصویر را با یک خط مشخص می کنند. اما آخرین تابع ()line نوشته شده، چه کاری را انجام می دهد. هدف از آنرا می توانیم رسم یک نقطه تو پر و شبیه دایره در نظر بگیریم زیرا اولا نقطه های ابتدایی و پایانی یکسان هستند و همچنین آرگومان thickness باعث ضحیم شدن نقطه شده است. درشکل انتهایی این مطلب شما می توانید نتیجه اجرای این ۵ بار اجرای تابع ()line را ببینید.

تابع ()circle برای کشیدن دایره

برای کشیدن دایره نیاز به مشخص کردن مرکز و شعاع دایره داریم و برای همین منظور آرگومان دوم نقطه یت پیکسلی را مشخص می کند که به عنوان مرکز دایره خواهد بود و آرگومان سوم نیز اندازه شعاع دایره را تعیین می کند. آرگومان پایانی می تواند سه محدوده عدد منفی، صفر و مثبت را دریافت کند. اگر عدد 1- فرستاده شود، پس دایره از درون پر می شود و اگر عدد 1 به بالا انتساب داده شود، پس دایره از بیرون ضخیم می شود. عدد صفر نیز یک دایره تو خالی و غیر ضخیم (نازک) را رسم می کند.

در شکل انتهایی همین مطلب می توانید ببینید که یک دایره ضخیم سیاه رنگ به مرکزیت تصویر رسم شده است. بنابراین با توجه به کد بالا متوجه می شویم که مختصات مرکز دایره و با توجه به دو متغیر imageRows و imageCols برابر با (imageWidht/2, imageCols/2) است.

تابع ()rectangles برای کشیدن مستصیل

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

تابع ()ellipse برای کشیدن بیضی

کد کامل برنامه

دانلود سورس این مطلب Draw figure in opencv