ما يجب القيام به لمعالجة الصور أو التعلم الآلي لدائرة المهام للكشف والمقارنة


أنا أعمل على برنامج حيث أريد إجراء بعض معالجة الصور واكتشاف الدائرة من الصورة وهناك دائرتان أريد اكتشافهما، الأولى موجودة في الكائن (الماسة الخام) والثانية هي التي أرسم عليها الصورة أو مربع الفيديو.
وهنا بعض الصور من أي نوع من الصورة سيكون الصورة1
الصورة2
Image3
الصورة4

هنا في الصور أعلاه دائرة حمراء واحدة أقوم بالرسم باستخدام بعض المعلمات والدائرة السوداء الموجودة على الكائن هي الدائرة التي أريد اكتشافها للمقارنة أو المطابقة مع الدائرة التي رسمتها على مربع الفيديو.

الآن بعد اكتمال الكشف، أريد مقارنة أو مطابقة الدوائر التي أرسمها والدائرة التي أحصل عليها من معالجة الصورة من الصورة.

لذلك أحاول معالجة الصور منذ يومين ولم أحصل على النتيجة التي أريدها.
لذلك لا بد لي من التفكير في التعلم الآلي أو الذكاء الاصطناعي
إذا كان بإمكاني تقديم مجموعة بيانات من الدوائر المتطابقة أو غير المتطابقة، فهل يمكنني استخدام الذكاء الاصطناعي أو التعلم الآلي لمشروعي؟
إذا كانت الإجابة بنعم فكيف يمكنني استخدام وكم من الوقت اللازم لذلك؟

ما حاولت:

لقد جربت مكتبة EmguCV وقمت ببعض معالجة الصور ولكن هذا ليس دقيقًا وما زلت عالقًا عند اكتشاف الدائرة السوداء على الكائن (الماس الخام)

لقد قمت هنا ببعض معالجة الصور باستخدام emgucv لكنني لم أحصل على النتيجة التي أريدها
النتائج التي حصلت عليها باستخدام هذا الكود هي:
image1
image2

ملحوظة: يعمل أيضًا على بعض الصور وليس على الكل.

ج #
// Convert the image to grayscale
            Image<Gray, byte> grayImage = originalImage.Convert<Gray, byte>();
            pictureBox1.Image = grayImage.ToBitmap();


            // Apply Gaussian blur
            CvInvoke.GaussianBlur(grayImage, grayImage, new Size(5, 5), 0);
            pictureBox2.Image = grayImage.ToBitmap();

            // Threshold the grayscale image to isolate black circles
            double thresholdValue = 70; // Adjust this value based on the intensity of your black circles
            Image<Gray, byte> binaryImage = grayImage.ThresholdBinary(new Gray(thresholdValue), new Gray(255));
            pictureBox3.Image = binaryImage.ToBitmap();

            VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
            Mat hierarchy = new Mat();

            CvInvoke.FindContours(binaryImage, contours, hierarchy, RetrType.List, ChainApproxMethod.ChainApproxSimple);

            // Loop through all detected contours
            for (int i = 0; i < contours.Size; i++)
            {
                using (VectorOfPoint contour = contours[i])
                {
                    double area = CvInvoke.ContourArea(contour);
                    double perimeter = CvInvoke.ArcLength(contour, true);

                    // Calculate circularity (4 * π * area / perimeter^2)
                    double circularity = (4 * Math.PI * area) / (perimeter * perimeter);

                    // Check if the contour is a perfect circle based on circularity
                    if (circularity > 0.8 && contour.Size > 150) // Adjust the circularity threshold and minimum number of vertices as needed
                    {
                        CircleF circle = CvInvoke.MinEnclosingCircle(contour);
                        originalImage.Draw(circle, new Bgr(Color.Red), 2); // You can change the color and thickness of the circle here
                    }
                }
            }

            pictureBox.Image = originalImage.ToBitmap();

الحل 1

أهلاً،
قم بإلقاء نظرة على Hough Circle Transform للكشف عن الدائرة.

コメント

タイトルとURLをコピーしました