OpenCV Android, рисование самого большого контура, что-то не так

Я пытаюсь нарисовать самый большой контур, я работаю в реальном времени, обрабатывая каждый кадр камеры. Мое входное изображение будет ручным, у меня есть несколько ограничений — черный фон, отсутствие бликов.

Я ожидаю, что самый большой контур будет как можно ближе к нижнему изображениювведите описание изображения здесь

Мой код приведен ниже, я ссылался на множество примеров, доступных в Интернете, и я почти подумал, что в моем коде нет ничего плохого.

        mRgba = inputFrame.gray();
        contours = new ArrayList<MatOfPoint>();
        mcontours = new ArrayList<MatOfPoint>();
        List<Mat> hull = new ArrayList<Mat>(contours.size());

        hierarchy = new Mat();
        Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 50, 50);
        Imgproc.findContours(mIntermediateMat, contours, hierarchy,
                Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);


        for (int idx = 0; idx != contours.size(); ++idx)
        {
            Mat contour = contours.get(idx);
            double contourarea = Imgproc.contourArea(contour);
            Log.i(TAG, "maxAreaIdx =" + idx + "contourarea = " + contourarea);
            if (contourarea > maxArea)
            {
                maxArea = contourarea;
                maxAreaIdx = idx;
                Log.i(TAG, "maxAreaIdx =" + maxAreaIdx + "MaxArea = " + maxArea);

            }

        }

        if(maxAreaIdx > 0 && maxAreaIdx < contours.size())
            mcontours.add(contours.get(maxAreaIdx));
        else
            break;

        Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA,
                4);
        hierarchy.release();
        Imgproc.drawContours(mRgba, mcontours, -1, CONTOUR_COLOR, -1);

Теперь все, что я получаю, это очень малая часть этого. Насколько я понимаю, сам OpenCV не может обнаружить большой непрерывный контур. Пожалуйста, обратитесь к изображениям ниже.

введите здесь описание изображения

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

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


person Adorn    schedule 29.12.2014    source источник


Ответы (1)


Попробуй это :

List<MatOfPoint> mContours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();

//"tes" is binary image from threshold result       
Imgproc.findContours(tes, mContours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));
    Mat overlay = contImg; //this is source image RGB
    for(int i = 0; i < mContours.size(); i++)
    {
            Imgproc.drawContours(overlay, mContours, -1, red, 2); //draw contour
    }
    return overlay;             

Надеюсь, это поможет вам

person ichaka    schedule 18.06.2015