در این قسمت تیم کدگیت را با آموزش نوشتن تصاویر در جاوا با OpenCV همراهی کنید. در این جلسه مروری بر کتابخانه OpenCV و کلاس Mat خواهیم داشت. در ادامه یک تصویر را با کمک کلاس Mat ایجاد کرده و آن را ذخیره میکنیم. پیشنهاد میکنیم پیشنیازهای این جلسه را مطالعه نمایید:
کتابخانه OpenCV
OpenCV یا همان Open Computer Vision مجموعه ای از کتابخانههای برنامهنویسی پردازش تصویر و یادگیری ماشین است. این کتابخانه با داشتن توابع مختلف در زمینه پردازش تصویر، فرآیندهای کار بر روی تصاویر را بسیار آسان نموده است.برای پیاده سازی کد نوشتن تصاویر در جاوا از کتابخانه opencv استفاده خواهیم کرد. برای استفاده از این کتابخانه ابتدا باید آن را فراخوانی کرد. کد زیر بارگذاری کتابخانه opencv در جاوا میباشد:
System.loadLibrary
(Core.NATIVE_LIBRARY_NAME);
کلاس Mat
کلاس Mat برای ذخیره سازی و نگهداری مقادیر یک تصویر تک و یا چند کاناله (تصاویر grayscale تک کاناله و تصاویر رنگی چند کاناله هستند) استفاده میشود. این کلاس نمایشی از آرایه n بعدی است که میتوان برای ذخیره تصاویر، ماتریس و … نیز از آن استفاده کرد. در کد زیر با استفاده از کلاس Mat یک ماتریس با ابعاد 3*3 ایجاد کردیم(cv_type برای depth و کانال تصویر استفاده می شود و در مثال زیر تک کانال استفاده شده است):
Mat mat = Mat.zeros(3, 3, CvType.CV_8UC1);
برای چاپ ماتریس بالا میتوان از متد dump استفاده کرد:
System.out.println("mat = " + mat.dump());
خروجی کد به صورت زیر است:
mat = [ 0, 0, 0;
0, 0, 0;
0, 0, 0]
نوشتن تصویر در جاوا با OpenCV
برای نوشتن تصاویر در جاوا با کمک کتابخانه OpenCV ما از کلاس Mat کمک گرفته و یک تصویر کاملا سیاه رنگ(مقدار پیکسل سیاه رنگ، صفر است) ایجاد میکنیم. سپس آن را ذخیره سازی میکنیم. ابتدا کلاس Mat را به کمک کد زیر ایجاد میکنیم:
Mat mat = Mat.zeros(512, 512, CvType.CV_8UC1);
سایز تصویر 512*512 میباشد. برای ذخیرهسازی آن از کلاس Imgcodecs متد imwrite استفاده میکنیم:
Imgcodecs.imwrite("black.jpg",mat);
تصویر زیر در فولدر پروژه شما با نام black.jpg ایجاد میشود.
برای اینکه رنگ پیکسل را تغییر دهیم از متد put استفاده میکنیم. در کد زیر مقدار پیکسلهای 50 الی 200 را سفید رنگ (مقدار 255) میکنیم:
public static void main(String[] args) {
System.loadLibrary
(Core.NATIVE_LIBRARY_NAME);
Mat mat =
Mat.zeros(512, 512, CvType.CV_8UC1);
for (int i = 50; i < 200; i++) {
for (int j = 50; j < 200; j++) {
mat.put(i, j, 255);
}
}
Imgcodecs.imwrite("black.jpg", mat);
}
خروجی کد بالا به صورت زیر است: