OpenCV - Korzystanie z aparatu

W tym rozdziale dowiemy się, jak używać OpenCV do przechwytywania klatek za pomocą kamery systemowej. PlikVideoCapture klasa org.opencv.videoioPakiet zawiera klasy i metody do przechwytywania wideo za pomocą kamery. Przejdźmy krok po kroku i dowiedzmy się, jak przechwytywać klatki -

Krok 1: Załaduj natywną bibliotekę OpenCV

Podczas pisania kodu Java przy użyciu biblioteki OpenCV, pierwszym krokiem, jaki należy wykonać, jest załadowanie natywnej biblioteki OpenCV za pomocą loadLibrary(). Załaduj natywną bibliotekę OpenCV, jak pokazano poniżej.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Krok 2: Utwórz wystąpienie klasy przechwytywania wideo

Utwórz wystąpienie klasy Mat, używając dowolnej funkcji wspomnianej wcześniej w tym samouczku.

// Instantiating the VideoCapture class (camera:: 0) 
VideoCapture capture = new VideoCapture(0);

Krok 3: Przeczytaj ramki

Możesz odczytać klatki z aparatu za pomocą read() metoda VideoCaptureklasa. Ta metoda akceptuje obiekt klasyMat aby zapisać ramkę do odczytu.

// Reading the next video frame from the camera 
Mat matrix = new Mat(); 
capture.read(matrix);

Przykład

Poniższy program pokazuje, jak przechwycić klatkę za pomocą kamery i wyświetlić ją za pomocą okna JavaFX. Zapisuje również przechwyconą ramkę.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;

import java.io.FileNotFoundException;
import java.io.IOException;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class CameraSnapshotJavaFX extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws FileNotFoundException, IOException {
      // Capturing the snapshot from the camera
      CameraSnapshotJavaFX obj = new CameraSnapshotJavaFX();
      WritableImage writableImage = obj.capureSnapShot();

      // Saving the image
      obj.saveImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Capturing an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage capureSnapShot() {
      WritableImage WritableImage = null;

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the VideoCapture class (camera:: 0)
      VideoCapture capture = new VideoCapture(0);

      // Reading the next video frame from the camera
      Mat matrix = new Mat();
      capture.read(matrix);

      // If camera is opened
      if( capture.isOpened()) {
         // If there is next video frame
         if (capture.read(matrix)) {
            // Creating BuffredImage from the matrix
            BufferedImage image = new BufferedImage(matrix.width(), 
               matrix.height(), BufferedImage.TYPE_3BYTE_BGR);
            
            WritableRaster raster = image.getRaster();
            DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
            byte[] data = dataBuffer.getData();
            matrix.get(0, 0, data);
            this.matrix = matrix;
            
            // Creating the Writable Image
            WritableImage = SwingFXUtils.toFXImage(image, null);
         }
      }
      return WritableImage;
   }
   public void saveImage() {
      // Saving the Image
      String file = "E:/OpenCV/chap22/sanpshot.jpg";

      // Instantiating the imgcodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      // Saving it again 
      imageCodecs.imwrite(file, matrix);
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

Jeśli otworzysz określoną ścieżkę, możesz obserwować tę samą ramkę, która jest zapisywana jako plik jpg.