使用Java从网络摄像头捕获图像

2025/04/01

1. 概述

通常,Java无法轻松访问计算机硬件,这就是为什么我们可能很难使用Java访问网络摄像头。

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

2. JavaCV

首先,我们来看一下javacv库。这是BytedecoOpenCV计算机视觉库的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. webcam-capture

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

首先,让我们将最新的webcam-capture Maven依赖添加到pom.xml中:

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

或者,我们可以在Gradle项目的build.gradle中添加webcam-capture:

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框架来访问网络摄像头并捕获图像。

与往常一样,我们将最新的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库。

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

Show Disqus Comments
0 comments
Anonymous
Error: Not Found.
Markdown is supported

Be the first guy leaving a comment!

Post Directory

1. 概述
2. JavaCV
3. webcam-capture
4. Marvin框架
5. 总结
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章