OpenCV - Utilisation de la caméra

Dans ce chapitre, nous allons apprendre à utiliser OpenCV pour capturer des images à l'aide de la caméra système. leVideoCapture classe de la org.opencv.videoioLe package contient des classes et des méthodes pour capturer des vidéos à l'aide de la caméra. Allons-y étape par étape et apprenons à capturer des images -

Étape 1: Chargez la bibliothèque native OpenCV

Lors de l'écriture de code Java à l'aide de la bibliothèque OpenCV, la première étape à faire est de charger la bibliothèque native d'OpenCV à l'aide du loadLibrary(). Chargez la bibliothèque native OpenCV comme indiqué ci-dessous.

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

Étape 2: instancier la classe de capture vidéo

Instanciez la classe Mat à l'aide de l'une des fonctions mentionnées précédemment dans ce didacticiel.

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

Étape 3: Lisez les cadres

Vous pouvez lire les images de l'appareil photo à l'aide du read() méthode de la VideoCaptureclasse. Cette méthode accepte un objet de la classeMat pour stocker la trame lue.

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

Exemple

Le programme suivant montre comment capturer une image à l'aide de l'appareil photo et l'afficher à l'aide de la fenêtre JavaFX. Il enregistre également l'image capturée.

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);
   }
}

Production

Lors de l'exécution du programme, vous obtiendrez la sortie suivante.

Si vous ouvrez le chemin spécifié, vous pouvez observer le même cadre qui est enregistré en tant que fichier jpg.