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

Как я могу непрерывно захватывать изображения с веб-камеры?

Я хочу экспериментировать с распознаванием объектов (возможно, используя java media framework).

Я думал о создании двух streamов

один stream:

  • Узел 1: захватить живое изображение
  • Узел 2: сохранить изображение как “1.jpg”
  • Узел 3: подождите 5 секунд
  • Узел 4: повторить …

другие темы:

  • Узел 1: дождитесь захвата изображения
  • Узел 2: использование «1.jpg» получает цвета от каждого пикселя
  • Узел 3: сохранение данных в массивах
  • Узел 4: повторить …

Эта реализация JavaCV работает отлично.

Код:

import org.bytedeco.javacv.*; import static org.bytedeco.javacpp.opencv_core.IplImage; import static org.bytedeco.javacpp.opencv_core.cvFlip; import static org.bytedeco.javacpp.opencv_imgcodecs.cvSaveImage; /** * Created by gtiwari on 1/3/2017. */ public class Test implements Runnable { final int INTERVAL = 100;///you may use interval CanvasFrame canvas = new CanvasFrame("Web Cam"); public Test() { canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); } public void run() { FrameGrabber grabber = new VideoInputFrameGrabber(0); // 1 for next camera OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage(); IplImage img; int i = 0; try { grabber.start(); while (true) { Frame frame = grabber.grab(); img = converter.convert(frame); //the grabbed frame will be flipped, re-flip to make it right cvFlip(img, img, 1);// lr = 90_degrees_steps_anti_clockwise //save cvSaveImage((i++) + "-aa.jpg", img); canvas.showImage(converter.convert(img)); Thread.sleep(INTERVAL); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Test gs = new Test(); Thread th = new Thread(gs); th.start(); } } 

Существует также сообщение о конфигурации для JavaCV

Вы можете изменять коды и сохранять изображения в регулярном интервале и выполнять оставшуюся обработку.

Некоторое время назад я создал общую библиотеку Java, которая может использоваться для съемки с помощью веб-камеры ПК. API очень простой, но не чрезмерный, может работать автономно, но также поддерживает дополнительные драйверы для веб-камер, такие как OpenIMAJ, JMF, FMJ, LTI-CIVIL и т. Д. И некоторые IP-камеры.

Ссылка на проект: https://github.com/sarxos/webcam-capture

Пример кода (сфотографировать и сохранить в test.jpg):

 Webcam webcam = Webcam.getDefault(); webcam.open(); BufferedImage image = webcam.getImage(); ImageIO.write(image, "JPG", new File("test.jpg")); 

Он также доступен в Центральном репозитории Maven или в виде отдельного ZIP-файла, который включает все необходимые зависимости и сторонние JAR-файлы.

JMyron очень прост для использования. http://webcamxtra.sourceforge.net/

 myron = new JMyron(); myron.start(imgw, imgh); myron.update(); int[] img = myron.image(); 

Вот аналогичный вопрос с некоторыми – но неприемлемыми – ответами. Один из них упоминает FMJ как альтернативу JAF для Java.

Этот вид отключается от ответа gt_ebuddy с использованием JavaCV, но мой видеовыход имеет гораздо более высокое качество, чем его ответ. Я также добавил некоторые другие случайные улучшения (например, закрытие программы при нажатии ESC и CTRL + C и обеспечение закрытия ресурсов, которые программа использует правильно).

 import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.KeyStroke; import com.googlecode.javacv.CanvasFrame; import com.googlecode.javacv.OpenCVFrameGrabber; import com.googlecode.javacv.cpp.opencv_core.IplImage; public class HighRes extends JComponent implements Runnable { private static final long serialVersionUID = 1L; private static CanvasFrame frame = new CanvasFrame("Web Cam"); private static boolean running = false; private static int frameWidth = 800; private static int frameHeight = 600; private static OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); private static BufferedImage bufImg; public HighRes() { // setup key bindings ActionMap actionMap = frame.getRootPane().getActionMap(); InputMap inputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); for (Keys direction : Keys.values()) { actionMap.put(direction.getText(), new KeyBinding(direction.getText())); inputMap.put(direction.getKeyStroke(), direction.getText()); } frame.getRootPane().setActionMap(actionMap); frame.getRootPane().setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap); // setup window listener for close action frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { stop(); } }); } public static void main(String... args) { HighRes webcam = new HighRes(); webcam.start(); } @Override public void run() { try { grabber.setImageWidth(frameWidth); grabber.setImageHeight(frameHeight); grabber.start(); while (running) { final IplImage cvimg = grabber.grab(); if (cvimg != null) { // cvFlip(cvimg, cvimg, 1); // mirror // show image on window bufImg = cvimg.getBufferedImage(); frame.showImage(bufImg); } } grabber.stop(); grabber.release(); frame.dispose(); } catch (Exception e) { e.printStackTrace(); } } public void start() { new Thread(this).start(); running = true; } public void stop() { running = false; } private class KeyBinding extends AbstractAction { private static final long serialVersionUID = 1L; public KeyBinding(String text) { super(text); putValue(ACTION_COMMAND_KEY, text); } @Override public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); if (action.equals(Keys.ESCAPE.toString()) || action.equals(Keys.CTRLC.toString())) stop(); else System.out.println("Key Binding: " + action); } } } enum Keys { ESCAPE("Escape", KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)), CTRLC("Control-C", KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK)), UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)), DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)), LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)), RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)); private String text; private KeyStroke keyStroke; Keys(String text, KeyStroke keyStroke) { this.text = text; this.keyStroke = keyStroke; } public String getText() { return text; } public KeyStroke getKeyStroke() { return keyStroke; } @Override public String toString() { return text; } } 

Вы также можете попробовать Java Webcam SDK . Демо-апплет SDK доступен по ссылке .

Я использовал JMF в приложении для видеоконференций, и он хорошо работал на двух ноутбуках: один со встроенной веб-камерой и другой со старой веб-камерой USB. Для этого требуется, чтобы JMF устанавливался и настраивался заранее, но как только вы закончите, вы можете легко получить доступ к оборудованию через код Java.

Вы можете попробовать Marvin Framework . Он обеспечивает интерфейс для работы с камерами. Кроме того, он также предоставляет набор функций обработки видео в реальном времени, таких как отслеживание объектов и фильтрация.

Взглянуть!

Демоверсия видео в реальном времени:
http://www.youtube.com/watch?v=D5mBt0kRYvk

Вы можете использовать источник ниже. Просто сохраните кадр с помощью MarvinImageIO.saveImage () каждые 5 секунд.

Демо-версия веб-камеры:

 public class SimpleVideoTest extends JFrame implements Runnable{ private MarvinVideoInterface videoAdapter; private MarvinImage image; private MarvinImagePanel videoPanel; public SimpleVideoTest(){ super("Simple Video Test"); videoAdapter = new MarvinJavaCVAdapter(); videoAdapter.connect(0); videoPanel = new MarvinImagePanel(); add(videoPanel); new Thread(this).start(); setSize(800,600); setVisible(true); } @Override public void run() { while(true){ // Request a video frame and set into the VideoPanel image = videoAdapter.getFrame(); videoPanel.setImage(image); } } public static void main(String[] args) { SimpleVideoTest t = new SimpleVideoTest(); t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } в public class SimpleVideoTest extends JFrame implements Runnable{ private MarvinVideoInterface videoAdapter; private MarvinImage image; private MarvinImagePanel videoPanel; public SimpleVideoTest(){ super("Simple Video Test"); videoAdapter = new MarvinJavaCVAdapter(); videoAdapter.connect(0); videoPanel = new MarvinImagePanel(); add(videoPanel); new Thread(this).start(); setSize(800,600); setVisible(true); } @Override public void run() { while(true){ // Request a video frame and set into the VideoPanel image = videoAdapter.getFrame(); videoPanel.setImage(image); } } public static void main(String[] args) { SimpleVideoTest t = new SimpleVideoTest(); t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

Для тех, кто просто хочет сделать одну фотографию:

WebcamPicture.java

 public class WebcamPicture { public static void main(String[] args) { try{ MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter(); videoAdapter.connect(0); MarvinImage image = videoAdapter.getFrame(); MarvinImageIO.saveImage(image, "./res/webcam_picture.jpg"); } catch(MarvinVideoInterfaceException e){ e.printStackTrace(); } } } 

http://grack.com/downloads/school/enel619.10/report/java_media_framework.html

Использование проигрывателя с качелями

Игрок также может быть легко использован в приложении Swing. Следующий код создает программу захвата ТВ на основе Swing с видеоизображением, отображаемым во всем окне:

 import javax.media.*; import javax.swing.*; import java.awt.*; import java.net.*; import java.awt.event.*; import javax.swing.event.*; public class JMFTest extends JFrame { Player _player; JMFTest() { addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { _player.stop(); _player.deallocate(); _player.close(); System.exit( 0 ); } }); setExtent( 0, 0, 320, 260 ); JPanel panel = (JPanel)getContentPane(); panel.setLayout( new BorderLayout() ); String mediaFile = "vfw://1"; try { MediaLocator mlr = new MediaLocator( mediaFile ); _player = Manager.createRealizedPlayer( mlr ); if (_player.getVisualComponent() != null) panel.add("Center", _player.getVisualComponent()); if (_player.getControlPanelComponent() != null) panel.add("South", _player.getControlPanelComponent()); } catch (Exception e) { System.err.println( "Got exception " + e ); } } public static void main(String[] args) { JMFTest jmfTest = new JMFTest(); jmfTest.show(); } } 

Java обычно не любит доступ к аппаратным средствам, поэтому вам понадобится программа драйвера, как сказал goldenmean. Я сделал это на своем ноутбуке, найдя программу командной строки, которая снимает изображение. Тогда это то же самое, что объясняет goldenmean; вы запускаете программу командной строки из вашей java-программы в процедуре takepicture (), а остальная часть вашего кода работает одинаково.

За исключением части о чтении значений пикселей в массиве, вам может быть лучше, если сохранить файл в BMP, который уже почти в этом формате, а затем использовать стандартные библиотеки изображений java на нем.

Использование командной строки добавляет зависимость к вашей программе и делает ее менее переносимой, но так же была веб-камера, верно?

Я использовал Webcam Capture API … u можно скачать с этого http://webcam-capture.sarxos.pl/

  webcam = Webcam.getDefault(); webcam.open(); if (webcam.isOpen()) { //if web cam open BufferedImage image = webcam.getImage(); JLabel imageLbl = new JLabel(); imageLbl.setSize(640, 480); //show captured image imageLbl.setIcon(new ImageIcon(image)); int showConfirmDialog = JOptionPane.showConfirmDialog(null, imageLbl, "Image Viewer", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon("")); if (showConfirmDialog == JOptionPane.YES_OPTION) { JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("Save Image"); chooser.setFileFilter(new FileNameExtensionFilter("IMAGES ONLY", "png", "jpeg", "jpg")); //this file extentions are shown int showSaveDialog = chooser.showSaveDialog(this); if (showSaveDialog == 0) { //if pressed 'Save' button String filePath = chooser.getCurrentDirectory().toString().replace("\\", "/"); String fileName = chooser.getSelectedFile().getName(); //get user entered file name to save ImageIO.write(image, "PNG", new File(filePath + "/" + fileName + ".png")); } } } 

Я считаю, что приложение для веб-камеры, которое поставляется вместе с веб-камерой, или ваше собственное программное обеспечение для веб-камеры Windows, можно запускать в пакетном скрипте (сценарий Windows / dos) после включения веб-камеры (т. Е. Если требуется внешняя мощность поставка). В сценарии bacth вы можете добавить соответствующую задержку для захвата через определенный промежуток времени. И продолжайте выполнение команды захвата в цикле.

Думаю, это должно быть возможно

-ОБЪЯВЛЕНИЕ

В этом очень приятный интерфейс для обработки , который является своего рода pidgin java, предназначенным для графики. Он используется в некоторой работе по распознаванию изображений, такой как эта ссылка.

В зависимости от того, что вам нужно, вы можете загрузить библиотеку видео, которая используется там в java, или если вы просто играете с ней, вы можете получить ее с помощью самой обработки.

FMJ может это сделать, как и поддерживающая библиотека, которую он использует, LTI-CIVIL. Оба находятся на sourceforge.

Рекомендовать использовать FMJ для мультимедийного релятивированного java-приложения.

Попробуйте использовать JMyron Как использовать веб- камеру с помощью Java . Я думаю, что использование JMyron – это самый простой способ получить доступ к веб-камере с помощью java. Я попытался использовать его с 64-битным процессором, но это дало мне ошибку. Тем не менее, он работал отлично на 32-битном процессоре.

Давайте будем гением компьютера.