Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

contourArea() method assertion error

I'm very new to image processing.I'm trying to calculate the solidity in opencv on contours of an image. But contourArea() method in my code gives an assertion error that is:

"OpenCV Error: Assertion failed (contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S)) in cv::contourArea").

How can I fix it. Thank You.

import static com.googlecode.javacv.cpp.opencv_imgproc.CV_THRESH_BINARY; import java.util.ArrayList; import java.util.List; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfInt; import org.opencv.core.MatOfPoint; import org.opencv.core.Scalar; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; import static org.opencv.imgproc.Imgproc.contourArea; import static org.opencv.imgproc.Imgproc.findContours;

public class Solidity { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat image = Highgui.imread("D:\MyImage.bmp");

    if (image.empty() == true) {
        System.out.println("Error: no image found!");
    } else {

        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        Mat image_2 = new Mat();


        Imgproc.cvtColor(image, image_2, Imgproc.COLOR_BGR2GRAY);
        Imgproc.threshold(image_2, image_2, 150, 255, CV_THRESH_BINARY);

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


        for (int i = 0; i < contours.size(); i++) {
            Imgproc.drawContours(image, contours, -1, new Scalar(240, 0, 0), 2);

            double area=contourArea(contours.get(i));

            MatOfInt matOfInt=new MatOfInt();

            Imgproc.convexHull(contours.get(i),matOfInt);

            //Mat conMat=new Mat(contours.get(i).size(),CV_32FC1);
            //Error comes from here
            double hullArea=contourArea(matOfInt);

            double solidity=area/hullArea;

            System.out.println(solidity);
        }

    }

}

}

contourArea() method assertion errorFinding Area of Convex Hull Gives an Assertion Error

I'm very new to image processing.I'm trying to calculate the solidity in opencv on contours of an image. But contourArea() method in my code gives an assertion error that is:

"OpenCV Error: Assertion failed (contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S)) in cv::contourArea").

How can I fix it. Thank You.

import static com.googlecode.javacv.cpp.opencv_imgproc.CV_THRESH_BINARY; import java.util.ArrayList; import java.util.List; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfInt; import org.opencv.core.MatOfPoint; import org.opencv.core.Scalar; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; import static org.opencv.imgproc.Imgproc.contourArea; import static org.opencv.imgproc.Imgproc.findContours;

public class Solidity { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat image = Highgui.imread("D:\MyImage.bmp");

    if (image.empty() == true) {
        System.out.println("Error: no image found!");
    } else {

        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        Mat image_2 = new Mat();


        Imgproc.cvtColor(image, image_2, Imgproc.COLOR_BGR2GRAY);
        Imgproc.threshold(image_2, image_2, 150, 255, CV_THRESH_BINARY);

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


        for (int i = 0; i < contours.size(); i++) {
            Imgproc.drawContours(image, contours, -1, new Scalar(240, 0, 0), 2);

            double area=contourArea(contours.get(i));

            MatOfInt matOfInt=new MatOfInt();

            Imgproc.convexHull(contours.get(i),matOfInt);

            //Mat conMat=new Mat(contours.get(i).size(),CV_32FC1);
            //Error comes from here
            double hullArea=contourArea(matOfInt);

            double solidity=area/hullArea;

            System.out.println(solidity);
        }

    }

}

}