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 上获得。