برنامه نویسی و ITجاوا

OpenCV در جاوا: راهنمای جامع + نمونه پروژه‌های عملی

جاوا یکی از محبوب‌ترین زبان‌های برنامه‌نویسی است که برای ایجاد انواع مختلفی از برنامه‌ها از جمله برنامه‌های دسکتاپ، وب، و موبایل استفاده می‌شود. جاوا یک زبان شی‌گرا است که داده‌ها و رفتار را در واحدهای قابل استفاده مجدد به نام کلاس‌ها و اشیاء سازماندهی می‌کند. قابل حمل بودن، عملکرد قوی، امنیت و استحکام ویژگی‌های برجسته جاوا هستند. OpenCV یک کتابخانه منبع باز است که مجموعه‌ای جامع از الگوریتم‌های بینایی رایانه‌ای و یادگیری ماشین را برای ما فراهم می‌کند. ازOpenCV برای انجام کارهایی مانند تشخیص چهره، شناسایی اشیاء، تقسیم‌بندی تصویر و موارد دیگر استفاده می‌شود. OpenCV از چندین زبان برنامه‌نویسی از جمله C++، Python و البته جاوا پشتیبانی می‌کند.

در این آموزش، ابتدا به آموزش دانلود و نصب و سپس به بررسی نحوه استفاده از کتابخانه OpenCV در جاوا پرداخته، در آخر نیز کدهای OpenCV ساده و مبتدی را بررسی می‌کنیم.

نصب و راه‌اندازی OpenCV در جاوا

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

کاملترین مرجع آموزش برنامه نویسی ایران + اعطای گواهینامه بازار کار

 

  1. به وب‌سایت رسمی OpenCV مراجعه کنید و آخرین نسخه OpenCV را دانلود کنید.
  2. پس از دانلود، فایل فشرده را استخراج کنید و محیط توسعه خود را تنظیم کنید.
  3. فایل‌های JAR موجود در پوشه opencv/build/java  را به پروژه جاوای خود اضافه کنید.
  4. حالا آماده شروع به کار هستید.

شروع به کار با OpenCV و جاوا

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

١. نصب OpenCV جاوا

برای استفاده از کتابخانه OpenCV در پروژه خود، نیاز داریم که وابستگی Maven مربوط به OpenCV را به فایل pom.xml اضافه کنیم:

<dependency>
<groupId>org.openpnp</groupId>
<artifactId>opencv</artifactId>
<version>3.4.2-0</version>
</dependency>

برای کاربران Gradle، باید وابستگی را به فایل build.gradle اضافه کنیم:

compile group: 'org.openpnp', name: 'opencv', version: '3.4.2-0'

پس از اضافه کردن کتابخانه به وابستگی‌هایمان، می‌توانیم از ویژگی‌های ارائه شده توسط OpenCV استفاده کنیم.

پیشنهاد مطالعه: آموزش مرتب سازی ادغامی در جاوا + کدهای الگوریتم

٢. استفاده از کتابخانه

برای شروع استفاده از OpenCV، نیاز داریم که کتابخانه را مقداردهی اولیه کنیم که می‌توانیم این کار را در متد اصلی انجام دهیم:

OpenCV.loadShared();

کلاس OpenCV شامل متدهای مربوط به بارگذاری بسته‌های بومی مورد نیاز برای پلتفرم‌ها و معماری‌های مختلف است.

قابل ذکر است که مستندات کارها را به صورت کمی متفاوت انجام می‌دهند:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

هر دو متد در واقع کتابخانه‌های بومی مورد نیاز را بارگذاری می‌کنند. تفاوت اینجاست که دومی نیاز به نصب کتابخانه‌های بومی دارد. اما اولی می‌تواند کتابخانه‌ها را به یک پوشه موقت نصب کند اگر در ماشین مورد نظر موجود نباشند. به همین دلیل، متد loadShared معمولاً بهترین گزینه است. حالا که کتابخانه را مقداردهی اولیه کردیم، بیایید ببینیم چه کارهایی می‌توانیم با آن انجام دهیم.

٣. بارگذاری تصاویر

