视频去水印

138 阅读1分钟

视频去水印,但是还会模糊,有大佬看到可以指点一下。

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("视频去水印处理完成!");
    }
}