OpenCV - Kamera verwenden
In diesem Kapitel erfahren Sie, wie Sie mit OpenCV Bilder mit der Systemkamera aufnehmen. DasVideoCapture Klasse der org.opencv.videoioDas Paket enthält Klassen und Methoden zum Aufnehmen von Videos mit der Kamera. Lassen Sie uns Schritt für Schritt lernen, wie man Frames erfasst -
Schritt 1: Laden Sie die native OpenCV-Bibliothek
Während Sie Java-Code mit der OpenCV-Bibliothek schreiben, müssen Sie zunächst die native OpenCV-Bibliothek mit der laden loadLibrary(). Laden Sie die native OpenCV-Bibliothek wie unten gezeigt.
// Loading the core library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Schritt 2: Instanziieren Sie die Videoaufnahmeklasse
Instanziieren Sie die Mat-Klasse mit einer der zuvor in diesem Lernprogramm genannten Funktionen.
// Instantiating the VideoCapture class (camera:: 0)
VideoCapture capture = new VideoCapture(0);
Schritt 3: Lesen Sie die Frames
Sie können die Bilder von der Kamera mit der lesen read() Methode der VideoCaptureKlasse. Diese Methode akzeptiert ein Objekt der KlasseMat um den gelesenen Frame zu speichern.
// Reading the next video frame from the camera
Mat matrix = new Mat();
capture.read(matrix);
Beispiel
Das folgende Programm zeigt, wie Sie ein Bild mit der Kamera aufnehmen und mit dem JavaFX-Fenster anzeigen. Außerdem wird der aufgenommene Frame gespeichert.
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);
}
}
Ausgabe
Beim Ausführen des Programms erhalten Sie die folgende Ausgabe.
Wenn Sie den angegebenen Pfad öffnen, können Sie denselben Frame beobachten, der als JPG-Datei gespeichert ist.