Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/samples/java/tutorial_code/photo/hdr_imaging/HDRImagingDemo.java
16354 views
1
import java.io.IOException;
2
import java.nio.file.Files;
3
import java.nio.file.Paths;
4
import java.util.ArrayList;
5
import java.util.List;
6
7
import org.opencv.core.Core;
8
import org.opencv.core.CvType;
9
import org.opencv.core.Mat;
10
import org.opencv.core.Scalar;
11
import org.opencv.imgcodecs.Imgcodecs;
12
import org.opencv.photo.CalibrateDebevec;
13
import org.opencv.photo.MergeDebevec;
14
import org.opencv.photo.MergeMertens;
15
import org.opencv.photo.Photo;
16
import org.opencv.photo.TonemapDurand;
17
18
class HDRImaging {
19
public void loadExposureSeq(String path, List<Mat> images, List<Float> times) {
20
path += "/";
21
22
List<String> lines;
23
try {
24
lines = Files.readAllLines(Paths.get(path + "list.txt"));
25
26
for (String line : lines) {
27
String[] splitStr = line.split("\\s+");
28
if (splitStr.length == 2) {
29
String name = splitStr[0];
30
Mat img = Imgcodecs.imread(path + name);
31
images.add(img);
32
float val = Float.parseFloat(splitStr[1]);
33
times.add(1/ val);
34
}
35
}
36
} catch (IOException e) {
37
e.printStackTrace();
38
}
39
}
40
41
public void run(String[] args) {
42
String path = args.length > 0 ? args[0] : "";
43
if (path.isEmpty()) {
44
System.out.println("Path is empty. Use the directory that contains images and exposure times.");
45
System.exit(0);
46
}
47
48
//! [Load images and exposure times]
49
List<Mat> images = new ArrayList<>();
50
List<Float> times = new ArrayList<>();
51
loadExposureSeq(path, images, times);
52
//! [Load images and exposure times]
53
54
//! [Estimate camera response]
55
Mat response = new Mat();
56
CalibrateDebevec calibrate = Photo.createCalibrateDebevec();
57
Mat matTimes = new Mat(times.size(), 1, CvType.CV_32F);
58
float[] arrayTimes = new float[(int) (matTimes.total()*matTimes.channels())];
59
for (int i = 0; i < times.size(); i++) {
60
arrayTimes[i] = times.get(i);
61
}
62
matTimes.put(0, 0, arrayTimes);
63
calibrate.process(images, response, matTimes);
64
//! [Estimate camera response]
65
66
//! [Make HDR image]
67
Mat hdr = new Mat();
68
MergeDebevec mergeDebevec = Photo.createMergeDebevec();
69
mergeDebevec.process(images, hdr, matTimes);
70
//! [Make HDR image]
71
72
//! [Tonemap HDR image]
73
Mat ldr = new Mat();
74
TonemapDurand tonemap = Photo.createTonemapDurand(2.2f, 4.0f, 1.0f, 2.0f, 2.0f);
75
tonemap.process(hdr, ldr);
76
//! [Tonemap HDR image]
77
78
//! [Perform exposure fusion]
79
Mat fusion = new Mat();
80
MergeMertens mergeMertens = Photo.createMergeMertens();
81
mergeMertens.process(images, fusion);
82
//! [Perform exposure fusion]
83
84
//! [Write results]
85
Core.multiply(fusion, new Scalar(255,255,255), fusion);
86
Core.multiply(ldr, new Scalar(255,255,255), ldr);
87
Imgcodecs.imwrite("fusion.png", fusion);
88
Imgcodecs.imwrite("ldr.png", ldr);
89
Imgcodecs.imwrite("hdr.hdr", hdr);
90
//! [Write results]
91
92
System.exit(0);
93
}
94
}
95
96
public class HDRImagingDemo {
97
public static void main(String[] args) {
98
// Load the native OpenCV library
99
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
100
101
new HDRImaging().run(args);
102
}
103
}
104
105