Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Detect all Countour not an only Rectangle

1.apply Gaussian blur 2.then canny edge detection 3.find contours 4.find largest contours of rectangle 5.it Detect all Countours All

Question 1.But it detect all Contour . 2. In case Edge not Closed, Contour are also not Closed.But When detect document

My code

 int maxId = -1;
int maxAreaIdx = -1;double maxArea = -1;;
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();


private Mat findRectangle3(Mat src) throws Exception {
    Mat blurred = src.clone();
    Imgproc.medianBlur(src, blurred, 9);

    Mat gray0 = new Mat(blurred.size(), CvType.CV_8U), gray = new Mat();


    List<Mat> blurredChannel = new ArrayList<Mat>();
    blurredChannel.add(blurred);
    List<Mat> gray0Channel = new ArrayList<Mat>();
    gray0Channel.add(gray0);

    MatOfPoint2f approxCurve;



    for (int c = 0; c < 3; c++) {
        int ch[] = { c, 0 };
        Core.mixChannels(blurredChannel, gray0Channel, new MatOfInt(ch));

        int thresholdLevel = 1;
        for (int t = 0; t < thresholdLevel; t++) {
            if (t == 0) {
                Imgproc.Canny(gray0, gray, 10, 20, 3, true); // true ?
                Imgproc.dilate(gray, gray, new Mat(), new Point(-1, -1), 1); // 1
                // ?
            } else {
                Imgproc.adaptiveThreshold(gray0, gray, thresholdLevel,
                        Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
                        Imgproc.THRESH_BINARY,
                        (src.width() + src.height()) / 200, t);
            }

            Imgproc.findContours(gray, contours, new Mat(),
                    Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            for (MatOfPoint contour : contours) {
                MatOfPoint2f temp = new MatOfPoint2f(contour.toArray());

                double area = Imgproc.contourArea(contour);
                approxCurve = new MatOfPoint2f();
                Imgproc.approxPolyDP(temp, approxCurve,
                        Imgproc.arcLength(temp, true) * 0.02, true);

                if (approxCurve.total() == 4 && area >= maxArea&&area>=100) {
                    double maxCosine = 0;

                    List<Point> curves = approxCurve.toList();
                    for (int j = 2; j < 5; j++) {

                        double cosine = Math.abs(angle(curves.get(j % 4), curves.get(j - 2), curves.get(j - 1)));
                        maxCosine = Math.max(maxCosine, cosine);
                    }

                    if (maxCosine < 0.3) {
                        maxArea = area;
                        maxId = contours.indexOf(contour);
                    }
                }
            }
        }
    }

    if (maxId >= 0) {
        Log.d("maxmiumId","====="+maxId);
        Imgproc.drawContours(src, contours, maxId, new Scalar(255, 0, 0,
                .8), 2);

    }
    return src;
}
click to hide/show revision 2
retagged

updated 2019-06-20 02:46:32 -0600

berak gravatar image

Detect all Countour not an only Rectangle

1.apply Gaussian blur 2.then canny edge detection 3.find contours 4.find largest contours of rectangle 5.it Detect all Countours All

Question 1.But it detect all Contour . 2. In case Edge not Closed, Contour are also not Closed.But When detect document

My code

 int maxId = -1;
int maxAreaIdx = -1;double maxArea = -1;;
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();


private Mat findRectangle3(Mat src) throws Exception {
    Mat blurred = src.clone();
    Imgproc.medianBlur(src, blurred, 9);

    Mat gray0 = new Mat(blurred.size(), CvType.CV_8U), gray = new Mat();


    List<Mat> blurredChannel = new ArrayList<Mat>();
    blurredChannel.add(blurred);
    List<Mat> gray0Channel = new ArrayList<Mat>();
    gray0Channel.add(gray0);

    MatOfPoint2f approxCurve;



    for (int c = 0; c < 3; c++) {
        int ch[] = { c, 0 };
        Core.mixChannels(blurredChannel, gray0Channel, new MatOfInt(ch));

        int thresholdLevel = 1;
        for (int t = 0; t < thresholdLevel; t++) {
            if (t == 0) {
                Imgproc.Canny(gray0, gray, 10, 20, 3, true); // true ?
                Imgproc.dilate(gray, gray, new Mat(), new Point(-1, -1), 1); // 1
                // ?
            } else {
                Imgproc.adaptiveThreshold(gray0, gray, thresholdLevel,
                        Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
                        Imgproc.THRESH_BINARY,
                        (src.width() + src.height()) / 200, t);
            }

            Imgproc.findContours(gray, contours, new Mat(),
                    Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            for (MatOfPoint contour : contours) {
                MatOfPoint2f temp = new MatOfPoint2f(contour.toArray());

                double area = Imgproc.contourArea(contour);
                approxCurve = new MatOfPoint2f();
                Imgproc.approxPolyDP(temp, approxCurve,
                        Imgproc.arcLength(temp, true) * 0.02, true);

                if (approxCurve.total() == 4 && area >= maxArea&&area>=100) {
                    double maxCosine = 0;

                    List<Point> curves = approxCurve.toList();
                    for (int j = 2; j < 5; j++) {

                        double cosine = Math.abs(angle(curves.get(j % 4), curves.get(j - 2), curves.get(j - 1)));
                        maxCosine = Math.max(maxCosine, cosine);
                    }

                    if (maxCosine < 0.3) {
                        maxArea = area;
                        maxId = contours.indexOf(contour);
                    }
                }
            }
        }
    }

    if (maxId >= 0) {
        Log.d("maxmiumId","====="+maxId);
        Imgproc.drawContours(src, contours, maxId, new Scalar(255, 0, 0,
                .8), 2);

    }
    return src;
}
click to hide/show revision 3
retagged

Detect all Countour not an only Rectangle

1.apply Gaussian blur 2.then canny edge detection 3.find contours 4.find largest contours of rectangle 5.it Detect all Countours All

Question 1.But it detect all Contour . 2. In case Edge not Closed, Contour are also not Closed.But When detect document

My code

 int maxId = -1;
int maxAreaIdx = -1;double maxArea = -1;;
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();


private Mat findRectangle3(Mat src) throws Exception {
    Mat blurred = src.clone();
    Imgproc.medianBlur(src, blurred, 9);

    Mat gray0 = new Mat(blurred.size(), CvType.CV_8U), gray = new Mat();


    List<Mat> blurredChannel = new ArrayList<Mat>();
    blurredChannel.add(blurred);
    List<Mat> gray0Channel = new ArrayList<Mat>();
    gray0Channel.add(gray0);

    MatOfPoint2f approxCurve;



    for (int c = 0; c < 3; c++) {
        int ch[] = { c, 0 };
        Core.mixChannels(blurredChannel, gray0Channel, new MatOfInt(ch));

        int thresholdLevel = 1;
        for (int t = 0; t < thresholdLevel; t++) {
            if (t == 0) {
                Imgproc.Canny(gray0, gray, 10, 20, 3, true); // true ?
                Imgproc.dilate(gray, gray, new Mat(), new Point(-1, -1), 1); // 1
                // ?
            } else {
                Imgproc.adaptiveThreshold(gray0, gray, thresholdLevel,
                        Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
                        Imgproc.THRESH_BINARY,
                        (src.width() + src.height()) / 200, t);
            }

            Imgproc.findContours(gray, contours, new Mat(),
                    Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            for (MatOfPoint contour : contours) {
                MatOfPoint2f temp = new MatOfPoint2f(contour.toArray());

                double area = Imgproc.contourArea(contour);
                approxCurve = new MatOfPoint2f();
                Imgproc.approxPolyDP(temp, approxCurve,
                        Imgproc.arcLength(temp, true) * 0.02, true);

                if (approxCurve.total() == 4 && area >= maxArea&&area>=100) {
                    double maxCosine = 0;

                    List<Point> curves = approxCurve.toList();
                    for (int j = 2; j < 5; j++) {

                        double cosine = Math.abs(angle(curves.get(j % 4), curves.get(j - 2), curves.get(j - 1)));
                        maxCosine = Math.max(maxCosine, cosine);
                    }

                    if (maxCosine < 0.3) {
                        maxArea = area;
                        maxId = contours.indexOf(contour);
                    }
                }
            }
        }
    }

    if (maxId >= 0) {
        Log.d("maxmiumId","====="+maxId);
        Imgproc.drawContours(src, contours, maxId, new Scalar(255, 0, 0,
                .8), 2);

    }
    return src;
}
click to hide/show revision 4
retagged

Detect all Countour not an only Rectangle

1.apply Gaussian blur 2.then canny edge detection 3.find contours 4.find largest contours of rectangle 5.it Detect all Countours All

Question 1.But it detect all Contour . 2. In case Edge not Closed, Contour are also not Closed.But When detect document

My code

 int maxId = -1;
int maxAreaIdx = -1;double maxArea = -1;;
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();


private Mat findRectangle3(Mat src) throws Exception {
    Mat blurred = src.clone();
    Imgproc.medianBlur(src, blurred, 9);

    Mat gray0 = new Mat(blurred.size(), CvType.CV_8U), gray = new Mat();


    List<Mat> blurredChannel = new ArrayList<Mat>();
    blurredChannel.add(blurred);
    List<Mat> gray0Channel = new ArrayList<Mat>();
    gray0Channel.add(gray0);

    MatOfPoint2f approxCurve;



    for (int c = 0; c < 3; c++) {
        int ch[] = { c, 0 };
        Core.mixChannels(blurredChannel, gray0Channel, new MatOfInt(ch));

        int thresholdLevel = 1;
        for (int t = 0; t < thresholdLevel; t++) {
            if (t == 0) {
                Imgproc.Canny(gray0, gray, 10, 20, 3, true); // true ?
                Imgproc.dilate(gray, gray, new Mat(), new Point(-1, -1), 1); // 1
                // ?
            } else {
                Imgproc.adaptiveThreshold(gray0, gray, thresholdLevel,
                        Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
                        Imgproc.THRESH_BINARY,
                        (src.width() + src.height()) / 200, t);
            }

            Imgproc.findContours(gray, contours, new Mat(),
                    Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            for (MatOfPoint contour : contours) {
                MatOfPoint2f temp = new MatOfPoint2f(contour.toArray());

                double area = Imgproc.contourArea(contour);
                approxCurve = new MatOfPoint2f();
                Imgproc.approxPolyDP(temp, approxCurve,
                        Imgproc.arcLength(temp, true) * 0.02, true);

                if (approxCurve.total() == 4 && area >= maxArea&&area>=100) {
                    double maxCosine = 0;

                    List<Point> curves = approxCurve.toList();
                    for (int j = 2; j < 5; j++) {

                        double cosine = Math.abs(angle(curves.get(j % 4), curves.get(j - 2), curves.get(j - 1)));
                        maxCosine = Math.max(maxCosine, cosine);
                    }

                    if (maxCosine < 0.3) {
                        maxArea = area;
                        maxId = contours.indexOf(contour);
                    }
                }
            }
        }
    }

    if (maxId >= 0) {
        Log.d("maxmiumId","====="+maxId);
        Imgproc.drawContours(src, contours, maxId, new Scalar(255, 0, 0,
                .8), 2);

    }
    return src;
}
click to hide/show revision 5
retagged

Detect all Countour not an only Rectangle

1.apply Gaussian blur 2.then canny edge detection 3.find contours 4.find largest contours of rectangle 5.it Detect all Countours All

Question 1.But it detect all Contour . 2. In case Edge not Closed, Contour are also not Closed.But When detect document

My code

 int maxId = -1;
int maxAreaIdx = -1;double maxArea = -1;;
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();


private Mat findRectangle3(Mat src) throws Exception {
    Mat blurred = src.clone();
    Imgproc.medianBlur(src, blurred, 9);

    Mat gray0 = new Mat(blurred.size(), CvType.CV_8U), gray = new Mat();


    List<Mat> blurredChannel = new ArrayList<Mat>();
    blurredChannel.add(blurred);
    List<Mat> gray0Channel = new ArrayList<Mat>();
    gray0Channel.add(gray0);

    MatOfPoint2f approxCurve;



    for (int c = 0; c < 3; c++) {
        int ch[] = { c, 0 };
        Core.mixChannels(blurredChannel, gray0Channel, new MatOfInt(ch));

        int thresholdLevel = 1;
        for (int t = 0; t < thresholdLevel; t++) {
            if (t == 0) {
                Imgproc.Canny(gray0, gray, 10, 20, 3, true); // true ?
                Imgproc.dilate(gray, gray, new Mat(), new Point(-1, -1), 1); // 1
                // ?
            } else {
                Imgproc.adaptiveThreshold(gray0, gray, thresholdLevel,
                        Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
                        Imgproc.THRESH_BINARY,
                        (src.width() + src.height()) / 200, t);
            }

            Imgproc.findContours(gray, contours, new Mat(),
                    Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            for (MatOfPoint contour : contours) {
                MatOfPoint2f temp = new MatOfPoint2f(contour.toArray());

                double area = Imgproc.contourArea(contour);
                approxCurve = new MatOfPoint2f();
                Imgproc.approxPolyDP(temp, approxCurve,
                        Imgproc.arcLength(temp, true) * 0.02, true);

                if (approxCurve.total() == 4 && area >= maxArea&&area>=100) {
                    double maxCosine = 0;

                    List<Point> curves = approxCurve.toList();
                    for (int j = 2; j < 5; j++) {

                        double cosine = Math.abs(angle(curves.get(j % 4), curves.get(j - 2), curves.get(j - 1)));
                        maxCosine = Math.max(maxCosine, cosine);
                    }

                    if (maxCosine < 0.3) {
                        maxArea = area;
                        maxId = contours.indexOf(contour);
                    }
                }
            }
        }
    }

    if (maxId >= 0) {
        Log.d("maxmiumId","====="+maxId);
        Imgproc.drawContours(src, contours, maxId, new Scalar(255, 0, 0,
                .8), 2);

    }
    return src;
}
click to hide/show revision 6
retagged

Detect all Countour not an only Rectangle

1.apply Gaussian blur 2.then canny edge detection 3.find contours 4.find largest contours of rectangle 5.it Detect all Countours All

Question 1.But it detect all Contour . 2. In case Edge not Closed, Contour are also not Closed.But When detect document

My code

 int maxId = -1;
int maxAreaIdx = -1;double maxArea = -1;;
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();


private Mat findRectangle3(Mat src) throws Exception {
    Mat blurred = src.clone();
    Imgproc.medianBlur(src, blurred, 9);

    Mat gray0 = new Mat(blurred.size(), CvType.CV_8U), gray = new Mat();


    List<Mat> blurredChannel = new ArrayList<Mat>();
    blurredChannel.add(blurred);
    List<Mat> gray0Channel = new ArrayList<Mat>();
    gray0Channel.add(gray0);

    MatOfPoint2f approxCurve;



    for (int c = 0; c < 3; c++) {
        int ch[] = { c, 0 };
        Core.mixChannels(blurredChannel, gray0Channel, new MatOfInt(ch));

        int thresholdLevel = 1;
        for (int t = 0; t < thresholdLevel; t++) {
            if (t == 0) {
                Imgproc.Canny(gray0, gray, 10, 20, 3, true); // true ?
                Imgproc.dilate(gray, gray, new Mat(), new Point(-1, -1), 1); // 1
                // ?
            } else {
                Imgproc.adaptiveThreshold(gray0, gray, thresholdLevel,
                        Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
                        Imgproc.THRESH_BINARY,
                        (src.width() + src.height()) / 200, t);
            }

            Imgproc.findContours(gray, contours, new Mat(),
                    Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

            for (MatOfPoint contour : contours) {
                MatOfPoint2f temp = new MatOfPoint2f(contour.toArray());

                double area = Imgproc.contourArea(contour);
                approxCurve = new MatOfPoint2f();
                Imgproc.approxPolyDP(temp, approxCurve,
                        Imgproc.arcLength(temp, true) * 0.02, true);

                if (approxCurve.total() == 4 && area >= maxArea&&area>=100) {
                    double maxCosine = 0;

                    List<Point> curves = approxCurve.toList();
                    for (int j = 2; j < 5; j++) {

                        double cosine = Math.abs(angle(curves.get(j % 4), curves.get(j - 2), curves.get(j - 1)));
                        maxCosine = Math.max(maxCosine, cosine);
                    }

                    if (maxCosine < 0.3) {
                        maxArea = area;
                        maxId = contours.indexOf(contour);
                    }
                }
            }
        }
    }

    if (maxId >= 0) {
        Log.d("maxmiumId","====="+maxId);
        Imgproc.drawContours(src, contours, maxId, new Scalar(255, 0, 0,
                .8), 2);

    }
    return src;
}