Tiếp theo bài viết hiển thị hình ảnh sử dụng OpenCV thì trong nội dung phần hướng dẫn này mình sẽ trình bày hiển thị máy ảnh sử dụng OpenCV trong Java. Lớp VideoCapture của gói org.opencv.videoio chứa các lớp và phương thức để quay video bằng máy ảnh.
Hiển thị máy ảnh sử dụng OpenCV trong Java bạn có thể thực hiện theo các bước sau để đọc hình ảnh trong Java bằng cách sử dụng thư viện OpenCV:
Bước 1: Tải thư viện OpenCV vào dự án
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Hoặc bạn có thể nạp thư viện OpenCV bằng đường dẫn chẳng hạn
System.load("C:\\OpenCV\\build\\java\\x64\\opencv_java341.dll");
Bước 2: Sử dụng lớp VideoCapture để đọc hình ảnh trả về cho bạn đối tượng Mat
VideoCapture cap = new VideoCapture(); cap.open(0); Mat matrix = new Mat(); cap.read(matrix);
Sau đó bạn cần chuyển từ đối tượng Mat sang BufferedImage
private static BufferedImage matToBufferedImage(Mat matrix) { try { MatOfByte mob = new MatOfByte(); Imgcodecs.imencode(".jpg", matrix, mob); byte ba[] = mob.toArray(); BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(ba)); return bufferedImage; } catch (IOException ex) { ex.printStackTrace(); } return null; }
Bước 3: Cuối cùng hiển thị máy ảnh lên màn hình, toàn bộ mã nguồn giúp hiển thị hình ảnh sử dụng OpenCV trong Java như sau
package com.teamvietdev.viewvideo; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.videoio.VideoCapture; /** * * @author TVD */ public class JavaViewVideo extends JFrame { private JPanel contentPane; private VideoCapture cap; public JavaViewVideo() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(0, 0, 645, 510); setResizable(false); setLocationRelativeTo(null); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(0, 0, 0, 0)); setContentPane(contentPane); contentPane.setLayout(null); System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // System.load("C:\\OpenCV\\build\\java\\x64\\opencv_java341.dll"); cap = new VideoCapture(); cap.open(0); new MyThread().start(); } private static BufferedImage matToBufferedImage(Mat matrix) { try { MatOfByte mob = new MatOfByte(); Imgcodecs.imencode(".jpg", matrix, mob); byte ba[] = mob.toArray(); BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(ba)); return bufferedImage; } catch (IOException ex) { ex.printStackTrace(); } return null; } @Override public void paint(Graphics g) { g = contentPane.getGraphics(); Mat matrix = new Mat(); cap.read(matrix); g.drawImage(matToBufferedImage(matrix), 0, 0, this); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { JavaViewVideo frame = new JavaViewVideo(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } class MyThread extends Thread { @Override public void run() { for (;;) { try { repaint(); Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Kết quả sau khi chạy đoạn mã chương trình trên:
<img>
Xem thêm:
Cài đặt OpenCV trên môi trường Windows
Khởi chạy ứng dụng OpenCV đầu tiên
Hiển thị hình ảnh sử dụng OpenCV trong Java
Lời kết: Bạn vừa theo dõi phần hướng dẫn hiển thị máy ảnh sử dụng OpenCV, ở các bài viết kế tiếp chúng ta sẽ tìm hiểu thêm như cách hiển thị video sử dụng OpenCV, nhận dạng khuôn mặt sử dụng OpenCV… được chia sẻ miễn phí tại Team Việt Dev trong chuyên mục OpenCV.
(Tác giả: Team Việt Dev)