exposureFusion.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <opencv2/photo.hpp>
  2. #include "opencv2/imgcodecs.hpp"
  3. #include <opencv2/highgui.hpp>
  4. #include <vector>
  5. #include <iostream>
  6. #include <fstream>
  7. using namespace cv;
  8. using namespace std;
  9. // Read Images
  10. void readImages(vector<Mat> &images)
  11. {
  12. int numImages = 16;
  13. static const char* filenames[] =
  14. {
  15. "images/memorial0061.jpg",
  16. "images/memorial0062.jpg",
  17. "images/memorial0063.jpg",
  18. "images/memorial0064.jpg",
  19. "images/memorial0065.jpg",
  20. "images/memorial0066.jpg",
  21. "images/memorial0067.jpg",
  22. "images/memorial0068.jpg",
  23. "images/memorial0069.jpg",
  24. "images/memorial0070.jpg",
  25. "images/memorial0071.jpg",
  26. "images/memorial0072.jpg",
  27. "images/memorial0073.jpg",
  28. "images/memorial0074.jpg",
  29. "images/memorial0075.jpg",
  30. "images/memorial0076.jpg"
  31. };
  32. for(int i=0; i < numImages; i++)
  33. {
  34. Mat im = imread(filenames[i]);
  35. images.push_back(im);
  36. }
  37. }
  38. int main(int argc, char **argv)
  39. {
  40. // Read images
  41. cout << "Reading images ... " << endl;
  42. vector<Mat> images;
  43. bool needsAlignment = true;
  44. if(argc > 1)
  45. {
  46. // Read images from the command line
  47. for(int i=1; i < argc; i++)
  48. {
  49. Mat im = imread(argv[i]);
  50. images.push_back(im);
  51. }
  52. }
  53. else
  54. {
  55. // Read example images
  56. readImages(images);
  57. needsAlignment = false;
  58. }
  59. // Align input images
  60. if(needsAlignment)
  61. {
  62. cout << "Aligning images ... " << endl;
  63. Ptr<AlignMTB> alignMTB = createAlignMTB();
  64. alignMTB->process(images, images);
  65. }
  66. else
  67. {
  68. cout << "Skipping alignment ... " << endl;
  69. }
  70. // Merge using Exposure Fusion
  71. cout << "Merging using Exposure Fusion ... " << endl;
  72. Mat exposureFusion;
  73. Ptr<MergeMertens> mergeMertens = createMergeMertens();
  74. mergeMertens->process(images, exposureFusion);
  75. // Save output image
  76. cout << "Saving output ... exposure-fusion.jpg"<< endl;
  77. imwrite("exposure-fusion.jpg", exposureFusion * 255);
  78. return EXIT_SUCCESS;
  79. }