📜  在Java中使用 OpenCV 从系统相机拍摄快照

📅  最后修改于: 2022-05-13 01:55:00.256000             🧑  作者: Mango

在Java中使用 OpenCV 从系统相机拍摄快照

Java中的 OpenCV 库包含一个名为“ VideoCapture”的类,它提供了一个称为 read(预定义)的方法来从网络摄像头扫描图片。 Mat 对象在 read 方法中作为参数传递。

概念:

  1. 'javax.swing' 包
  2. 抽象窗口工具包 (AWT)

在深入研究过程和实现部分之前,让我们简要讨论它们。

  • 使用'javax.swing'包是因为该包为Java Swing API提供了JButton、JTextArea、JCheckbox、JMenu等类。这里涉及的Java概念是Swing类和抽象窗口工具包,如下所述:
    • javax.swing.ImageIcon :类 ImageIcon 是从图像绘制图标的 Icon 接口的实现。
    • javax.swing.Jframe :类 JFrame 是一种容器类型,它继承了Java. JFrame 的工作方式类似于主窗口,其中添加了标签、按钮、文本字段等组件以创建 GUI。
    • javax.swing.JLabel :类 JLabel 用于显示短字符串或图像 icon.x
  • 抽象窗口工具包 (AWT) 是用于创建图形用户界面的Java包。 AWT 功能包括:
    • 一组本机界面组件。
    • 一个健壮的事件处理模型。
    • 图形和成像工具,包括形状、颜色和字体类。
    • 布局管理器,用于不依赖于特定窗口大小或屏幕分辨率的灵活窗口布局。
    • 数据传输类,用于通过本机平台剪贴板进行剪切和粘贴。

过程:在 OpenCV 中在图像上绘制几何形状的步骤

  1. 创建一个项目并添加一个 OpenCV 库。
  2. 创建包
  3. 创建一个类
  4. 创建一个名为“images”的文件夹来保存捕获的图像。
  5. 将所需的Java程序写入Java文件。

实现:在Java文件中编写如下Java程序,从系统摄像头获取快照。

例子

Java
// Java Program to take a Snapshot from System Camera
// using OpenCV
  
// Importing openCV modules
package com.opencvcamera;
// importing swing and awt classes
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// Importing date class of sql package
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
// Importing VideoCapture class
// This class is responsible for taking screenshot
import org.opencv.videoio.VideoCapture;
  
// Class - Swing Class
public class Camera extends JFrame {
  
    // Camera screen
    private JLabel cameraScreen;
  
    // Button for image capture
    private JButton btnCapture;
  
    // Start camera
    private VideoCapture capture;
  
    // Store image as 2D matrix
    private Mat image;
  
    private boolean clicked = false;
  
    public Camera()
    {
  
        // Designing UI
        setLayout(null);
  
        cameraScreen = new JLabel();
        cameraScreen.setBounds(0, 0, 640, 480);
        add(cameraScreen);
  
        btnCapture = new JButton("capture");
        btnCapture.setBounds(300, 480, 80, 40);
        add(btnCapture);
  
        btnCapture.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
  
                clicked = true;
            }
        });
  
        setSize(new Dimension(640, 560));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
  
    // Creating a camera
    public void startCamera()
    {
        capture = new VideoCapture(0);
        image = new Mat();
        byte[] imageData;
  
        ImageIcon icon;
        while (true) {
            // read image to matrix
            capture.read(image);
  
            // convert matrix to byte
            final MatOfByte buf = new MatOfByte();
            Imgcodecs.imencode(".jpg", image, buf);
  
            imageData = buf.toArray();
  
            // Add to JLabel
            icon = new ImageIcon(imageData);
            cameraScreen.setIcon(icon);
  
            // Capture and save to file
            if (clicked) {
                // prompt for enter image name
                String name = JOptionPane.showInputDialog(
                    this, "Enter image name");
                if (name == null) {
                    name = new SimpleDateFormat(
                               "yyyy-mm-dd-hh-mm-ss")
                               .format(new Date(
                                   HEIGHT, WIDTH, getX()));
                }
  
                // Write to file
                Imgcodecs.imwrite("images/" + name + ".jpg",
                                  image);
  
                clicked = false;
            }
        }
    }
  
    // Main driver method
    public static void main(String[] args)
    {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        EventQueue.invokeLater(new Runnable() {
            // Overriding existing run() method
            @Override public void run()
            {
                final Camera camera = new Camera();
  
                // Start camera in thread
                new Thread(new Runnable() {
                    @Override public void run()
                    {
                        camera.startCamera();
                    }
                }).start();
            }
        });
    }
}


输出: