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

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

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

Вот как я определяю «лучший» для целей данного обсуждения:

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

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

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


person Bob Cross    schedule 22.09.2008    source источник


Ответы (6)


Эта реализация 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:

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

person gtiwari333    schedule 28.01.2012
comment
Интересно - есть ли данные о задержке фреймграббера? - person Bob Cross; 28.01.2012
comment
Я таких данных не рассчитывал и не находил. но вроде хорошо. В этом видео youtube.com/watch?v=r02no-zIBnI я я показываю захваченные изображения (IplImage img = grabber.grab ()) в JFrame. - person gtiwari333; 22.02.2012

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

person Community    schedule 31.12.2008

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

person Greg Mattes    schedule 30.09.2008
comment
Последнее обновление, похоже, было довольно давно: sourceforge.net/project/showfiles .php? group_id = 161490 API, который был мертв с 2007 года, вероятно, нам не поможет. В любом случае спасибо. - person Bob Cross; 20.05.2009

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

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

person Gabriel Ambrósio Archanjo    schedule 24.07.2013
comment
Это интересно - не могли бы вы рассказать о моих требованиях к задержке выше? - person Bob Cross; 24.07.2013
comment
Ссылка marvinproject.org мертва. Не могли бы вы его обновить? Похоже, вы являетесь автором этой замечательной библиотеки, так что вы можете сказать это :) - person Matthieu; 23.04.2018
comment
@Matthieu Спасибо, что сообщили об этом. - person Gabriel Ambrósio Archanjo; 23.04.2018

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

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

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

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

person CMPalmer    schedule 22.09.2008