Hiển thị máy ảnh sử dụng OpenCV trong Java

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)

Bình luận