如何在 Java 中使用 openCV 的 VideoCapture 方法打开和处理 .mpeg 或 .avi 等视频文件

Posted

技术标签:

【中文标题】如何在 Java 中使用 openCV 的 VideoCapture 方法打开和处理 .mpeg 或 .avi 等视频文件【英文标题】:How to open and process a video file like .mpeg or .avi using openCV's VideoCapture method in Java 【发布时间】:2013-09-24 19:33:01 【问题描述】:
    import org.opencv.core.Core;        
    import org.opencv.core.Mat;        
    import org.opencv.core.Size;        
    import org.opencv.highgui.Highgui;        
    import org.opencv.highgui.VideoCapture;        
    import org.opencv.imgproc.Imgproc;        

    public class Video        
            
        public static void main(String[] args)        
                
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);        

    VideoCapture cap = new VideoCapture(0);

    cap.open(1);

    if(!cap.isOpened())
    
        System.out.println("No camera");
    

    else
    
        System.out.println("Yes. Camera");
    

    Mat frame = new Mat();
    cap.retrieve(frame);

    Highgui.imwrite("me1.jpg", frame);
    Mat frameBlur = new Mat();

    Imgproc.blur(frame, frameBlur, new Size(5,5));
    Highgui.imwrite("me2-blurred.jpg", frameBlur);

    Imgproc.GaussianBlur(frame, frameBlur, new Size(25, 25), 20);
    Highgui.imwrite("me3-blurred.jpg", frameBlur);

    cap.release();
        
    

我已使用此代码打开我的相机设备并捕获 3 个不同的帧并对其进行了一些操作。但是,我无法使用 VideoCapture 的 n_open 方法打开像 .avi/.mpg/.mp4 等文件。 VideoCapture 实现中有一个方法here。但是因为它是一个私有的本地方法,所以不能使用 VideoCapture 的对象访问该方法。

有人可以帮助如何使用纯 OpenCV 2.4.6 和 Java 做到这一点 (请不要建议使用 Processing 库的解决方案)

【问题讨论】:

你试过用VideoCapture cap = new VideoCapture("C:\\Somefile.avi");打开视频文件吗?如果这不起作用,请参阅此处:***.com/questions/8414947/… 【参考方案1】:

看看 OpenCV 2.4.8VideoCapture API 已扩展 public VideoCapture(String filename) 方法。 问题仍然是为什么这么晚才实施此功能。

如果由于某种原因您不能使用最新版本的 OpenCV,您有多种选择:

自己重建OpenCV,这个方法标记为public

HACKY ONE:使用公共 VideoCapture(String) 构造函数制作 VideoCapture 类的副本(或扩展原始类并使用反射播放)。然后通过使用 C++ OpenCV API 创建您自己的 DLL 来支持本机方法 private static native long n_VideoCapture(java.lang.String filename)。 (测试!)

【讨论】:

API 已更改,但我仍然无法在 2.4 中加载我的任何 .avi、.mpeg(甚至 opencv 中可用的 tree.avi,它在执行 OpenCV c 示例时会打开)。 7.你们有没有人让它成为可能?你在使用一些公开的视频吗?亲切的问候, 实际上,使用 x86_64 时它不起作用,但使用 x86 时它确实起作用。它可能与加载 ffmpeg dll 有关,但我还没有找到它到底是什么...... 没错,大多数情况下你必须交付opencv_ffmpegXXX.dll。注意正确的 32b/64b 版本并将其放在 java 库路径中的某个位置(opencv_javaXXX.dll 旁边是安全的选择)。【参考方案2】:

我遇到了同样的问题,这对我有用:

    加载ffmpeg

System.loadLibrary("opencv_ffmpeg300_64");

    打开文件:

    VideoCapture vC = new VideoCapture("res/video.mp4");

    opencv_ffmpeg300_64.dllopencv\build\x64\vc11\bin复制到 opencv\build\java\x64

请注意 64.dll 可能因操作系统而异,它们适用于 Windows x64

【讨论】:

以上是关于如何在 Java 中使用 openCV 的 VideoCapture 方法打开和处理 .mpeg 或 .avi 等视频文件的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 中使用 H.264 压缩编写视频文件

使用 OpenCV (python) 时如何隐藏/禁用 ffmpeg 错误?

使用Python+Opencv从摄像头逐帧读取图片保存在本地

如何在Java包装器中使用Opencv的分区功能

如何在 Java 中使用 openCV 的 VideoCapture 方法打开和处理 .mpeg 或 .avi 等视频文件

如何在opencv java中裁剪检测到的面部图像