Canny рисует контур вокруг рамки

У меня проблема с функцией Canny. Это производит линии вокруг моей структуры. Поэтому, когда я впоследствии использую свою функцию FindContour, она рисует контур вокруг моего кадра. Я хочу посмотреть на мой самый большой контур, который должен быть моим объектом, но это мой каркас в этой ситуации. Когда функция Canny четко показывает одну форму, эта функция, скорее всего, будет рисовать большой контур вокруг моей рамки.

Если видели, есть способы избежать этой проблемы путем преобразования изображения. Когда я делаю это, я получаю ошибку, хотя. Вот мой код

private void ProcessFrame(object sender, EventArgs e)
    {
        if (_capture != null && _capture.Ptr != IntPtr.Zero)
        {
            _capture.Retrieve(imgOriginal, 0);
            CvInvoke.CvtColor(imgOriginal, imgHSV, ColorConversion.Bgr2Hsv); //Convert the captured frame from BGR to HSV
            CvInvoke.InRange(imgHSV, new ScalarArray(new MCvScalar(iLowH, iLowS, iLowV)), new ScalarArray(new MCvScalar(iHighH, iHighS, iHighV)), imgThres);
            CvInvoke.Erode(imgThres, imgThres, CvInvoke.GetStructuringElement(ElementShape.Ellipse, new Size(5, 5), new Point(-1, -1)), new Point(-1, -1), 3, BorderType.Constant, new MCvScalar(255, 255, 255));
            CvInvoke.Dilate(imgThres, imgThres, CvInvoke.GetStructuringElement(ElementShape.Ellipse, new Size(5, 5), new Point(-1, -1)), new Point(-1, -1), 3, BorderType.Constant, new MCvScalar(255, 255, 255));
            CvInvoke.Canny(imgThres, imgCanny, 100, 200, 3);
            CvInvoke.Invert(imgCanny, imgCanny, DecompMethod.Svd);
            FindLargestContour(imgCanny, imgContour);
            pictureBox1.Image = imgOriginal.Bitmap;
            pictureBox2.Image = imgCanny.Bitmap;
        }
    }

    private void FindLargestContour(IInputOutputArray imgCanny, IInputOutputArray imgContour)
    {
        int largest_contour_index = 0;
        double largest_area = 0;
        VectorOfPoint largestContour;
        using (Mat hierachy = new Mat())
        using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
        {
            IOutputArray hierarchy;
            CvInvoke.FindContours(imgCanny, contours, hierachy, RetrType.Tree, ChainApproxMethod.ChainApproxSimple);
            for (int i = 0; i < contours.Size; i++)
            {
                MCvScalar color = new MCvScalar(0, 0, 255);
                double a = CvInvoke.ContourArea(contours[i], false);  //  Find the area of contour
                if (a > largest_area)
                {
                    largest_area = a;
                    largest_contour_index = i;                //Store the index of largest contour
                }
                CvInvoke.DrawContours(imgContour, contours, largest_contour_index, new MCvScalar(255, 0, 0));
            }
            CvInvoke.DrawContours(imgContour, contours, largest_contour_index, new MCvScalar(0, 0, 255), 5, LineType.EightConnected, hierachy);
            largestContour = new VectorOfPoint(contours[largest_contour_index].ToArray());
        }
    }

Ошибка заключается в следующем, когда я раскомментирую функцию Invert.

CvException: OpenCV: type == CV_32F || type == CV_64F

Раньше у меня был код на С ++, и там не было проблемы с рисованием контура вокруг кадра. Может быть, мне следует использовать разные пороговые значения для моей функции Canny? Может ли другое решение найти область моего кадра, а затем исключить эту область из сравнения?

Спасибо!

1 ответ

Возможно, это не самый модный обходной путь, но я отредактировал цикл if, который просматривает наибольшую область контура.

Так из

if (a > largest_area)
{
    largest_area = a;
    largest_contour_index = i;
}

я пошел в

if (a > largest_area && a < 0.92 * (_capture.Width * _capture.Height))
{
    largest_area = a;
    largest_contour_index = i;
}

Таким образом, код не должен сохранять контур, размер которого почти такой же большой, как весь кадр.

Другие вопросы по тегам