OpenCV در جاوا: راهنمای جامع + نمونه پروژههای عملی
جاوا یکی از محبوبترین زبانهای برنامهنویسی است که برای ایجاد انواع مختلفی از برنامهها از جمله برنامههای دسکتاپ، وب، و موبایل استفاده میشود. جاوا یک زبان شیگرا است که دادهها و رفتار را در واحدهای قابل استفاده مجدد به نام کلاسها و اشیاء سازماندهی میکند. قابل حمل بودن، عملکرد قوی، امنیت و استحکام ویژگیهای برجسته جاوا هستند. OpenCV یک کتابخانه منبع باز است که مجموعهای جامع از الگوریتمهای بینایی رایانهای و یادگیری ماشین را برای ما فراهم میکند. ازOpenCV برای انجام کارهایی مانند تشخیص چهره، شناسایی اشیاء، تقسیمبندی تصویر و موارد دیگر استفاده میشود. OpenCV از چندین زبان برنامهنویسی از جمله C++، Python و البته جاوا پشتیبانی میکند.
در این آموزش، ابتدا به آموزش دانلود و نصب و سپس به بررسی نحوه استفاده از کتابخانه OpenCV در جاوا پرداخته، در آخر نیز کدهای OpenCV ساده و مبتدی را بررسی میکنیم.
نصب و راهاندازی OpenCV در جاوا
برای شروع کار با OpenCV در جاوا، ابتدا باید دانلود و نصب کتابخانه اوپن س وی در جاوا را توضیح آموزش دهیم. طبق مراحل زیر عمل کنید:
- به وبسایت رسمی OpenCV مراجعه کنید و آخرین نسخه OpenCV را دانلود کنید.
- پس از دانلود، فایل فشرده را استخراج کنید و محیط توسعه خود را تنظیم کنید.
- فایلهای JAR موجود در پوشه opencv/build/java را به پروژه جاوای خود اضافه کنید.
- حالا آماده شروع به کار هستید.
شروع به کار با 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 این فیلترها به صورت چندین بار به تصویر اعمال میشوند، پیکسل به پیکسل، و نتیجه به عنوان یک مقدار واحد جمعآوری میشود. این مقدار تفاوت بین مجموع پیکسلهای زیر مربع سیاه و مجموع پیکسلهای زیر مربع سفید است.
۵. تشخیص چهره با اوپن سی وی جاوا
به طور کلی، طبقهبند آبشاری نیاز دارد که پیش از اینکه بتواند چیزی را تشخیص دهد، آموزش داده شود. از آنجا که فرآیند آموزش میتواند طولانی باشد و نیاز به یک مجموعه داده بزرگ دارد، ما از یکی از مدلهای پیشآموزش داده شده ارائه شده توسط OpenCV استفاده میکنیم. ما این فایل XML را در پوشه منابع خود قرار میدهیم تا دسترسی آسانی داشته باشیم.
بیایید فرآیند تشخیص یک چهره را مرور کنیم. چهرهای برای تشخیص ما سعی خواهیم کرد چهره را با یک مستطیل قرمز مشخص کنیم.
برای شروع، نیاز داریم تصویر را در قالب 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() {
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("تصویر با موفقیت به خاکستری تبدیل شد"); } }
خروجی:
توضیحات کد
- بارگذاری کتابخانه OpenCV: برای استفاده از OpenCV، ابتدا باید کتابخانه OpenCV را بارگذاری کنیم. این کار با استفاده از دستور System.loadLibrary(Core.NATIVE_LIBRARY_NAME) انجام میشود.
- خواندن تصویر: تصویر ورودی با استفاده از کلاس Imgcodecs و متد imread خوانده میشود. این متد یک شیء Mat را برمیگرداند که نمایانگر تصویر ورودی است.
- ایجاد ماتریس خالی: یک ماتریس خالی برای ذخیره تصویر خاکستری ایجاد میکنیم.
- تبدیل تصویر به خاکستری: برای تبدیل تصویر رنگی به خاکستری از متد cvtColor کلاس Imgproc استفاده میکنیم. این متد سه پارامتر میگیرد: ماتریس منبع، ماتریس مقصد و نوع تبدیل رنگ.
- نوشتن تصویر خاکستری: تصویر خاکستری را با استفاده از متد imwrite کلاس Imgcodecs ذخیره میکنیم.
افزودن متن به تصویر در OpenCV در جاوا
افزودن متن به تصویر میتواند در بسیاری از برنامهها مفید باشد. به عنوان مثال، میتوانید از این ویژگی برای اضافه کردن توضیحات، برچسبها یا تاریخ به تصاویر استفاده کنید. در این مثال، ما از تابع putText برای افزودن متن به تصویر استفاده میکنیم که تصویر اولیه به صورت زیر است:
پارامترهای متد 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(); } }
خروجی به صورت زیر است:
توضیحات کد
- بارگذاری کتابخانه OpenCV: برای استفاده از OpenCV، ابتدا باید کتابخانه OpenCV را بارگذاری کنیم. این کار با استفاده از دستور System.loadLibrary(Core.NATIVE_LIBRARY_NAME) انجام میشود.
- خواندن تصویر: تصویر ورودی را با استفاده از کلاس Imgcodecs و متد imread میخوانیم. این متد یک شیء Mat را برمیگرداند که نمایانگر تصویر ورودی است.
- ایجاد شیء Mat: یک شیء Mat برای نگهداری تصویر ایجاد میکنیم.
- تعریف متن و تنظیمات آن: متن، نقطه شروع متن، رنگ، نوع فونت، اندازه فونت و ضخامت خطوط متن را تعیین میکنیم
- افزودن متن به تصویر: با استفاده از متد putText، متن را به تصویر اضافه میکنیم.
- نمایش تصویر: تصویر نهایی پس از افزودن متن با استفاده از HighGui.imshow نمایش داده میشود.
- انتظار برای رویداد: برای جلوگیری از بسته شدن فوری پنجره تصویر، از 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 که میتوانند برای بلور کردن تصویر استفاده شوند عبارتند از:
- 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 شروع به کار کرده و از آن در پروژههای خود بهره ببرید.
برای یادگیری جاوا میتوانید از دورههای کامل مکتب خونه استفاده کنید. سایت مکتب خونه دورههای متعددی برای آموزش جاوا دارد که از کیفیت بالایی برخوردارند و توسط بهترین اساتید تدریس میشوند. میتوانید با دورههای رایگان یادگیری را شروع کنید و در صورت تمایل دوره پولی مناسب خود را خریداری کنید. مطمئن باشید با دورههای مکتب خونه باکیفیت ترین آموزشها را خواهید گذراند.