برای شروع، تصویر نمونه را از دیسک با استفاده از OpenCV بارگذاری کنیم:

public static Mat loadImage(String imagePath) {
Imgcodecs imageCodecs = new Imgcodecs();
return imageCodecs.imread(imagePath);
}

این متد تصویر داده شده را به عنوان یک شی Mat بارگذاری می‌کند که یک نمایش ماتریسی است. برای ذخیره تصویر بارگذاری شده قبلی، می‌توانیم از متد imwrite()‎ کلاس Imgcodecs استفاده کنیم:

public static void saveImage(Mat imageMatrix, String targetPath) {
Imgcodecs imgcodecs = new Imgcodecs();
imgcodecs.imwrite(targetPath, imageMatrix);
}

۴. طبقه‌بند Haar Cascade

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

 ویژگی‌های Haar

تشخیص چهره در OpenCV توسط طبقه‌بندهای آبشاری مبتنی بر ویژگی‌های Haar انجام می‌شود. ویژگی‌های Haar فیلترهایی هستند که برای تشخیص لبه‌ها و خطوط روی تصویر استفاده می‌شوند. این فیلترها به صورت مربع‌هایی با رنگ‌های سیاه و سفید دیده می‌شوند:

 ویژگی‌های Haar

ویژگی‌های Haar این فیلترها به صورت چندین بار به تصویر اعمال می‌شوند، پیکسل به پیکسل، و نتیجه به عنوان یک مقدار واحد جمع‌آوری می‌شود. این مقدار تفاوت بین مجموع پیکسل‌های زیر مربع سیاه و مجموع پیکسل‌های زیر مربع سفید است.

۵. تشخیص چهره با اوپن سی وی جاوا

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

آموزش اسپرینگ بوت در عمل (با رویکرد blocking)

 

بیایید فرآیند تشخیص یک چهره را مرور کنیم. چهره‌ای برای تشخیص ما سعی خواهیم کرد چهره را با یک مستطیل قرمز مشخص کنیم.

تشخیص چهره با اوپن سی وی جاوا

برای شروع، نیاز داریم تصویر را در قالب Mat از مسیر منبع بارگذاری کنیم:

Mat loadedImage = loadImage(sourceImagePath);

سپس، یک شی MatOfRect برای ذخیره چهره‌هایی که پیدا می‌کنیم، اعلام می‌کنیم:

MatOfRect facesDetected = new MatOfRect();

سپس، نیاز داریم که CascadeClassifier را برای انجام تشخیص مقداردهی کنیم:

CascadeClassifier cascadeClassifier = new CascadeClassifier();
int minFaceSize = Math.round(loadedImage.rows() * 0.1f);
cascadeClassifier.load("./src/main/resources/haarcascades/haarcascade_frontalface_alt.xml");
cascadeClassifier.detectMultiScale(loadedImage,
facesDetected,
1.1,
3,
Objdetect.CASCADE_SCALE_IMAGE,
new Size(minFaceSize, minFaceSize),
new Size()
);

در بالا، پارامتر 1.1 نشان‌دهنده ضریب مقیاسی است که می‌خواهیم استفاده کنیم، مشخص می‌کند که اندازه تصویر چقدر در هر مقیاس تصویر کاهش می‌یابد. پارامتر بعدی، 3، minNeighbors است. این تعداد همسایگانی است که یک مستطیل کاندید باید داشته باشد تا حفظ شود.

در نهایت، چهره‌ها را مرور کرده و نتیجه را ذخیره می‌کنیم:

Rect[] facesArray = facesDetected.toArray();
for(Rect face : facesArray) {
Imgproc.rectangle(loadedImage, face.tl(), face.br(), new Scalar(0, 0, 255), 3);
}
saveImage(loadedImage, targetImagePath);

هنگامی که تصویر منبع خود را ورودی می‌دهیم، باید اکنون تصویر خروجی را با تمام چهره‌ها که با یک مستطیل قرمز علامت‌گذاری شده‌اند دریافت کنیم:

۶. دسترسی به دوربین با استفاده از OpenCV

