Каков наилучший способ захвата изображений с живого видеоустройства для использования Java-приложениями?

Я рассматриваю проблему обработки изображений для обнаружения в реальном времени определенных ситуаций в режиме реального времени. Моя цель состоит в том, чтобы видео в реальном времени прибыло как кадры Motion JPEG в моем Java-коде.

Я знаком с Java Media Framework и, к сожалению, я думаю, что мы можем считать, что это действительно мертвый API. Я также знаком с коробками Axis, и, хотя мне очень нравится их решение, я был бы признателен за любые критические отзывы о моих конкретных аспектах.

Вот как я определяю «лучшее» для этой дискуссии:

  • Задержка – если я контролирую камеру с использованием этого видеоstreamа, я бы хотел, если бы это было возможно, поддерживать латентность в оба конца менее чем на 100 миллисекунд. Это измеряется как время между моим управляющим входом и временем, когда я вижу видимое изменение. EDIT через некоторое время: еще одна вещь, о которой нужно помнить, заключается в том, что управление камерой, вероятно, будет комбинацией ручного и автоматического (триггеры событий). Нам нужно сразу увидеть эти снимки, даже если высококачественный фид архивируется отдельно.
  • Без затрат / с открытым исходным кодом лучше, чем не бесплатно.
  • Регулируемые параметры кодека – мне нужно иметь возможность настраивать кодек для определенных ситуаций. Иногда stream с быстрым streamом с низким разрешением фактически легче обрабатывать.
  • «Интеграция» с Java – насколько сложно перехватывать это решение для моего кода? Я отправляю пакеты через сокет? Удалять URL-адреса? Установка комбинаций Direct3D / JNI?
  • Windows / Linux / оба? – Я предпочел бы агностическое решение операционной системы, потому что мне нужно доставить несколько вариантов ОС, но может быть решение, оптимальное для одного, но не для другого.

ПРИМЕЧАНИЕ. Я знаю о других кодеках видео / видеозахвата, и это не относится к этому вопросу. Я специально не интересуюсь streamовыми API (например, MPEG4) из-за потери точности кадров. Однако, если есть решение моего вопроса, который передает другой stream данных с точностью до кадров, пожалуйста, включите звук.

Последующие действия по этому вопросу: на данный момент я сильно склонен покупать такие устройства, как видеокодеры Axis, вместо того, чтобы пытаться напрямую захватить видео в программном обеспечении или на ПК. Однако, если у кого-то есть альтернативы, я бы хотел их услышать.

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

КОД:

import com.googlecode.javacv.OpenCVFrameGrabber; import com.googlecode.javacv.cpp.opencv_core.IplImage; import static com.googlecode.javacv.cpp.opencv_highgui.*; public class CaptureImage { private static void captureFrame() { // 0-default camera, 1 - next...so on final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); try { grabber.start(); IplImage img = grabber.grab(); if (img != null) { cvSaveImage("capture.jpg", img); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { captureFrame(); } } 

Существует также сообщение о просмотре видео в реальном времени с камеры. И настройка для JavaCV:

Я думаю, это соответствует вашим требованиям.

FMJ может определенно захватить видео и превратить его в frameworks MJPEG.

Что касается мертвости JMF, знаете ли вы о реализации FMJ ? Я не знаю, квалифицируется ли это как «лучшее» решение, но, вероятно, стоит добавить к обсуждению.

Ниже показана очень простая реализация с использованием Marvin Framework . Используя Marvin, вы можете легко обрабатывать видео в реальном времени.

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

Другой пример применения нескольких алгоритмов обработки видео в реальном времени.

Вы когда-нибудь смотрели сайт Processing.org ? Это в основном упрощенная структура приложений для разработки «искусных» приложений и физических вычислительных платформ, но она основана на Java, и вы можете прикопаться к «реальной» Java под ней.

Причина, по которой им приходило в голову, состоит в том, что для обработки есть несколько видео- библиотек, которые в основном являются компонентами Java (по крайней мере, я думаю, что они есть – на сайте есть вся техническая информация, которая вам может понадобиться). Существует руководство по использованию библиотек и инструментов обработки в Eclipse IDE. Существует также множество примеров захвата и обработки видео.

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

Это моя реализация JavaCV с высоким разрешением видео и отсутствие заметного снижения частоты кадров, чем другие решения (только когда моя веб-камера переориентируется, я заметил небольшое снижение, хотя бы на мгновение).

 import java.awt.image.BufferedImage; import java.io.File; import javax.swing.JFrame; import com.googlecode.javacv.CanvasFrame; import com.googlecode.javacv.OpenCVFrameGrabber; import com.googlecode.javacv.OpenCVFrameRecorder; import com.googlecode.javacv.cpp.opencv_core.IplImage; public class Webcam implements Runnable { IplImage image; static CanvasFrame frame = new CanvasFrame("Web Cam"); public static boolean running = false; public Webcam() { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void run() { try { grabber.setImageWidth(800); grabber.setImageHeight(600); grabber.start(); while (running) { IplImage cvimg = grabber.grab(); BufferedImage image; if (cvimg != null) { // opencv_core.cvFlip(cvimg, cvimg, 1); // mirror // show image on window image = cvimg.getBufferedImage(); frame.showImage(image); } } grabber.stop(); frame.dispose(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String... args) { Webcam webcam = new Webcam(); webcam.start(); } public void start() { new Thread(this).start(); running = true; } public void stop() { running = false; } } 
  • Правильный способ утилиты Image / Bitmap и PictureBox
  • Формула для определения яркости цвета RGB
  • Изменение размера изображения в Markdown
  • jQuery загрузка изображений с полным обратным вызовом
  • Странная проблема с памятью при загрузке изображения в объект Bitmap
  • Image.Save (..) генерирует исключение GDI +, поскольку stream памяти закрыт
  • Как захватить изображение из пользовательского CameraView в Android?
  • Как сделать это преобразование изображения?
  • R - изображение матрицы пикселей?
  • Как изменить изображение от декартовых координат до полярных координат в Matlab?
  • Android: как повернуть bitmap по центральной точке
  • Давайте будем гением компьютера.