从实时视频设备捕获图像以供基于 Java 的应用程序使用的最佳方法是什么?

我正在研究图像处理问题,以便对某些场景进行半实时检测。我的目标是以某种方式让实时视频作为Motion JPEG帧到达我的Java代码中

我熟悉Java媒体框架,可悲的是,我认为我们可以认为这是一个有效的死API。我也熟悉安讯士盒子,虽然我真的很喜欢他们的解决方案,但我很感激对我的特定兴趣点的任何批评性反馈。

这就是我为本次讨论的目的定义“最佳”的方式:

  • 延迟 - 如果我使用此视频流控制摄像机,我希望尽可能将往返延迟保持在 100 毫秒以内。这是作为我的控件输入到我看到可见更改的时间之间的时间来衡量的。编辑一段时间后:要记住的另一件事是,相机控制可能是手动和自动(事件触发器)的组合。我们需要立即看到这些图片,即使高质量的提要是单独存档的。
  • 成本 - 免费/开源总比不免费好。
  • 可调整的编解码器参数 - 我需要能够在某些情况下调整编解码器。有时,高速低分辨率流实际上更容易处理。
  • 与Java的“集成” - 将此解决方案与我的代码挂钩有多麻烦?我是否通过套接字发送数据包?点击网址?安装 Direct3D / JNI 组合?
  • Windows / Linux / 两者兼而有之?- 我更喜欢操作系统不可知的解决方案,因为我必须提供几种操作系统,但可能有一种解决方案最适合一种,而不是另一种。

注意:我知道其他图像/视频捕获编解码器,这不是这个问题的重点。由于帧精度的损失,我对流媒体API(例如MPEG4)特别不感兴趣。但是,如果我的问题有一个解决方案可以提供另一个帧精确的数据流,请加入进来。

这个问题的后续:在这一点上,我非常倾向于购买安讯士视频编码器等设备,而不是尝试直接在软件或PC上捕获视频。但是,如果有人有替代方案,我很想听听。


答案 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的配置:

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


答案 2

FMJ绝对可以捕获视频并将其转换为MJPEG帧。


推荐