تا کنون، دیدیم که چگونه می‌توانیم تشخیص چهره را بر روی تصاویر بارگذاری شده انجام دهیم. اما اکثر اوقات، ما می‌خواهیم این کار را به صورت لحظه‌ای انجام دهیم. برای اینکه بتوانیم این کار را انجام دهیم، نیاز داریم که به دوربین دسترسی پیدا کنیم.

اما برای اینکه بتوانیم تصویر را از یک دوربین نشان دهیم، به چند چیز اضافی نیاز داریم، به غیر از چیز آشکار – دوربین. برای نمایش تصاویر، از JavaFX استفاده خواهیم کرد.

از آنجا که از یک ImageView برای نمایش تصاویری که دوربین ما گرفته استفاده خواهیم کرد، نیاز به روشی برای ترجمه یک Mat OpenCV به یک تصویر JavaFX داریم:

public Image mat2Img(Mat mat) {
MatOfByte bytes = new MatOfByte();
Imgcodecs.imencode("img", mat, bytes);
InputStream inputStream = new ByteArrayInputStream(bytes.toArray());
return new Image(inputStream);
}

در اینجا، ما ماتریس خود را به بایت تبدیل می‌کنیم و سپس بایت‌ها را به یک شیء تصویر تبدیل می‌کنیم.

با پخش دید دوربین به یک Stage JavaFX شروع خواهیم کرد. حالا، بیایید کتابخانه را با استفاده از متد loadShared مقداردهی کنیم:

OpenCV.loadShared();

سپس، Stage را با یک VideoCapture و یک ImageView برای نمایش تصویر ایجاد می‌کنیم:

VideoCapture capture = new VideoCapture(0);
ImageView imageView = new ImageView();
HBox hbox = new HBox(imageView);
Scene scene = new Scene(hbox);
stage.setScene(scene);
stage.show();

در اینجا، 0 شناسه دوربینی است که می‌خواهیم استفاده کنیم. همچنین نیاز داریم که یک AnimationTimer ایجاد کنیم تا تنظیم تصویر را مدیریت کند:

new AnimationTimer() {
@Override
public void handle(long l) {
imageView.setImage(getCapture());
}
}.start();

در نهایت، متد getCapture ما تبدیل Mat به یک تصویر را مدیریت می‌کند:

public Image getCapture() {
Mat mat = new Mat();
capture.read(mat);
return mat2Img(mat);
}

برنامه باید اکنون یک پنجره ایجاد کند و سپس دید دوربین را به صورت زنده به پنجره imageView پخش کند.

پیشنهاد مطالعه: مدت زمان یادگیری جاوا برای حرفه‌ای شدن در آن

۷. تشخیص چهره به صورت لحظه‌ای

در نهایت، می‌توانیم تمام نقاط را به هم متصل کنیم تا برنامه‌ای ایجاد کنیم که چهره را به صورت لحظه‌ای تشخیص دهد.

کد از بخش قبلی مسئول گرفتن تصویر از دوربین و نمایش آن به کاربر است. اکنون، تنها کاری که باید انجام دهیم این است که تصاویر گرفته شده را قبل از نمایش آنها روی صفحه پردازش کنیم با استفاده از کلاس CascadeClassifier.

بیایید به سادگی متد getCapture خود را اصلاح کنیم تا همچنین تشخیص چهره را انجام دهد:

public Image getCaptureWithFaceDetection() {
Mat mat = new Mat();
capture.read(mat);
Mat haarClassifiedImg = detectFace(mat);
return mat2Img(haarClassifiedImg);
}

 

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

تبدیل تصویر رنگی به سیاه – سفید

تبدیل تصویر رنگی به سیاه – سفید یکی از عملیات‌های پایه‌ای در پردازش تصویر است. از این عملیات برای کاهش پیچیدگی تصویر و تسریع فرآیندهای بعدی استفاده می‌کنیم.

برنامه‌نویسی جاوا: ساخت یک سیستم توصیه‌گر

 

