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

در مطلب های پیشین در مورد چگونگی کار با کتابخانه OpenCV در زبان سی پلاس پلاس صحبت کرده ایم. هدف این بود که شما با چگونگی کار با OpenCV در زبان سی پلاس پلاس آشنا شوید، به طور مثال بدانید که ساختار داده یا کلاس Mat برای نگهداری ماتریس یک تصویر استفاده می شود که آن تصویر توسط متد ()imread خوانده شده است. همچنین می توانیم توسط متدهای سازنده این کلاس، ماتریس هایی با ابعاد و نوع داده دلخواه مانند 8UC3 را ایجاد کنیم و سپس توسط متد ()setTo، به این ماتریس رنگ اختصاص دهیم.

رنگ RGB یا بهتر بگویم BGR توسط کلاس Scalar تعیین می شود. متد سازنده این کلاس سه عدد صحیح را دریافت می کند که اولی برابر با شدت رنگ آبی، دومی سبز و سومی قرمز است. پس اگر می خواهید شی (متغیری) تعریف کنید که بیانگر رنگ قرمز باشد، باید متد سازنده آن را به صورت زیر فراخوانی کنید.

فضای رنگ ها و تبدیل آنها در پایتون

در پیاده سازی کتابخانه OpenCV در پایتون، ساختار داده ها یا کلاس هایی مانند Mat و Scalar وجود ندارد، پس باید به گونه ای دیگر عملکرد آنها را پیاده سازی کنیم. همانطور که می دانید در پایتون مفهوم آرایه های زبان های سی و سی پلاس پلاس وجود ندارد، پس باید برای پیاده سازی آنها از کتابخانه ای به نام NumPy استفاده کنیم. در این کتابخانه متدی به نام ()array وجود دارد که از طریق آن می توانیم آرایه ها را پیاده سازی کنیم.

تعریف آرایه ها در NumPy

تفاوت دیگری که میان کتابخانه OpenCV در سی پلاس پلاس و پایتون وجود دارد، اینکه تنها ماژولی که باید در پایتون به فایل برنامه ضمیمه کنیم، ماژول cv2 است. به عبارت دیگر برای کار با کتابخانه OpenCV در پایتون، دو خط زیر کتابخانه هایی را ضمیمه می کنند، که لازم و ضروری هستند. import cv2 تمامی متدها و کلاس های OpenCV در پایتون را ضمیمه می کند و import numpy as np موارد لازم برای کار بر روی ماتریس های (آرایه های) تصویر را ضمیمه می کند.

ایجاد یک ماتریس (تصویر) سیاه در پایتون

پیاده سازی کتابخانه OpenCV در پایتون در کنار اینکه فاقد کلاس های Mat و Scala است، همچنین متدهایی مانند ()ones و ()zeros و ()eyes نیز در پیاده سازی پایتون وجود ندارند، در حالی که در پیاده سازی های سی پلاس پلاس و جاوا OpenCV وجود دارند. توجه کنید که بدون توجه به این چند نمونه از عدم وجود ساختارهایی مانند Mat و متدهای فوق، تفاوتی نمی کند که شما با کدام زبان از OpenCV استفاده کنید.

به طور مثال ما در این سایت هم سعی کرده ایم مفاهیم OpenCV را در پایتون و هم در زبان جاوا بیان کنیم ولی باید توجه کنید که وقتی می خواهیم کاربردی مانند تشخیص لبه (Edge Detection) را اعمال کنیم، در این حالت تمامی کلاس ها در تمامی پیاده سازی ها وجود دارند ولی چون آرایه ها در پایتون وجود ندارند، پس برای پوشش عدم وجود ساختار ماتریسی Mat، در پایتون از کتابخانه NumPy استفاده شده است و چون خود این کتابخانه متدهایی مانند ()zeros را پیاده سازی کرده است، پس این متدها دیگر در خود پیاده سازی پایتون OpenCV حذف شده اند و عملکرد آنها به کتابخانه NumPy سپرده شده است.

در کد زیر می خواهیم توسط متد ()zeros از کتابخانه NumPy یک ماتریسی سه بعدی از صفرها به ابعاد 200x200 را ایجاد کنیم که نوع هر یک از درایه های برابر با نوع uint8 از کتابخانه NumPy است. بنابراین سه بعدی بودن را می توانیم برابر با سه کانالی بودن در نظر بگریم. توجه کنید که در پایتون نوع CV_8UC3 وجود ندارد، پس ترکیب سه بعد و نوع uint8 همان مفهوم CV_8U3 را می دهد.

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

حال می خواهیم توسط متد ()namedWindow یک پنجره ایجاد و سپس از نام آن درون متد ()imshow استفاده کنیم تا ماتریس (در این مطلب متغیر image) را نشان دهیم. سپس متدهای (0)waitKey و ()destroyAllWindows نیز فراخوانی خواهند شد و تا زمانی که روی پنجره کلیک نشود، پنجره باز خواهد ماند.

خواندن و نمایش و ذخیره سازی تصویر در OpenCV

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

نمایش ماتریس تصویرها توسط کتابخانه matplotlib

ایجاد یک ماتریس (تصویر) رنگی در پایتون

در کد زیر می خواهیم یک تصویر رنگی را ایجاد کنیم، پس لازم است دامنه رنگ های RGB را توسط متغیرهای redColor و greenColor و blueColor ایجاد کنیم. توجه کنید که به هر کدام از این سه متغیر، یک تاپل به سه عنصر اختصاص داده شده است که هر کدام از عددهای آنها، شدت رنگ های BGR (معکوس RGB) را نگه می دارند. به یاد دارید که گفتیم در OpenCV، فضای رنگ RGB به صورت معکوس BGR در نظر گرفته می شود.

سپس و توسط مفهوم اسلایس بندی و دسترسی به سطرها و ستون های آرایه های NumPy به صورت سطری هر کدام از رنگ ها را به بازه ای از سطرهای تصویر سیاه اولیه انتساب داده ایم. بنابراین می بیند که زبان پایتون با در اختیار داشتن دیگر ماژول ها، برای انجام پروژه های پردازش تصویر مناسب است. به طور مثال در ادامه مطلب های همین دوره چگونگی استفاده از کتابخانه PyQt5 را برای ترکیب با کتابخانه OpenCV آموزش می دهیم.

مثال – اسلایس بندی آرایه های NumPy برای اعمال رنگ به ماریس تصویر