1. 概述

通常,Java 不提供对计算机硬件的轻松访问。这就是为什么我们可能会发现使用 Java 访问网络摄像头很困难。

在本教程中,我们将探索一些 Java 库,它们允许我们通过访问网络摄像头来捕获图像。

2.JavaCV

首先,我们将检查 javacv 库。这是 Bytedeco对 OpenCV 计算机视觉库的 Java 实现

让我们将最新的 javacv-platform Maven 依赖项添加到 pom.xml 中:

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.5</version>
</dependency>

同样,在使用Gradle时,我们可以在 build.gradle 文件中添加 javacv-platform 依赖:

compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.5'

现在我们已准备好设置,让我们使用 OpenCVFrameGrabber 类来访问网络摄像头并捕获帧

FrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
Frame frame = grabber.grab();

在这里, 我们将设备号传递为 0 ,指向系统的默认网络摄像头 。但是,如果我们有多个可用摄像头,则可在 1 处访问第二个摄像头,在 2 处可访问第三个摄像头,依此类推。

然后,我们可以使用 OpenCVFrameConverter 将捕获的帧转换为图像。另外,我们将 使用 opencv_imgcodecs 类的 cvSaveImage 方法保存图像

OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
IplImage img = converter.convert(frame);
opencv_imgcodecs.cvSaveImage("selfie.jpg", img);

最后,我们可以使用 CanvasFrame 类来显示捕获的帧:

CanvasFrame canvas = new CanvasFrame("Web Cam");
canvas.showImage(frame);

让我们检查一个完整的解决方案,该解决方案访问网络摄像头、捕获图像、在框架中显示图像,并在两秒后自动关闭框架:

CanvasFrame canvas = new CanvasFrame("Web Cam");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

FrameGrabber grabber = new OpenCVFrameGrabber(0);
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();

grabber.start();
Frame frame = grabber.grab();

IplImage img = converter.convert(frame);
cvSaveImage("selfie.jpg", img);

canvas.showImage(frame);

Thread.sleep(2000);

canvas.dispatchEvent(new WindowEvent(canvas, WindowEvent.WINDOW_CLOSING));

3. 网络摄像头捕获

接下来,我们将研究 网络摄像头捕获 库,该库允许通过支持多个捕获框架来使用网络摄像头。

首先,让我们将最新的 网络摄像头捕获 Maven 依赖项添加到 pom.xml 中:

<dependency>
    <groupId>com.github.sarxos</groupId>
    <artifactId>webcam-capture</artifactId>
    <version>0.3.12</version>
</dependency>

或者,我们可以在 Gradle 项目的 build.gradle 中添加 网络摄像头捕获

compile group: 'com.github.sarxos', name: 'webcam-capture', version: '0.3.12'

然后,让我们编写一个简单的示例来使用 Webcam 类捕获图像:

Webcam webcam = Webcam.getDefault();
webcam.open();

BufferedImage image = webcam.getImage();

ImageIO.write(image, ImageUtils.FORMAT_JPG, new File("selfie.jpg"));

在这里,我们访问默认网络摄像头来捕获图像,然后将图像保存到文件中。

或者,我们可以使用 WebcamUtils 类来捕获图像:

WebcamUtils.capture(webcam, "selfie.jpg");

此外,我们可以 使用 WebcamPanel在框架中显示捕获的图像

Webcam webcam = Webcam.getDefault();
webcam.setViewSize(WebcamResolution.VGA.getSize());

WebcamPanel panel = new WebcamPanel(webcam);
panel.setImageSizeDisplayed(true);

JFrame window = new JFrame("Webcam");
window.add(panel);
window.setResizable(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);

在这里,我们将 VGA 设置为网络摄像头的视图大小,创建 JFrame 对象,并将 WebcamPanel 组件添加到框架中

4.马文框架

最后,我们将探索 Marvin 框架来访问网络摄像头并捕获图像。

像往常一样,我们将最新的 marvin 依赖项添加到 pom.xml 中:

<dependency>
    <groupId>com.github.downgoon</groupId>
    <artifactId>marvin</artifactId>
    <version>1.5.5</version>
</dependency>

或者,对于 Gradle 项目,我们将在 build.gradle 文件中添加 marvin 依赖项:

compile group: 'com.github.downgoon', name: 'marvin', version: '1.5.5'

现在设置已准备就绪,让我们 使用 MarvinJavaCVAdapter 类通过提供 0 作为设备编号来连接到默认网络摄像头

MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter();
videoAdapter.connect(0);

接下来,我们可以使用 getFrame 方法捕获帧,然后 使用 MarvinImageIO 类的 saveImage 方法保存图像

MarvinImage image = videoAdapter.getFrame();
MarvinImageIO.saveImage(image, "selfie.jpg");

另外,我们可以使用 MarvinImagePanel 类在框架中显示图像:

MarvinImagePanel imagePanel = new MarvinImagePanel();
imagePanel.setImage(image);

imagePanel.setSize(800, 600);
imagePanel.setVisible(true);

5. 结论

在这篇短文中,我们研究了一些可以轻松访问网络摄像头的 Java 库。

首先,我们探索了 javacv-platform 库,它提供了 OpenCV 项目的 Java 实现。然后,我们看到了 网络摄像头捕获 库的示例实现,以使用网络摄像头捕获图像。最后,我们看了一下使用 Marvin 框架捕获图像的简单示例。

与往常一样,所有代码实现都可以在 GitHub 上获得。