以下是一个使用Java和OpenCV处理带有alpha通道的MOV视频并保存带有alpha通道的PNG图片的工具类示例:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfInt;
import org.opencv.core.MatOfInt4;
import org.opencv.core.Size;
import org.opencv.core.CvType;
import org.opencv.core.CvType.CV_8UC4;
import org.opencv.core.CvType.CV_8UC3;
import org.opencv.core.CvType.CV_8UC1;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.TermCriteria;
import org.opencv.core.CvException;
import org.opencv.core.CvType;
import org.opencv.core.CvType.*;
import org.opencv.core.CvType.CvType.*;
import org.opencv.core.CvType.*;
import org.opencv.core.Rect;
import org.opencv.core.Size;
import org.opencv.core.TermCriteria;
import org.opencv.highgui.HighGui;
import org.opencv.highgui.VideoCapture;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;

public class AlphaVideoProcessor {
    private VideoCapture videoCapture;
    private int frameWidth;
    private int frameHeight;

    public AlphaVideoProcessor(String videoFilePath) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        videoCapture = new VideoCapture();
        videoCapture.open(videoFilePath);
        frameWidth = (int) videoCapture.get(3);
        frameHeight = (int) videoCapture.get(4);
    }

    public void processVideo(String outputFolderPath) {
        Mat frame = new Mat();
        int frameCount = 0;
        
        while (videoCapture.read(frame)) {
            Mat alphaChannel = extractAlphaChannel(frame);
            saveAlphaAsPNG(alphaChannel, outputFolderPath, frameCount);
            frameCount++;
        }
        
        videoCapture.release();
    }
    
    private Mat extractAlphaChannel(Mat frame) {
        Mat rgbaImage = new Mat();
        Imgproc.cvtColor(frame, rgbaImage, Imgproc.COLOR_BGR2RGBA);
        
        Mat alphaChannel = new Mat(rgbaImage.size(), CvType.CV_8UC1);
        ArrayList<Mat> rgbaChannels = new ArrayList<>();
        Core.split(rgbaImage, rgbaChannels);
        
        Mat alpha = rgbaChannels.get(3);
        alpha.copyTo(alphaChannel);
        
        return alphaChannel;
    }
    
    private void saveAlphaAsPNG(Mat alphaChannel, String outputFolderPath, int frameCount) {
        MatOfByte matOfByte = new MatOfByte();
        Imgcodecs.imencode(".png", alphaChannel, matOfByte);
        
        String outputPath = outputFolderPath + "/frame_" + frameCount + ".png";
        byte[] byteArray = matOfByte.toArray();
        
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(outputPath);
            fileOutputStream.write(byteArray);
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String videoFilePath = "path/to/video.mov";
        String outputFolderPath = "path/to/output";
        
        AlphaVideoProcessor videoProcessor = new AlphaVideoProcessor(videoFilePath);
        videoProcessor.processVideo(outputFolderPath);
    }
}

要使用此工具类,请确保已正确安装OpenCV,并将视频文件的路径和输出文件夹的路径替换为适当的路径。然后,调用processVideo方法以开始处理视频。每一帧的alpha通道将被提取并保存为PNG图像

使用Java OpenCV 处理带有 alpha 通道的mov视频 转换为 Frame类型 并保存带有 alpha 通道的png图片到本地 给我一个工具类

原文地址: http://www.cveoy.top/t/topic/inHy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录