hdr.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <opencv2/photo.hpp>
  2. #include "opencv2/imgcodecs.hpp"
  3. #include <opencv2/highgui.hpp>
  4. #include <opencv2/xphoto/tonemap.hpp>
  5. #include <vector>
  6. #include <iostream>
  7. #include <fstream>
  8. using namespace cv;
  9. using namespace std;
  10. void readImagesAndTimes(vector<Mat> &images, vector<float> &times)
  11. {
  12. int numImages = 4;
  13. static const float timesArray[] = {1/30.0f,0.25,2.5,15.0};
  14. times.assign(timesArray, timesArray + numImages);
  15. static const char* filenames[] = {"img_0.033.jpg", "img_0.25.jpg", "img_2.5.jpg", "img_15.jpg"};
  16. for(int i=0; i < numImages; i++)
  17. {
  18. Mat im = imread(filenames[i]);
  19. images.push_back(im);
  20. }
  21. }
  22. int main(int, char**argv)
  23. {
  24. // Read images and exposure times
  25. cout << "Reading images ... " << endl;
  26. vector<Mat> images;
  27. vector<float> times;
  28. readImagesAndTimes(images, times);
  29. // Align input images
  30. cout << "Aligning images ... " << endl;
  31. Ptr<AlignMTB> alignMTB = createAlignMTB();
  32. alignMTB->process(images, images);
  33. // Obtain Camera Response Function (CRF)
  34. cout << "Calculating Camera Response Function (CRF) ... " << endl;
  35. Mat responseDebevec;
  36. Ptr<CalibrateDebevec> calibrateDebevec = createCalibrateDebevec();
  37. calibrateDebevec->process(images, responseDebevec, times);
  38. // Merge images into an HDR linear image
  39. cout << "Merging images into one HDR image ... " ;
  40. Mat hdrDebevec;
  41. Ptr<MergeDebevec> mergeDebevec = createMergeDebevec();
  42. mergeDebevec->process(images, hdrDebevec, times, responseDebevec);
  43. // Save HDR image.
  44. imwrite("hdrDebevec.hdr", hdrDebevec);
  45. cout << "saved hdrDebevec.hdr "<< endl;
  46. // Tonemap using Drago's method to obtain 24-bit color image
  47. cout << "Tonemaping using Drago's method ... ";
  48. Mat ldrDrago;
  49. Ptr<TonemapDrago> tonemapDrago = createTonemapDrago(1.0, 0.7);
  50. tonemapDrago->process(hdrDebevec, ldrDrago);
  51. ldrDrago = 3 * ldrDrago;
  52. imwrite("ldr-Drago.jpg", ldrDrago * 255);
  53. cout << "saved ldr-Drago.jpg"<< endl;
  54. // Tonemap using Durand's method obtain 24-bit color image
  55. cout << "Tonemaping using Durand's method ... ";
  56. Mat ldrDurand;
  57. Ptr<cv::xphoto::TonemapDurand> tonemapDurand = cv::xphoto::createTonemapDurand(1.5,4,1.0,1,1);
  58. tonemapDurand->process(hdrDebevec, ldrDurand);
  59. ldrDurand = 3 * ldrDurand;
  60. imwrite("ldr-Durand.jpg", ldrDurand * 255);
  61. cout << "saved ldr-Durand.jpg"<< endl;
  62. // Tonemap using Reinhard's method to obtain 24-bit color image
  63. cout << "Tonemaping using Reinhard's method ... ";
  64. Mat ldrReinhard;
  65. Ptr<TonemapReinhard> tonemapReinhard = createTonemapReinhard(1.5, 0,0,0);
  66. tonemapReinhard->process(hdrDebevec, ldrReinhard);
  67. imwrite("ldr-Reinhard.jpg", ldrReinhard * 255);
  68. cout << "saved ldr-Reinhard.jpg"<< endl;
  69. // Tonemap using Mantiuk's method to obtain 24-bit color image
  70. cout << "Tonemaping using Mantiuk's method ... ";
  71. Mat ldrMantiuk;
  72. Ptr<TonemapMantiuk> tonemapMantiuk = createTonemapMantiuk(2.2,0.85, 1.2);
  73. tonemapMantiuk->process(hdrDebevec, ldrMantiuk);
  74. ldrMantiuk = 3 * ldrMantiuk;
  75. imwrite("ldr-Mantiuk.jpg", ldrMantiuk * 255);
  76. cout << "saved ldr-Mantiuk.jpg"<< endl;
  77. return EXIT_SUCCESS;
  78. }