HDRImagingDemo.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. import org.opencv.core.Core;
  7. import org.opencv.core.CvType;
  8. import org.opencv.core.Mat;
  9. import org.opencv.core.Scalar;
  10. import org.opencv.imgcodecs.Imgcodecs;
  11. import org.opencv.photo.CalibrateDebevec;
  12. import org.opencv.photo.MergeDebevec;
  13. import org.opencv.photo.MergeMertens;
  14. import org.opencv.photo.Photo;
  15. import org.opencv.photo.Tonemap;
  16. class HDRImaging {
  17. public void loadExposureSeq(String path, List<Mat> images, List<Float> times) {
  18. path += "/";
  19. List<String> lines;
  20. try {
  21. lines = Files.readAllLines(Paths.get(path + "list.txt"));
  22. for (String line : lines) {
  23. String[] splitStr = line.split("\\s+");
  24. if (splitStr.length == 2) {
  25. String name = splitStr[0];
  26. Mat img = Imgcodecs.imread(path + name);
  27. images.add(img);
  28. float val = Float.parseFloat(splitStr[1]);
  29. times.add(1/ val);
  30. }
  31. }
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. public void run(String[] args) {
  37. String path = args.length > 0 ? args[0] : "";
  38. if (path.isEmpty()) {
  39. System.out.println("Path is empty. Use the directory that contains images and exposure times.");
  40. System.exit(0);
  41. }
  42. //! [Load images and exposure times]
  43. List<Mat> images = new ArrayList<>();
  44. List<Float> times = new ArrayList<>();
  45. loadExposureSeq(path, images, times);
  46. //! [Load images and exposure times]
  47. //! [Estimate camera response]
  48. Mat response = new Mat();
  49. CalibrateDebevec calibrate = Photo.createCalibrateDebevec();
  50. Mat matTimes = new Mat(times.size(), 1, CvType.CV_32F);
  51. float[] arrayTimes = new float[(int) (matTimes.total()*matTimes.channels())];
  52. for (int i = 0; i < times.size(); i++) {
  53. arrayTimes[i] = times.get(i);
  54. }
  55. matTimes.put(0, 0, arrayTimes);
  56. calibrate.process(images, response, matTimes);
  57. //! [Estimate camera response]
  58. //! [Make HDR image]
  59. Mat hdr = new Mat();
  60. MergeDebevec mergeDebevec = Photo.createMergeDebevec();
  61. mergeDebevec.process(images, hdr, matTimes);
  62. //! [Make HDR image]
  63. //! [Tonemap HDR image]
  64. Mat ldr = new Mat();
  65. Tonemap tonemap = Photo.createTonemap(2.2f);
  66. tonemap.process(hdr, ldr);
  67. //! [Tonemap HDR image]
  68. //! [Perform exposure fusion]
  69. Mat fusion = new Mat();
  70. MergeMertens mergeMertens = Photo.createMergeMertens();
  71. mergeMertens.process(images, fusion);
  72. //! [Perform exposure fusion]
  73. //! [Write results]
  74. Core.multiply(fusion, new Scalar(255,255,255), fusion);
  75. Core.multiply(ldr, new Scalar(255,255,255), ldr);
  76. Imgcodecs.imwrite("fusion.png", fusion);
  77. Imgcodecs.imwrite("ldr.png", ldr);
  78. Imgcodecs.imwrite("hdr.hdr", hdr);
  79. //! [Write results]
  80. System.exit(0);
  81. }
  82. }
  83. public class HDRImagingDemo {
  84. public static void main(String[] args) {
  85. // Load the native OpenCV library
  86. System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
  87. new HDRImaging().run(args);
  88. }
  89. }