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

时间:2013-09-24 19:33:02

标签: java opencv file-processing

    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 库建议解决方案)

2 个答案:

答案 0 :(得分:2)

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

如果出于某种原因无法使用最新版本的OpenCV,您有以下几种选择:

  • 使用标记为公共

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

答案 1 :(得分:1)

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

  1. 加载ffmpeg
  2. System.loadLibrary("opencv_ffmpeg300_64");

    1. 打开文件:

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

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

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