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 .