OpenCV - Sử dụng máy ảnh
Trong chương này, chúng ta sẽ học cách sử dụng OpenCV để chụp các khung hình bằng camera hệ thống. CácVideoCapture lớp của org.opencv.videoiogói chứa các lớp và phương thức để quay video bằng máy ảnh. Hãy đi từng bước và tìm hiểu cách chụp khung hình -
Bước 1: Tải thư viện gốc OpenCV
Trong khi viết mã Java bằng thư viện OpenCV, bước đầu tiên bạn cần làm là tải thư viện gốc của OpenCV bằng cách sử dụng loadLibrary(). Tải thư viện gốc OpenCV như hình dưới đây.
// Loading the core library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Bước 2: Khởi tạo lớp quay video
Khởi tạo lớp Mat bằng bất kỳ hàm nào được đề cập trong hướng dẫn này trước đó.
// Instantiating the VideoCapture class (camera:: 0)
VideoCapture capture = new VideoCapture(0);
Bước 3: Đọc các khung
Bạn có thể đọc các khung hình từ máy ảnh bằng cách sử dụng read() phương pháp của VideoCapturelớp học. Phương thức này chấp nhận một đối tượng của lớpMat để lưu trữ khung đã đọc.
// Reading the next video frame from the camera
Mat matrix = new Mat();
capture.read(matrix);
Thí dụ
Chương trình sau đây trình bày cách chụp một khung hình bằng máy ảnh và hiển thị nó bằng cửa sổ JavaFX. Nó cũng lưu khung hình đã chụp.
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);
}
}
Đầu ra
Khi thực hiện chương trình, bạn sẽ nhận được kết quả sau.
Nếu bạn mở đường dẫn đã chỉ định, bạn có thể quan sát cùng một khung được lưu dưới dạng tệp jpg.