Перейти к основному содержимому

Захват изображения с веб-камеры в Java

· 4 мин. чтения

1. Обзор

Обычно Java не обеспечивает легкий доступ к компьютерному оборудованию. Вот почему нам может быть сложно получить доступ к веб-камере с помощью Java.

В этом руководстве мы рассмотрим несколько библиотек Java, которые позволяют нам захватывать изображения с помощью доступа к веб-камере.

2. JavaCV

Сначала мы рассмотрим библиотеку javacv . Это Java - реализация Bytedeco библиотеки компьютерного зрения OpenCV .

Давайте добавим последнюю зависимость Maven от javacv-платформы в наш pom.xml :

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

Точно так же при использовании Gradle мы можем добавить зависимость от платформы javacv в файле build.gradle:

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 для преобразования захваченного кадра в изображение. Также сохраним изображение с помощью метода cvSaveImage класса opencv_imgcodecs :

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>

Или мы можем добавить захват веб-камеры в build.gradle для проекта 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, мы добавим зависимость marvin в файл build.gradle :

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

Теперь, когда настройка готова, давайте воспользуемся классом MarvinJavaCVAdapter для подключения к веб-камере по умолчанию, указав 0 в качестве номера устройства :

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

Далее мы можем использовать метод getFrame для захвата кадра, а затем сохраним изображение с помощью метода saveImage класса MarvinImageIO :

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, которая обеспечивает реализацию проекта OpenCV на языке Java. Затем мы увидели пример реализации библиотеки захвата веб-камеры для захвата изображений с помощью веб-камеры. Наконец, мы рассмотрели простые примеры захвата изображений с использованием фреймворка Marvin.

Как обычно, все реализации кода доступны на GitHub .