From c6f314de958e082e55bbba79ba4d59c226deed22 Mon Sep 17 00:00:00 2001 From: Patrick Simianer Date: Sat, 26 Nov 2016 12:43:05 +0100 Subject: merge --- .gitignore | 2 +- Makefile | 2 +- merge-fuse-batch | 13 ++++++ merge-hdr-wrapper | 4 ++ merge.cc | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 150 insertions(+), 2 deletions(-) create mode 100755 merge-fuse-batch create mode 100755 merge-hdr-wrapper create mode 100644 merge.cc diff --git a/.gitignore b/.gitignore index 294b1e5..ee6d25a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ crop merge straighten - +test/ diff --git a/Makefile b/Makefile index 4999078..e5b40b8 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ CFLAGS += `pkg-config --libs opencv` crop: crop.cc g++ $(CFLAGS) crop.cc -o crop -merge: merge.cc +merge: merge.cc cxxopts/src/cxxopts.hpp g++ -std=c++11 $(CFLAGS) merge.cc -o merge straighten: straighten.cc diff --git a/merge-fuse-batch b/merge-fuse-batch new file mode 100755 index 0000000..1f21c55 --- /dev/null +++ b/merge-fuse-batch @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby + +BILDROEHRE=File.dirname(__FILE__) +DIR=ARGV[0] +i = 0 +while line = STDIN.gets + args = line.strip.split.join (" -f #{DIR}") + cmd = "#{BILDROEHRE}/merge -F -o mertens-fused-#{i}.jpg #{args}" + STDERR.write "#{cmd}\n" + `#{cmd}` + i += 1 +end + diff --git a/merge-hdr-wrapper b/merge-hdr-wrapper new file mode 100755 index 0000000..e1b8970 --- /dev/null +++ b/merge-hdr-wrapper @@ -0,0 +1,4 @@ +#!/bin/zsh -x + +exiv2 2016-10-30-15-08-38-dp2m.jpg 2>/dev/null | grep 'Exposure time' | cut -d ':' -f 2 | strips | cut -d " " -f 1 | bc -l + diff --git a/merge.cc b/merge.cc new file mode 100644 index 0000000..a41cfc7 --- /dev/null +++ b/merge.cc @@ -0,0 +1,131 @@ +#include +#include +#include "opencv2/opencv.hpp" +#include "opencv2/photo/photo.hpp" +#include "cxxopts/src/cxxopts.hpp" + +using namespace std; +using namespace cv; + +int +load_images(const vector &files, vector &images) +{ + for (const auto& f : files) { + cerr << "reading " << f << endl; + images.push_back(imread(f, 1)); + if (images.back().empty()) { + cerr << "failed to read " << f << endl; + return 1; + } + } + + return 0; +} + +void +mertens_fusion(vector &images, string output) +{ + cerr << "Mertens fusion" << endl; + Ptr merge_mertens = createMergeMertens(); + Mat m; + merge_mertens->process(images, m); + + cerr << "writing " << output << endl; + imwrite(output, m * 255); +} + +void +hdr(vector &images, string output, string algorithm, string tonemap, + vector times, float gamma) +{ + cerr << "HDR (" << algorithm << "/" << tonemap << ")" << endl; + + Mat response, hdr, ldr; + Ptr calibrate; + Ptr merge; + if (algorithm == "Debevec") { + calibrate = createCalibrateDebevec(); + merge = createMergeDebevec(); + } + else + if (algorithm == "Robertson") { + calibrate = createCalibrateRobertson(); + merge = createMergeRobertson(); + } + calibrate->process(images, response, times); + merge->process(images, hdr, times, response); + + Ptr map; + if (tonemap == "Durand") { + map = createTonemapDurand(gamma); + } else + if (tonemap == "Drago") { + map = createTonemapDrago(gamma); + } else + if (tonemap == "Reinhard") { + map = createTonemapReinhard(gamma); + } else + if (tonemap == "Mantiuk") { + map = createTonemapMantiuk(gamma); + } + map->process(hdr, ldr); + + cerr << "writing " << output << endl; + imwrite(output, ldr * 255); +} + + +int +main (int argc, char** argv) +{ + cxxopts::Options opt(argv[0], " - Options"); + opt.add_options() + ("f,files", "files", cxxopts::value>()) + ("F,Mertens", "Mertens fusion") + ("D,debevec", "Debevec HDR") + ("R,robertson", "Robertson HDR") + ("w,times", "times for HDR", cxxopts::value>()) + ("t,tonemap", "tonemapping", cxxopts::value()) + ("g,gamma", "gamma for HDR", cxxopts::value()) + ("o,output", "output file", cxxopts::value()) + ("O,Output", "another output file", cxxopts::value()) + ("p,OUTPUT", "another output file", cxxopts::value()); + + opt.parse(argc, argv); + + auto& files = opt["f"].as>(); + vector images; + auto do_fusion = opt.count("F"); + bool do_debevec_hdr = opt.count("D"); + bool do_robertson_hdr = opt.count("R"); + bool do_hdr = do_debevec_hdr||do_robertson_hdr; + vector times = opt["w"].as>(); + float gamma = opt["g"].as(); + cout << gamma << endl; + if (do_hdr && !opt.count("g")) + gamma = 1.0; + string tonemap; + if (opt.count("t")) + tonemap = opt["t"].as(); + else + tonemap = "Durand"; + auto& output = opt["o"].as(); + auto& output1 = opt["O"].as(); + auto& output2 = opt["p"].as(); + + if (load_images(files, images) > 0) + return 1; + + if (do_fusion) + mertens_fusion(images, output); + + if (do_hdr) { + if (do_debevec_hdr) + hdr(images, output1, "Debevec", tonemap, times, gamma); + if (do_robertson_hdr) + hdr(images, output2, "Robertson", tonemap, times, gamma); + } + + return 0; +} + -- cgit v1.2.3