You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MpPreview/app/src/main/java/com/xypower/mppreview/HdrMergeExample.java

124 lines
4.2 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//package com.xypower.mppreview;
//
//import static org.opencv.photo.Photo.createCalibrateDebevec;
//
//import org.opencv.android.OpenCVLoader;
//import org.opencv.core.Core;
//import org.opencv.core.CvType;
//import org.opencv.core.Mat;
//import org.opencv.core.MatOfFloat;
//import org.opencv.core.Scalar;
//import org.opencv.imgcodecs.Imgcodecs;
//import org.opencv.photo.CalibrateDebevec;
//import org.opencv.photo.Photo;
//
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//
//public class HdrMergeExample {
//
// static {
// if (!OpenCVLoader.initDebug()) {
// // Handle initialization error
// }
// }
//
//// public Mat mergeHdrFrames(List<Mat> frames) {
//// Mat hdrImage = new Mat();
//// MatOfFloat response = new MatOfFloat();
////
//// // 假设frames是一个包含多个图像矩阵的列表
//// // 这里使用第一个图像作为基础,然后逐个调整其它图像的曝光
//// Mat baseFrame = frames.get(0);
//// for (int i = 1; i < frames.size(); i++) {
//// Mat frame = frames.get(i);
//// ExposureCompensator.create(ExposureCompensator.GAIN).apply(i, baseFrame.clone(), frame, response);
//// baseFrame.convertTo(baseFrame, -1, (float) Math.exp(-response.get(0, 0)), 0);
//// frame.convertTo(frame, -1, 1, 0);
//// Core.add(baseFrame, frame, baseFrame);
//// }
////
//// // 对结果进行归一化处理显示时转换为8位
//// Core.normalize(baseFrame, hdrImage, 0, 255, Core.NORM_MINMAX, CvType.CV_8UC1);
////
//// // 清理资源
//// response.release();
//// for (Mat frame : frames) {
//// frame.release();
//// }
////
//// return hdrImage;
//// }
// public Mat mergeHdrFrames(List<Mat> hdrFrames, float gamma) {
// // 假设所有帧尺寸相同
// Mat hdrImage = new Mat();
// Photo.createHdrMergeMertens(hdrFrames, hdrImage);
// Photo.createMergeDebevec(hdrFrames, hdrImage);
//
// // 应用伽马校正(可选)
// Core.pow(hdrImage, new Scalar(1d / gamma), hdrImage);
//
// // 归一化到[0, 255]
// Core.normalize(hdrImage, hdrImage, 0, 255, Core.NORM_MINMAX, CvType.CV_8UC1);
//
// return hdrImage;
// }
// // 示例使用方法
// public void runHdrMerge(String[] imagePaths) {
// List<Mat> frames = new ArrayList<>();
// for (String imagePath : imagePaths) {
// Mat frame = Imgcodecs.imread(imagePath, Imgcodecs.IMREAD_COLOR);
// if (frame.empty()) {
// // 图像加载失败处理
// }
// frames.add(frame);
// }
//
// Mat hdrImage = mergeHdrFrames(frames);
//
// // 保存或显示HDR图像
// Imgcodecs.imwrite("/path/to/save/hdr_image.jpg", hdrImage);
//
// // 清理资源
// hdrImage.release();
// }
//
//
// public Mat mergeRawImages(Mat[] images) {
// Mat mergedImage = new Mat();
// Core.merge(Arrays.asList(images), mergedImage);
// return mergedImage;
// }
//
// public Mat[] splitRawImages(Mat images) {
//
// // Obtain Camera Response Function (CRF) 提取相机响应函数
//// cout << "Calculating Camera Response Function (CRF) ... " << endl;
// Mat responseDebevec;
// CalibrateDebevec calibrateDebevec1 = createCalibrateDebevec();
// calibrateDebevec1.process(images, responseDebevec, times);
//
//
// Mat[] channels = new Mat[3];
// Core.split(image, Arrays.asList(channels));
// return channels;
// }
//
// public Mat applyHDR(Mat[] images) {
// Mat hdrImage = new Mat();
// // 假设所有图片都已经预先调整到相同的曝光度
// // 这里可以根据实际情况调整曝光度
// for (Mat image : images) {
// // 这里的1表示将图片增加相同的曝光度0表示减少
// // 根据需要调整增加的曝光度的强度
// ExposureCompensator.apply(1, image, hdrImage);
// }
// return hdrImage;
// }
//
// public void saveMergedImage(Mat mergedImage, String path) {
// Imgcodecs.imwrite(path, mergedImage);
// }
//
//}