Java – How to find the largest outline in Java OpenCV

How to find the largest outline in Java OpenCV… here is a solution to the problem.

How to find the largest outline in Java OpenCV

I’ve used find contours and boundingrect and displayed them in my projects. Then I want to find the largest outline and display it. Is this possible? I am new to the OpenCV java language.

So far, here’s my code:

@Override
public void onCameraViewStarted(int width, int height) {
    mRgba = new Mat(height, width, CvType.CV_8UC4);
    mHsv = new Mat(height,width,CvType.CV_8UC3);
    hierarchy = new Mat();
    mHsvMask = new Mat();
    mDilated = new Mat();
    mEroded = new Mat();
}

@Override
public void onCameraViewStopped() {
    mRgba.release();
    mHsv.release();
    mHsvMask.release();
    mDilated.release();
    hierarchy.release();

}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

mRgba =inputFrame.rgba();
    contours = new ArrayList<MatOfPoint>();
    hierarchy =new Mat();
    mHsv = new Mat();
    mHsvMask =new Mat();

Imgproc.cvtColor(mRgba, mHsv, Imgproc.COLOR_RGB2HSV);

Scalar lowerThreshold = new Scalar ( 0, 0, 0 );  Blue color – lower hsv values
    Scalar upperThreshold = new Scalar ( 179, 255, 10 );  Blue color – higher hsv values
    Core.inRange ( mHsv, lowerThreshold , upperThreshold, mHsvMask );

just some filter
   Imgproc.dilate ( mHsvMask, mDilated, new Mat() );
    Imgproc.erode(mDilated,mEroded,new Mat());

Imgproc.findContours(mHsvMask, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);

for ( int contourIdx=0; contourIdx < contours.size(); contourIdx++ )
    {
        Minimun size allowed for consideration
        MatOfPoint2f approxCurve = new MatOfPoint2f();
        MatOfPoint2f contour2f = new MatOfPoint2f(contours.get(contourIdx).toArray());

Processing on mMOP2f1 which is in type MatOfPoint2f
        double approxDistance = Imgproc.arcLength(contour2f,true)*0.02;
        Imgproc.approxPolyDP(contour2f,approxCurve,approxDistance,true);

convert to MatofPoint
        MatOfPoint point = new MatOfPoint(approxCurve.toArray());

get boundingrect from contour
        Rect rect = Imgproc.boundingRect(point);

Imgproc.rectangle(mRgba,new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0, 255),3);
        bisa Imgproc.rectangle(mRgba, rect.tl(), rect.br(), new Scalar(255, 0, 0),1, 8,0);

show contour kontur
        if(Imgproc.contourArea(contours.get(contourIdx))>100) {
            Imgproc.drawContours(mRgba, contours, contourIdx, new Scalar(0,255,0), 5);
        }
    }
    return mRgba;

Hopefully someone has some experience with this. Thanks…

Solution

Using the function Imgproc.contourArea, you can simply find the area of all contours, and the contour with the largest area is the largest profile.

The code for drawing the maximum outline is as follows:

double maxVal = 0;
int maxValIdx = 0;
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++)
{
    double contourArea = Imgproc.contourArea(contours.get(contourIdx));
    if (maxVal < contourArea)
    {
        maxVal = contourArea;
        maxValIdx = contourIdx;
    }
}

Imgproc.drawContours(mRgba, contours, maxValIdx, new Scalar(0,255,0), 5);

Related Problems and Solutions