تحقق من وجود دائرة داخل مربع باستخدام Java وOpenCV
في مجال تطوير البرمجيات ومعالجة الصور باستخدام لغة البرمجة Java ومكتبة OpenCV، يمكنك تحقيق هدفك بفحص إذا كانت الدائرة الحمراء موجودة داخل المربع الأسود بعد تحويل الصورتين إلى صور ثنائية (binary images). سأوضح لك الخطوات التي يمكن أن تساعدك في تحقيق ذلك.
أولاً وقبل كل شيء، يجب عليك استيراد مكتبة OpenCV في مشروعك. يمكنك فعل ذلك عبر إضافة التبعيات التالية في ملف الـ POM لمشروع Maven الخاص بك:
-
تهيئة مصفوفات في Java باستخدام قيم null06/02/2024
-
استخدام شرط if في البرمجة14/03/2024
-
كيفية كتابة If-Statements بفعالية07/04/2024
xml<dependency>
<groupId>org.openpnpgroupId>
<artifactId>opencvartifactId>
<version>4.5.1-1version>
dependency>
ثم، يمكنك استخدام الكود التالي في Java لتحقيق الهدف الذي وضعته:
javaimport org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
public class ShapeDetection {
public static void main(String[] args) {
// Load binary images
Mat circleBinary = Imgcodecs.imread("path/to/circle_binary_image.png", Imgcodecs.IMREAD_GRAYSCALE);
Mat squareBinary = Imgcodecs.imread("path/to/square_binary_image.png", Imgcodecs.IMREAD_GRAYSCALE);
// Find contours in the binary images
List circleContours = new ArrayList<>();
List squareContours = new ArrayList<>();
Imgproc.findContours(circleBinary, circleContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.findContours(squareBinary, squareContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
// Iterate through circle contours
for (MatOfPoint circleContour : circleContours) {
// Convert the circle contour to a polygon
MatOfPoint2f circleContour2f = new MatOfPoint2f(circleContour.toArray());
MatOfPoint2f approxCurve = new MatOfPoint2f();
Imgproc.approxPolyDP(circleContour2f, approxCurve, Imgproc.arcLength(circleContour2f, true) * 0.02, true);
// Check if the circle is inside the square
if (Imgproc.pointPolygonTest(approxCurve, squareContours.get(0).toArray(), true) > 0) {
System.out.println("The red circle is inside the black square.");
} else {
System.out.println("The red circle is NOT inside the black square.");
}
}
}
}
يرجى استبدال “path/to/circle_binary_image.png” و “path/to/square_binary_image.png” بمسار حقيقي لصورتي الدائرة والمربع على التوالي. يستخدم الكود أسلوبًا بسيطًا للتحقق مما إذا كانت الدائرة داخل المربع أم لا باستخدام وظائف OpenCV. يمكنك تكييف الكود بناءً على احتياجات مشروعك الخاص.
المزيد من المعلومات
في هذا السياق، يعتبر OpenCV أحد أشهر المكتبات المفتوحة المصدر المخصصة لمعالجة الصور والرؤية الحاسوبية. يستخدم OpenCV بشكل واسع في مجالات مثل التعرف على الأشكال والتعرف على الصور ومتابعة الحركة والروبوتات والتطبيقات الطبية والكثير من التطبيقات الأخرى.
للبداية، يجب عليك تأكيد أنك قد قمت بتكوين مشروعك بشكل صحيح لاستخدام OpenCV. قم بتحميل مكتبة OpenCV وضمن مشروعك، وتأكد من إضافة التبعيات اللازمة في ملف POM إذا كنت تستخدم Maven.
ثم، يمكنك استخدام الكود السابق كنقطة انطلاق. في هذا الكود، يتم تحميل الصور الثنائية (binary images) للدائرة والمربع باستخدام Imgcodecs.imread
. ثم يتم استخدام Imgproc.findContours
للعثور على حدود الكائنات في الصورة الثنائية.
تُستخدم Imgproc.approxPolyDP
لتقريب الحدود إلى مضلع. وأخيرًا، يتم استخدام Imgproc.pointPolygonTest
لفحص ما إذا كانت الدائرة داخل المربع أو لا.
هذا الكود يعتبر بسيطًا ويمكن تعديله وتخصيصه وفقًا لاحتياجات مشروعك الخاص. يمكنك تطويره ليشمل التعامل مع متعدد الكائنات، وتحسين عملية التعرف على الأشكال، وتحسين الأداء بشكل عام.