在Java中使用 OpenCV 从系统相机拍摄快照
Java中的 OpenCV 库包含一个名为“ VideoCapture”的类,它提供了一个称为 read(预定义)的方法来从网络摄像头扫描图片。 Mat 对象在 read 方法中作为参数传递。
概念:
- 'javax.swing' 包
- 这 抽象窗口工具包 (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 中在图像上绘制几何形状的步骤
- 创建一个项目并添加一个 OpenCV 库。
- 创建包
- 创建一个类
- 创建一个名为“images”的文件夹来保存捕获的图像。
- 将所需的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();
}
});
}
}
输出:
After a successful compilation of the program, the execution is as follows as the webcam will open up where you click on the “Capture” button and the rest image will be named. Now, click on the “OK” button to save the image. The output image will be saved in the folder which was created earlier.