در این بخش، با استفاده از OpenCV و جاوا، تصویری رنگی را به تصویر خاکستری تبدیل می‌کنیم. برای این کار، ابتدا تصویر رنگی را به صورت یک شیء BufferedImage  خوانده و سپس آن را به شیء Mat  تبدیل می‌کنیم. تصویر اولیه به صورت زیر است:

تبدیل تصویر رنگی به سیاه - سفید

حال کدنویسی انجام این کار به صورت زیر است:

// برنامه جاوا برای تبدیل تصویر رنگی به تصویر خاکستری

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

public class ConvertToGrayscale {

public static void main(String args[]) throws Exception {

// بازکردن کتابخانه OpenCV

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

String input = "C:/opencv/GeeksforGeeks.jpg";

// خواندن تصویر

Mat source = Imgcodecs.imread(input);

// ایجاد ماتریس خالی برای ذخیره تصویر خاکستری

Mat destination = new Mat();

// تبدیل تصویر به خاکستری و ذخیره آن در ماتریس مقصد

Imgproc.cvtColor(source, destination, Imgproc.COLOR_RGB2GRAY);

// نوشتن تصویر خاکستری

Imgcodecs.imwrite("C:/opencv/GeeksforGeeks_gray.jpg", destination);

System.out.println("تصویر با موفقیت به خاکستری تبدیل شد");

}

}

خروجی:

 

توضیحات کد

  1. بارگذاری کتابخانه OpenCV: برای استفاده از OpenCV، ابتدا باید کتابخانه OpenCV را بارگذاری کنیم. این کار با استفاده از دستور System.loadLibrary(Core.NATIVE_LIBRARY_NAME)  انجام می‌شود.
  2. خواندن تصویر: تصویر ورودی با استفاده از کلاس Imgcodecs  و متد imread  خوانده می‌شود. این متد یک شیء Mat  را برمی‌گرداند که نمایانگر تصویر ورودی است.
  3. ایجاد ماتریس خالی: یک ماتریس خالی برای ذخیره تصویر خاکستری ایجاد می‌کنیم.
  4. تبدیل تصویر به خاکستری: برای تبدیل تصویر رنگی به خاکستری از متد cvtColor  کلاس Imgproc  استفاده می‌کنیم. این متد سه پارامتر می‌گیرد: ماتریس منبع، ماتریس مقصد و نوع تبدیل رنگ.
  5. نوشتن تصویر خاکستری: تصویر خاکستری را با استفاده از متد imwrite  کلاس Imgcodecs  ذخیره می‌کنیم.

افزودن متن به تصویر در OpenCV در جاوا

افزودن متن به تصویر می‌تواند در بسیاری از برنامه‌ها مفید باشد. به عنوان مثال، می‌توانید از این ویژگی برای اضافه کردن توضیحات، برچسب‌ها یا تاریخ‌ به تصاویر استفاده کنید. در این مثال، ما از تابع putText  برای افزودن متن به تصویر استفاده می‌کنیم که تصویر اولیه به صورت زیر است:

افزودن متن به تصویر در OpenCV در جاوا

پارامترهای متد putText

  • Image: شیء Mat  که نمایانگر تصویر ورودی است.
  • Text: متنی که باید به تصویر اضافه شود.
  • Org: نقطه‌ای که متن از آنجا شروع می‌شود (مختصات گوشه پایین چپ متن).
  • fontType: نوع فونت متن.
  • fontSize: اندازه فونت متن.
  • Color: رنگ متن به صورتScalar  (در فضای رنگی BGR)
  • Thickness: ضخامت خطوط متن.

کد نمونه:

// Importing all OpenCV files

import org.opencv.core.*;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

import org.opencv.highgui.HighGui;

public class GFG {

// Main driver code

public static void main(String args[]) throws Exception {

// Loading the OpenCV core library

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

// Reading the contents of the image

// from local computer directory

String src = "D:\\InputImage.jpg";

// Creating a Mat object

Mat image = Imgcodecs.imread(src);

// Text to be added

String text = "GFG IS COOL";

// Points from where text should be added

Point org = new Point(170, 280);

// Color of the text (Red)

Scalar color = new Scalar(0, 0, 255);

// Font type of the text to be added

int fontType = Imgproc.FONT_HERSHEY_PLAIN;

// Font size of the text to be added

int fontSize = 1;

// Thickness of the lines of the text

int thickness = 3;

// Adding text to the image using putText method

Imgproc.putText(image, text, org, fontType, fontSize, color, thickness);

// Displaying the Image after adding the Text

HighGui.imshow("", image);

// Waiting for a key event to delay

HighGui.waitKey();

}

}

خروجی به صورت زیر است:

توضیحات کد

  1. بارگذاری کتابخانه OpenCV: برای استفاده از OpenCV، ابتدا باید کتابخانه OpenCV را بارگذاری کنیم. این کار با استفاده از دستور System.loadLibrary(Core.NATIVE_LIBRARY_NAME)  انجام می‌شود.
  2. خواندن تصویر: تصویر ورودی را با استفاده از کلاس Imgcodecs  و متد imread  می‌خوانیم. این متد یک شیء Mat  را برمی‌گرداند که نمایانگر تصویر ورودی است.
  3. ایجاد شیء Mat: یک شیء Mat  برای نگهداری تصویر ایجاد می‌کنیم.
  4. تعریف متن و تنظیمات آن: متن، نقطه شروع متن، رنگ، نوع فونت، اندازه فونت و ضخامت خطوط متن را تعیین می‌کنیم
  5. افزودن متن به تصویر: با استفاده از متد putText، متن را به تصویر اضافه می‌کنیم.
  6. نمایش تصویر: تصویر نهایی پس از افزودن متن با استفاده از HighGui.imshow  نمایش داده می‌شود.
  7. انتظار برای رویداد: برای جلوگیری از بسته شدن فوری پنجره تصویر، از HighGui.waitKey  استفاده می‌کنیم.

پیشنهاد مطالعه: آموزش برنامه نویسی جاوا با intellij idea به صورت گام به گام

تشخیص تصویر با OpenCV

تشخیص تصویر مخصوصا تشخیص چهره یکی از کاربردهای مهم OpenCV است که در بسیاری از برنامه‌ها از جمله سیستم‌های امنیتی، شبکه‌های اجتماعی و دستیارهای هوشمند استفاده می‌شود.

تشخیص چهره با اوپن سی وی جاوا

در این مثال، ما از یک فایل XML که شامل مدل Haar Cascade برای تشخیص چهره است، استفاده می‌کنیم.

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.core.MatOfRect;

import org.opencv.core.Rect;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

import org.opencv.objdetect.CascadeClassifier;

public class FaceDetection {

static {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

}

public static void main(String[] args) {

String filePath = "path/to/your/image.jpg";

Mat src = Imgcodecs.imread(filePath);

if (src.empty()) {

System.out.println("Could not open or find the image!");

return;

}

String xmlFile = "path/to/your/haarcascade_frontalface_alt.xml";

CascadeClassifier classifier = new CascadeClassifier(xmlFile);

MatOfRect faceDetections = new MatOfRect();

classifier.detectMultiScale(src, faceDetections);

for (Rect rect : faceDetections.toArray()) {

Imgproc.rectangle(src, rect.tl(), rect.br(), new Scalar(0, 255, 0), 3);

}

Imgcodecs.imwrite("path/to/your/output_image.jpg", src);

System.out.println("Face detection completed successfully.");

}

}

محو کردن تصاویر در آموزش OpenCV در جاوا

محو کردن (Blurring) عملیاتی ساده و پرکاربرد در پردازش تصویر است که به آن صاف کردن (Smoothing) نیز گفته می‌شود. کتابخانه OpenCV توابع متعددی برای اعمال فیلترهای خطی مختلف جهت صاف کردن یا بلور کردن تصاویر ارائه می‌دهد. صاف کردن تصویر باعث حذف پیکسل‌های نویزی از تصویر و اعمال فیلتر پایین‌گذر (Low-Pass Filter) بر روی تصویر می‌شود. یک فیلتر پایین‌گذر نویز را از تصویر حذف می‌کند، در حالی که بخش عمده‌ای از تصویر دست‌نخورده باقی می‌ماند.

