OpenCV的jar包引入和dll加载见上一篇博文:
https://mp.csdn.net/editor/html/113079124
创建类VideoTest
首先加载dll动态库,然后使用vc=new VideoCapture(0)创建一个摄像机对象,索引0表示系统中的第1个摄像机,如果有多个摄像头时下标从0开始。VideoCapture还有一个构建方法,可以传入字符串,可以传入视频文件的路径以打开视频文件。
vc.isOpened()用来判断视频源是否成功打开
下面看代码吧:
import java.net.URL;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
public class VideoTest {
public static void main(String[] args) throws Exception {
// 加载动态库
URL url = ClassLoader.getSystemResource("opencv_java451.dll");
System.load(url.getPath());
VideoCapture vc = new VideoCapture(0);
if(!vc.isOpened()) {
System.out.println("在电脑上未发现已连接的摄像头!");
return;
}
captureImage(vc);
captureVideo(vc);
}
private static void captureImage(VideoCapture vc) {
Mat image = new Mat();
vc.read(image);
Imgcodecs.imwrite("D:\\demo.jpg", image);
HighGui.imshow("显示图像", image);
HighGui.waitKey();
}
private static void captureVideo(VideoCapture vc) throws InterruptedException {
Mat image = new Mat();
vc.read(image);
VideoWriter vw = new VideoWriter();
vw.open("D:\\demo.avi", VideoWriter.fourcc('D', 'I', 'V', 'X'), 25.0, new Size(image.width(), image.height()));
System.out.println(vw.isOpened());
for(int i=0;i<50;i++) {//捕获50帧,视频长度为2秒
vc.read(image);
if(image.empty()) {
Thread.sleep(40);
continue;
}
vw.write(image);
Thread.sleep(400);//400ms捕获一次,相当于帧率为25
System.out.println("read frame "+i);
}
vw.release();
System.out.println("read finish!");
}
}
运行成功后会在D盘生成一个demo.jpg和demo.avi文件,分别是捕获的第一张照片和2秒的视频信息,如果想将视频快进或慢放,可以适当调整帧率参数和捕获图片的间隔时间以达到想要的效果