Computer >> Máy Tính >  >> Lập trình >> Java

Làm cách nào để tìm Đường viền hình ảnh bằng thư viện Java OpenCV?


Đườ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 ]