Contours are nothing but the line joining all the points along the boundary of a particular shape. Using this you can −
Find the shape of an object.
Calculate the area of an object.
Detect an object.
Recognize an object.
You can find the contours of various shapes, objects in an image using the findContours() method. This method accepts the following parameters −
A binary image.
An empty list object of type MatOfPoint to store the contours.
An empty Mat object to store the image topology.
Two integer variables to specify the mode and method to find the contours of the given image.
Example
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class FindingContours { public static void main(String args[]) throws Exception { //Loading the OpenCV core library System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); String file ="D:\\Images\\shapes.jpg"; Mat src = Imgcodecs.imread(file); //Converting the source image to binary Mat gray = new Mat(src.rows(), src.cols(), src.type()); Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); Mat binary = new Mat(src.rows(), src.cols(), src.type(), new Scalar(0)); Imgproc.threshold(gray, binary, 100, 255, Imgproc.THRESH_BINARY_INV); //Finding Contours List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchey = new Mat(); Imgproc.findContours(binary, contours, hierarchey, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE); Iterator<MatOfPoint> it = contours.iterator(); while(it.hasNext()) { System.out.println(it.next()); } /* Mat draw = Mat.zeros(binary.size(), CvType.CV_8UC3); for (int i = 0; i < contours.size(); i++) { System.out.println(contours); Scalar color = new Scalar(0, 0, 255); //Drawing Contours Imgproc.drawContours(draw, contours, i, color, 2, Imgproc.LINE_8, hierarchey, 2, new Point() ) ; } HighGui.imshow("Contours operation", draw); HighGui.waitKey(); */ } }
Output
Mat [ 29*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829510, dataAddr=0x19826dc0 ] Mat [ 58*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829580, dataAddr=0x19826f00 ] Mat [ 35*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828be0, dataAddr=0x19827100 ] Mat [ 117*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829190, dataAddr=0x19827280 ] Mat [ 1*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x198292e0, dataAddr=0xba8280 ] Mat [ 78*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829350, dataAddr=0x19827680 ] Mat [ 63*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x198289b0, dataAddr=0x19827940 ] Mat [ 120*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828e80, dataAddr=0x19827b80 ] Mat [ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829430, dataAddr=0xb84580 ] Mat [ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829120, dataAddr=0xb84440 ] Mat [ 136*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828ef0, dataAddr=0x19827f80 ] Mat [ 120*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828b00, dataAddr=0x19828440 ]