Обнаружение овала Пренебрежение определенной областью с помощью Emgu cv - PullRequest
0 голосов
/ 01 марта 2020

Мне нужно определить радиус черного круга / овала этого изображения. Я пытался использовать методы Houghcircles и Canny, но каждый раз он выводит больше кругов. Исходное изображение .

Это круг, который я ожидаю обнаружить. Ожидаемое изображение


    public static Mat FindCircle(Mat img)
            {
                Mat canny = new Mat();
                UMat grayscale = new UMat();
                UMat pyrdown = new UMat();

                double cannyThreshold = 128;
                // Grayscaling image
                CvInvoke.CvtColor(img, grayscale, ColorConversion.Bgr2Gray);

                // remove noise and run edge detection
                CvInvoke.PyrDown(grayscale, pyrdown);
                CvInvoke.PyrUp(pyrdown, grayscale);
                CvInvoke.Imshow("Blur", grayscale);
                CvInvoke.Canny(grayscale, canny, cannyThreshold, cannyThreshold*2);

                CvInvoke.Imshow("Canny", canny);
                Image<Bgr, Byte> output =img.ToImage<Bgr, Byte>();
                // find and draw circles   
                VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
                CvInvoke.FindContours(canny, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);
                //CvInvoke.Imshow("Contours", contours);
                //CvInvoke.DrawContours(result, contours, -1, new MCvScalar(0, 0, 255));
                for (int i = 0; i < contours.Size; i++)
                {

                    try
                    {
                        Ellipse ellipse = new Ellipse(CvInvoke.FitEllipse(contours[i]));
                        output.Draw(ellipse, new Bgr(Color.Red), 1);
                    }
                    catch(Exception ex)
                    {

                    }

                }
}

...