آموزش برنامه‌نویسی جاوا: آرایه‌ها، لیست‌ها و داده‌های ساختاریافته

 

رایج‌ترین نوع فیلتر، فیلتر خطی است. در یک فیلتر خطی، مجموع وزن‌دار مقادیر پیکسل‌های ورودی، مقدار پیکسل‌های خروجی را تعیین می‌کند.

افزودن متن به تصویر در OpenCV در جاوا

 

توابع OpenCV برای بلور کردن تصاویر:

توابع OpenCV که می‌توانند برای بلور کردن تصویر استفاده شوند عبارتند از:

  • blur()‎
  • GaussianBlur()‎
  • medianBlur()‎
  • bilateralFilter()‎

نوع بازگشتی این توابع، تصویر تغییر یافته‌ای است که در همان دایرکتوری ذخیره می‌شود که تصویر ورودی نمونه قرار دارد. هر یک از این توابع به شرح زیر است:

روش ۱ :blur()‎

این تابع صاف کردن را با استفاده از فیلتر بلور نرمال شده انجام می‌دهد.

سینتکس:

Imgproc.blur(src, dst, new Size(i, i), new Point(-1, -1));

پارامترها:

  • src: تصویر منبع
  • Dst: تصویر مقصد
  • Size(w, h): اندازه کرنل با عرض w پیکسل و ارتفاع h پیکسل
  • Point(-1, -1): موقعیت نقطه لنگر نسبت به همسایگی. اگر مقدار منفی باشد، مرکز کرنل به عنوان نقطه لنگر در نظر گرفته می‌شود.

روش ۲: GaussianBlur()‎

این تابع صاف کردن را با استفاده از فیلتر Gaussian انجام می‌دهد.

سینتکس:

Imgproc.GaussianBlur(src, dst, new Size(i, i), 0, 0);

پارامترها:

  • Src: تصویر منبع
  • Dst: تصویر مقصد
  • Size(w, h): اندازه کرنل مورد استفاده. اگر w و h اعداد فرد و مثبت نباشند، اندازه با استفاده از آرگومان‌های σx و σy محاسبه می‌شود.
  • σx, σy: انحراف استاندارد در محور x و y. نوشتن 0 به معنی این است که σx و σy با استفاده از اندازه کرنل محاسبه می‌شوند.

روش ۳: medianBlur()‎

این تابع صاف کردن را با استفاده از فیلتر Median Blur انجام می‌دهد.

سینتکس:

Imgproc.medianBlur(src, dst, i);

پارامترها:

  • Src: تصویر منبع
  • Dst: تصویر مقصد
  • i: اندازه کرنل باید فرد باشد.

روش 4: bilateralFilter()‎

این تابع صاف کردن را با استفاده از فیلتر دوطرفه انجام می‌دهد.

سینتکس:

Imgproc.bilateralFilter(src, dst, i, i * 2, i / 2);

پارامترها:

  • Src:تصویر منبع
  • Dst: تصویر مقصد
  • D: قطر هر محله پیکسلی.
  • σColor: انحراف استاندارد در فضای رنگ.
  • σSpace: انحراف استاندارد در فضای مختصات (به پیکسل).

پیاده‌سازی

تصویر ورودی به صورت زیر است که قرار است بلور شود.

// Importing OpenCV libraries

// to use inbuilt methods

import org.opencv.core.*;

import org.opencv.highgui.HighGui;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;




class GFG {




int DELAY_BLUR = 100;

int MAX_KERNEL_LENGTH = 31;




// Source Image by creating Matlab object

Mat src = new Mat();




// Destination Image by creating Matlab object

Mat dst = new Mat();




// Main driver code

public static void main(String[] args) {

// Load the native library

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);




// Taking input image from directory

String filename = "D:\\InputImage.jpg";

src = Imgcodecs.imread(filename, Imgcodecs.IMREAD_COLOR);




// 4 different methods of Imgproc class

// to blur out input image




// Method 1. Standard blur method

// using blur()

for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {

Imgproc.blur(src, dst, new Size(i, i), new Point(-1, -1));




// Display blurred input image

displayDst(DELAY_BLUR);

}




// Method 2. Gaussian blur method

// using GaussianBlur()

for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {

Imgproc.GaussianBlur(src, dst, new Size(i, i), 0, 0);

// Display blurred input image

displayDst(DELAY_BLUR);

}




// Method 3. Median blur method

// using medianBlur()

for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {

Imgproc.medianBlur(src, dst, i);




// Display blurred input image

displayDst(DELAY_BLUR);

}




// Method 4. Bilateral filter Method

// using bilateralFilter()

for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2) {

Imgproc.bilateralFilter(src, dst, i, i * 2, i / 2);




// Display blurred input image

displayDst(DELAY_BLUR);

}

}

}

