如何在 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.8
。 VideoCapture
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.dll
从opencv\build\x64\vc11\bin
复制到
opencv\build\java\x64
请注意 64
和 .dll
可能因操作系统而异,它们适用于 Windows x64
【讨论】:
以上是关于如何在 Java 中使用 openCV 的 VideoCapture 方法打开和处理 .mpeg 或 .avi 等视频文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenCV (python) 时如何隐藏/禁用 ffmpeg 错误?
使用Python+Opencv从摄像头逐帧读取图片保存在本地
如何在 Java 中使用 openCV 的 VideoCapture 方法打开和处理 .mpeg 或 .avi 等视频文件