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 库建议解决方案)
答案 0 :(得分:2)
查看OpenCV 2.4.8
。 VideoCapture
API已扩展为public VideoCapture(String filename)
方法。
问题仍然是为什么这个功能实施得太晚了。
如果出于某种原因无法使用最新版本的OpenCV,您有以下几种选择:
使用标记为公共
HACKY ONE:使用公共VideoCapture(String)
构造函数制作VideoCapture类的副本(或扩展原始类并使用反射)。然后通过使用C ++ OpenCV API创建自己的DLL来支持本机方法private static native long n_VideoCapture(java.lang.String filename)
。 (的测试强>!)
答案 1 :(得分:1)
我遇到了同样的问题,这对我有用:
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