|
|
//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);
|
|
|
// }
|
|
|
//
|
|
|
//}
|