使用Java OpenCV 处理带有 alpha 通道的mov视频 转换为 Frame类型 并保存带有 alpha 通道的png图片到本地 给我一个工具类
以下是一个使用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图像
原文地址: http://www.cveoy.top/t/topic/inHy 著作权归作者所有。请勿转载和采集!