java - Java OpenCV 保存视频文件
问题描述
我想使用java opencv从我的网络摄像头保存一些帧(在本例中为600)的文件(avi),但我不知道该怎么做,下面的代码给了我指定但大小为0的avi文件,里面没有任何帧,也在目录中我有 600 个 jpeg 帧。
为此使用java很重要,没有python。
Mat frame = new Mat();
VideoWriter writer = new VideoWriter("c:/opencv/vid.avi", VideoWriter.fourcc('X','2','6','4'), 30 ,frame.size(), true);
videoCapture = new VideoCapture();
videoCapture.open(0);
videoCapture.set(Videoio.CAP_PROP_FRAME_WIDTH, 1280);
videoCapture.set(Videoio.CAP_PROP_FRAME_HEIGHT, 720);
while (true){
videoCapture.read(frame);
if (!frame.empty())
break;
}
int frameNo = 0;
while (frameNo < 600){
videoCapture.read(frame);
writer.write(frame);
Imgcodecs imageCodecs = new Imgcodecs();
String file = "c:/opencv/i" + frameNo + ".jpg";
Imgcodecs.imwrite(file,frame);
frameNo++;
}
videoCapture.release(); // release device
解决方案
您没有提到您使用的是哪个openCV版本,我使用的是OpenCV-3.4.2
AVI 容器使用 DIVX 编解码器参考:https ://wiki.videolan.org/DivX/
我修改了一下你的代码:
Mat frame = new Mat();
VideoWriter writer = new VideoWriter("c:/opencv/vid.avi", VideoWriter.fourcc('D', 'I', 'V', 'X'), 30, new Size(videoCapture.get(Videoio.CAP_PROP_FRAME_WIDTH), videoCapture.get(Videoio.CAP_PROP_FRAME_HEIGHT)));
while(runnable)
{
if(videoCapture.grab())
{
try
{
//Decodes and returns the grabbed video frame.
videoCapture.retrieve(frame);
//encode to .jpg the frame to a MatOfByte
Imgcodecs.imencode(".jpg", frame, mem);
//read into an Image
Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
//Draw image to a Jpanel
BufferedImage buff = (BufferedImage) im;
Graphics g = jPanel1.getGraphics();
g.drawImage(buff, 0, 0, getWidth(), getHeight(), 0, 0, buff.getWidth(), buff.getHeight(), null);
//record the frame
writer.write(frame);
}
catch(Exception ex)
{
System.out.println("Error");
ex.printStackTrace();
}
}
}
videoCapture.release(); // release device
推荐阅读
- android - 以沉浸式模式显示 BottomSheetDialogFragment
- ios - 为什么在第一次关闭时不需要“self”?
- ios - 如何在 ios 应用程序中跨所有视图控制器跟踪用户位置?
- android - 工具栏内视图的 LayoutGravity 无法正常工作
- assembly - 使用循环从用户键盘读取数字的说明是什么?是否需要“标签”?
- javascript - 当我包含推荐的安全覆盖时,为什么脚本拒绝在 Google Analytics Chrome 扩展中加载?
- c - 如何获得不重新链接的多可执行makefile
- ios - 如何使用我的应用程序中使用的自定义颜色轻松支持明暗模式?
- java - 使count查询分页不+1条sql语句
- reactjs - 用更多数据调用 setState 还是用更少数据多次调用 setState 更有效?