在本章中,我们将学习如何使用OpenCV使用系统相机捕获帧。org.opencv.videoio包的VideoCapture类包含使用相机捕获视频的类和方法。让我们一步一步学习如何捕捉帧 -
第1步:加载OpenCV本机库
在使用OpenCV库编写Java代码时,您需要做的第一步是使用loadLibrary()加载OpenCV的本机库。加载OpenCV本机库,如下所示。
// Loading the core library System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
第2步:实例化视频捕获类
使用前面本教程中提到的任何函数来实例化Mat类。
// Instantiating the VideoCapture class (camera:: 0) VideoCapture capture = new VideoCapture(0);
第3步:读取帧
您可以使用VideoCapture类的read()方法从相机中读取帧。此方法接受Mat类的对象来存储读取的帧。
// Reading the next video frame from the camera Mat matrix = new Mat(); capture.read(matrix);
代码:
1 package com.gitee.dgw.Camera; 2 3 import javafx.application.Application; 4 import javafx.embed.swing.SwingFXUtils; 5 import javafx.scene.Group; 6 import javafx.scene.Scene; 7 import javafx.scene.image.ImageView; 8 import javafx.scene.image.WritableImage; 9 import javafx.stage.Stage; 10 import org.opencv.core.Mat; 11 import org.opencv.imgcodecs.Imgcodecs; 12 import org.opencv.videoio.VideoCapture; 13 14 import java.awt.image.BufferedImage; 15 import java.awt.image.DataBufferByte; 16 import java.awt.image.WritableRaster; 17 18 public class CameraSnapshotJavaFX extends Application { 19 20 static { 21 platformUtils.loadLibraries(); 22 } 23 Mat matrix = null; 24 25 @Override 26 public void start(Stage stage) { 27 // Capturing the snapshot from the camera 28 CameraSnapshotJavaFX obj = new CameraSnapshotJavaFX(); 29 WritableImage writableImage = obj.capureSnapShot(); 30 31 // Saving the image 32 obj.saveImage(); 33 34 // Setting the image view 35 ImageView imageView = new ImageView(writableImage); 36 37 // setting the fit height and width of the image view 38 imageView.setFitHeight(400); 39 imageView.setFitWidth(600); 40 41 // Setting the preserve ratio of the image view 42 imageView.setPreserveRatio(true); 43 44 // Creating a Group object 45 Group root = new Group(imageView); 46 47 // Creating a scene object 48 Scene scene = new Scene(root, 600, 400); 49 50 // Setting title to the Stage 51 stage.setTitle("Capturing an image"); 52 53 // Adding scene to the stage 54 stage.setScene(scene); 55 56 // Displaying the contents of the stage 57 stage.show(); 58 } 59 public WritableImage capureSnapShot() { 60 WritableImage WritableImage = null; 61 62 63 // Instantiating the VideoCapture class (camera:: 0) 64 VideoCapture capture = new VideoCapture(0); 65 66 // Reading the next video frame from the camera 67 Mat matrix = new Mat(); 68 capture.read(matrix); 69 70 // If camera is opened 71 if( capture.isOpened()) { 72 // If there is next video frame 73 if (capture.read(matrix)) { 74 // Creating BuffredImage from the matrix 75 BufferedImage image = new BufferedImage(matrix.width(), 76 matrix.height(), BufferedImage.TYPE_3BYTE_BGR); 77 78 WritableRaster raster = image.getRaster(); 79 DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer(); 80 byte[] data = dataBuffer.getData(); 81 matrix.get(0, 0, data); 82 this.matrix = matrix; 83 84 // Creating the Writable Image 85 WritableImage = SwingFXUtils.toFXImage(image, null); 86 } 87 } 88 return WritableImage; 89 } 90 public void saveImage() { 91 // Saving the Image 92 String file = "z://sanpshot.jpg"; 93 94 // Instantiating the imgcodecs class 95 Imgcodecs imageCodecs = new Imgcodecs(); 96 97 // Saving it again 98 imageCodecs.imwrite(file, matrix); 99 } 100 public static void main(String args[]) { 101 launch(args); 102 } 103 }