我想使用java opencv从我的摄像头中保存一些帧(本例中为600)的文件(avi),但我不知道该怎么做,以下代码为我指定了avi文件,但大小为0,whatsover内没有任何帧,在目录中我也有JPEG格式的那600帧。
为此必须使用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
答案 0 :(得分:1)
您没有提到您使用的是哪个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