خروجی:

به این ترتیب تصویری بلور شده از تصویر ورودی خواهیم داشت.

محو کردن تصویر

چرخش تصویر با اوپن سی وی جاوا

در مواردی که نیاز به تغییر جهت تصویر دارید باید دستور چرخش تصویر را اعمال کنید. از تابع rotate برای چرخش تصویر استفاده می‌کنیم.

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.core.CvType;

import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

public class RotateImage {

static {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

}

public static void main(String[] args) {

String filePath = "path/to/your/image.jpg";

Mat src = Imgcodecs.imread(filePath);

if (src.empty()) {

System.out.println("Could not open or find the image!");

return;

}

Mat dst = new Mat();

Core.transpose(src, dst);

Core.flip(dst, dst, 1);

Imgcodecs.imwrite("path/to/your/output_image.jpg", dst);

System.out.println("Image rotated successfully.");

}

}

خروجی مثال فوق به صورت زیر است:

چرخش تصویر با اوپن سی وی جاوا

مقیاس‌گذاری تصویر

می‌خواهیم مقیاس تصویر را تغییر بدهیم. در این مثال، از تابع resize برای تغییر اندازه تصاویر استفاده می‌کنیم. تصویر اولیه به صورت زیر است:

مقیاس‌گذاری تصویر

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

public class ResizeImage {

static {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

}

public static void main(String[] args) {

String filePath = "path/to/your/image.jpg";

Mat src = Imgcodecs.imread(filePath);

if (src.empty()) {

System.out.println("Could not open or find the image!");

return;

}

Mat dst = new Mat();

Size size = new Size(src.width() / 2, src.height() / 2);

Imgproc.resize(src, dst, size);

Imgcodecs.imwrite("path/to/your/output_image.jpg", dst);

System.out.println("Image resized successfully.");

}

}

این بار خروجی نهایی به صورت زیر است:

کلام پایانی

در این نوشته، به بررسی OpenCV در جاوا پرداختیم و نمونه‌هایی از برنامه‌های مختلف قابل اجرا با آن را کدنویسی کردیم. OpenCV یک ابزار قدرتمند برای پردازش تصویر و انجام وظایف بینایی (visual) کامپیوتری است و با استفاده از جاوا می‌توانید به راحتی از این کتابخانه قدرتمند در برنامه‌های خود استفاده کنید. OpenCV به شما این امکان را می‌دهد تا با استفاده از جاوا، پروژه‌های پیچیده و متنوعی را در زمینه بینایی رایانه‌ای پیاده‌سازی کنید. با استفاده از مثال‌های ارائه شده در این راهنما، شما می‌توانید به راحتی باOpenCV شروع به کار کرده و از آن در پروژه‌های خود بهره ببرید.

کاملترین مرجع آموزش جاوا در ایران + اعطای گواهینامه تخصصی

 

برای یادگیری جاوا می‌توانید از دوره‌های کامل مکتب خونه استفاده کنید. سایت مکتب خونه دوره‌های متعددی برای آموزش جاوا دارد که از کیفیت بالایی برخوردارند و توسط بهترین اساتید تدریس می‌شوند. می‌توانید با دوره‌های رایگان یادگیری را شروع کنید و در صورت تمایل دوره پولی مناسب خود را خریداری کنید. مطمئن باشید با دوره‌های مکتب خونه باکیفیت ترین آموزش‌ها را خواهید گذراند.

کامل بهرامی

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا