什么是一个基于Java的应用程序捕获从使用的实时视频设备的图像的最佳方法是什么?(What is t

2019-06-17 12:18发布

我期待到对于某些情况下半实时检测的图像处理问题。 我的目标是让视频直播如约到达Motion JPEG格式在我的Java代码框架弄好了

我熟悉Java媒体框架和可悲的是,我认为我们可以认为一个有效死API。 我也熟悉轴盒和,虽然我很喜欢他们的解决方案,我将不胜感激对我感兴趣的特定点的任何重要的反馈意见。

这是我如何定义“最佳”这个讨论的目的:

  • 延迟 - 如果我使用这个控制视频流的相机,我想如果可能的话让我的往返时延小于100毫秒。 这是测量我的控制输入时,我看到了明显的变化的时间之间的时间。 稍后编辑了一段时间:另一件事要记住的是,摄像机控制可能是手动和自动的组合(事件触发)。 我们需要看到那些照片向右走,即使优质饲料分别存档。
  • 成本 - 自由/开源比不自由要好。
  • 可调节的编解码器参数 - 我需要能够调整某些情况下编解码器。 有时,一个高速低分辨率流实际上是更容易处理。
  • “整合”与Java - 多大的麻烦是它钩住这个解决我的代码? 我在发送数据包通过套接字? 击中网址吗? 安装的Direct3D / JNI的组合?
  • 在Windows / Linux的/两? - 因为我要传递给OS的几种口味,但有可能是一个解决方案是最佳的一个,但不是其他我宁愿一个操作系统无关的解决方案。

注:我知道其他图像/视频采集编解码器,这是不是这个问题的重点。 我特别感兴趣,流式API(如MPEG4)由于帧精度的损失。 但是,如果有我的问题解决方案,提供另一种帧精确的数据流,请插入内容。

跟进这个问题:在这一点上,我强烈地倾向于购买家电如Axis视频编码器 ,而不是试图捕捉视频软件或PC上直接。 但是,如果有人有替代品,我很乐意听到他们的声音。

Answer 1:

这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:

我认为这将满足您的要求。



Answer 2:

FMJ绝对可以捕捉视频并把它变成MJPEG帧。



Answer 3:

关于JMF的死湖,你是知道的FMJ实施 ? 我不知道是否有资格作为“最佳”的解决方案,但它可能是值得加入了讨论。



Answer 4:

下面显示的使用非常简单的实现张建东框架 。 使用马文,你可以轻松地添加实时视频处理。

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);
        }
    }
}

另一个例子申请实时视频处理多个算法。



Answer 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;
    }
}


Answer 6:

你曾经看着Processing.org ? 它基本上是用于开发“艺术气息”的应用和物理计算平台的简化应用程序的框架,但它是基于Java和您可以向下挖下的“真实”的Java。

它浮现在脑海的原因是,有几个视频库,它们基本上是Java组件进行处理(至少我认为他们是-该网站拥有所有你可能需要的技术信息)。 有一个教程上使用处理库和工具在Eclipse IDE中。 也有许多例子在视频采集和处理。

即使你不能直接使用的库,处理是工作了算法一种伟大的语言/环境。 有图像和视频捕捉和实时处理有几个很好的例子。



文章来源: What is the best method to capture images from a live video device for use by a Java-based application?