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

Làm thế nào để tìm khu vực của một thư viện Java OpenCV đường viền hình ảnh?


Đườ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. Theo cách tương tự, bạn có thể vẽ

Bạn cũng có thể tìm thấy diện tích của các hình dạng trong các hình ảnh đầu vào đã cho. Để làm như vậy, bạn cần gọi contourArea () phương thức của lớp Imgproc. Phương thức này chấp nhận đường bao của một hình cụ thể, tìm và trả về diện tích của nó.

Ví dụ

Ví dụ java sau đây tìm diện tích của mỗi hình dạng / đối tượng trong hình ảnh đã cho, vẽ đường viền của các hình dạng có diện tích nhỏ hơn 5000 bằng màu đỏ và phần còn lại là màu trắng.

import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class FindContourArea {
   public static void main(String args[]) throws Exception {
      //Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      //Reading the contents of the image
      String file ="D:\\Images\\javafx_graphical.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);
      Mat draw = Mat.zeros(src.size(), CvType.CV_8UC3);
      for (int i = 0; i < contours.size(); i++) {
         Scalar color = new Scalar(0, 0, 255);
         //Calculating the area
         double cont_area = Imgproc.contourArea(contours.get(i));
         System.out.println(cont_area);
         if(cont_area>5000.0){
            Imgproc.drawContours(draw, contours, i, color, 2,
            Imgproc.LINE_8, hierarchey, 2, new Point() ) ;
         } else {
            color = new Scalar(255, 255, 255);
            Imgproc.drawContours(draw, contours, i, color, 2, Imgproc.LINE_8,
            hierarchey, 2, new Point() ) ;
         }
      }
      HighGui.imshow("Contours operation", draw);
      HighGui.waitKey();
   }
}

Hình ảnh đầu vào

Đầu ra

4091.0
6336.0
189.0
6439.0
4903.0

Ngoài kết quả đầu ra ở trên, chương trình trên tạo ra cửa sổ sau -

Làm thế nào để tìm khu vực của một thư viện Java OpenCV đường viền hình ảnh?