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

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

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

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

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

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

Последующий ответ на этот вопрос: на данный момент я сильно склонен покупать такие устройства, как

Ответ 1

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

CODE:

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:

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Это моя реализация 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;
    }
}

Ответ 6

Ниже показана очень простая реализация с использованием 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);
        }
    }
}

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