Đường bao không là gì khác ngoài đường nối tất cả các điểm dọc theo đường biên của một hình cụ thể. Sử dụng cái này, bạn có thể -
-
Tìm hình dạng của một đối tượng.
-
Tính diện tích của một vật thể.
-
Phát hiện một đối tượng.
-
Nhận ra một đối tượng.
Bạn có thể tìm thấy các đường viền của các hình dạng, đối tượng khác nhau trong một hình ảnh bằng cách sử dụng findContours () phương pháp. Phương thức này chấp nhận các tham số sau -
-
Hình ảnh nhị phân.
-
Đối tượng danh sách trống kiểu MatOfPoint để lưu trữ các đường bao.
-
Một đối tượng Mat trống để lưu trữ cấu trúc liên kết hình ảnh.
-
Hai biến số nguyên để chỉ định chế độ và phương pháp để tìm các đường bao của hình ảnh đã cho.
Ví dụ
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(); */ } }
Đầu ra
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 ]