视频去水印,但是还会模糊,有大佬看到可以指点一下。
package readimage;
import org.opencv.core.*;
import org.opencv.photo.Photo;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.Videoio;
public class VidioWatermarkRemoval {
static { System.load(Opencv.OPENCV);}
public static void main(String[] args) {
String inputVideoPath = "E:\\my\\mengbao\\2024\\1221\\1.mp4";
String outputVideoPath = "E:\\my\\mengbao\\2024\\1221\\8-copy.mp4";
// 打开视频
VideoCapture video = new VideoCapture(inputVideoPath);
if (!video.isOpened()) {
System.out.println("无法打开视频文件,请检查路径!");
return;
}
// 获取视频的属性
int frameWidth = (int) video.get(Videoio.CAP_PROP_FRAME_WIDTH);
int frameHeight = (int) video.get(Videoio.CAP_PROP_FRAME_HEIGHT);
int fps = (int) video.get(Videoio.CAP_PROP_FPS);
int fourcc = VideoWriter.fourcc('m', 'p', '4', 'v'); // 视频编码格式
// 创建视频写入器
VideoWriter writer = new VideoWriter(outputVideoPath, fourcc, fps, new Size(frameWidth, frameHeight));
if (!writer.isOpened()) {
System.out.println("无法创建输出视频,请检查路径!");
return;
}
Mat frame = new Mat();
while (video.read(frame)) {
// 1. 创建遮罩(mask)并标记水印区域
// 创建掩膜
Mat mask = new Mat(frame.size(), CvType.CV_8UC1, new Scalar(0));
//Mat mask = Mat.zeros(frame.size(), CvType.CV_8UC1); // 创建遮罩图像
Imgproc.rectangle(mask,
new Point(frame.cols() - 150, frame.rows() - 50), // 水印矩形的左上角
new Point(frame.cols(), frame.rows()), // 水印矩形的右下角
new Scalar(255), -1); // 填充矩形为白色(255)表示需要修复的区域
// 2. 去水印:使用 inpaint 修复受损区域
Mat inpaintedFrame = new Mat();
Photo.inpaint(frame, mask, inpaintedFrame, 10, Photo.INPAINT_NS);
// 3. 增强修复后的区域
// 提取去水印的区域
Rect watermarkArea = new Rect(frame.cols() - 150, frame.rows() - 50, 150, 50);
Mat roi = inpaintedFrame.submat(watermarkArea); // 获取去水印区域
// 应用锐化滤波器
Mat sharpenedRoi = new Mat();
Mat kernel = new Mat(3, 3, CvType.CV_32F);
kernel.put(0, 0, 0, -1, 0,
-1, 5, -1,
0, -1, 0); // 锐化卷积核
Imgproc.filter2D(roi, sharpenedRoi, -0, kernel);
// 将处理过的区域替换回原图像
sharpenedRoi.copyTo(inpaintedFrame.submat(watermarkArea));
// 4. 写入处理后的帧到输出视频
writer.write(inpaintedFrame);
}
// 释放资源
video.release();
writer.release();
System.out.println("视频去水印处理完成!");
}
}