使用javacv读取视频文件处理并保存,但是保存的文件无法打开
读取视频,给视频添加边框,做人脸识别并加框,按帧保存视频
相关代码
public static void test2() throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception {
String path = "D:\\haarcascade_frontalface_alt.xml";
CascadeClassifier classifier = new CascadeClassifier(path);
String str = "D:\\test1.mp4";
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(str);
grabber.start();
String outputVideo = "D:\\"+ UUID.randomUUID()+ ".mp4";
File file = new File(outputVideo);
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(file.getAbsolutePath(), grabber.getImageWidth(), grabber.getImageHeight());
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.start();
// CanvasFrame canvasFrame = new CanvasFrame("Video");
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
// 边框的宽度和颜色
int borderType = Core.BORDER_CONSTANT;
int borderSize = 10; // 边框大小
try {
Frame frame;
while ((frame = grabber.grab()) != null){
Mat mat = converter.convert(frame);
Mat gray = new Mat();
// 转换为灰度图像
cvtColor(mat, gray, COLOR_BGR2GRAY);
// 加边框
Mat borderedImg = new Mat();
// opencv_core.copyMakeBorder(mat, borderedImg, borderSize,borderSize,borderSize,borderSize, borderType,Scalar.RED);
opencv_core.copyMakeBorder(mat, borderedImg, borderSize,borderSize,borderSize,borderSize, borderType);
if(classifier.empty()){
System.out.println("Classifier failed to load!");
break;
}
RectVector rectVector = new RectVector();
//识别
classifier.detectMultiScale(gray,rectVector);
for (Rect rect : rectVector.get()){
opencv_imgproc.rectangle(borderedImg, new Point(rect.x(), rect.y()),new Point(rect.x() + rect.width(), rect.y() + rect.height()), new Scalar(0,0, 0, 255));
}
//存储处理好的视频帧
Frame frame1 = converter.convert(borderedImg);
recorder.record(frame1);
// canvasFrame.showImage(frame);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (grabber != null) {
grabber.release();
grabber.stop();
}
if (recorder != null) {
recorder.release();
recorder.stop();
}
}
}
现象古-月
