Skip to content

Commit

Permalink
[hdr] Split ldrToHdr in 3 steps: sampling, calibration and merge
Browse files Browse the repository at this point in the history
  • Loading branch information
servantftechnicolor authored and fabiencastan committed Jul 2, 2020
1 parent 0c9d51c commit 5994701
Show file tree
Hide file tree
Showing 19 changed files with 1,798 additions and 415 deletions.
4 changes: 1 addition & 3 deletions src/aliceVision/hdr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ set(hdr_files_headers
LaguerreBACalibration.hpp
sampling.hpp
rgbCurve.hpp
RobertsonCalibrate.hpp
hdrMerge.hpp
DebevecCalibrate.hpp
GrossbergCalibrate.hpp
Expand All @@ -17,7 +16,6 @@ set(hdr_files_sources
LaguerreBACalibration.cpp
sampling.cpp
rgbCurve.cpp
RobertsonCalibrate.cpp
hdrMerge.cpp
DebevecCalibrate.cpp
GrossbergCalibrate.cpp
Expand All @@ -36,4 +34,4 @@ alicevision_add_library(aliceVision_hdr
)

# Unit tests
alicevision_add_test(hdr_test.cpp NAME "hdr" LINKS aliceVision_image aliceVision_hdr)
#alicevision_add_test(hdr_test.cpp NAME "hdr" LINKS aliceVision_image aliceVision_hdr)
16 changes: 6 additions & 10 deletions src/aliceVision/hdr/DebevecCalibrate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,20 @@ namespace aliceVision {
namespace hdr {


bool DebevecCalibrate::process(const std::vector<std::vector<std::string>>& imagePathsGroups,
const std::size_t channelQuantization, const std::vector<std::vector<float>>& times,
bool DebevecCalibrate::process(const std::vector<std::vector<ImageSample>>& ldrSamples,
const std::vector<std::vector<float>>& times, const std::size_t channelQuantization,
const rgbCurve& weight, float lambda, rgbCurve& response)
{
// Always 3 channels for the input images
static const std::size_t channelsCount = 3;

/*Extract samples*/
ALICEVISION_LOG_DEBUG("Extract color samples");
std::vector<std::vector<ImageSample>> samples;
extractSamplesGroups(samples, imagePathsGroups, times, channelQuantization);

// Count really extracted amount of points (observed in multiple brackets)
std::vector<size_t> countPointPerGroup;
size_t totalPoints = 0;
for(size_t groupId = 0; groupId < samples.size(); groupId++)
for(size_t groupId = 0; groupId < ldrSamples.size(); groupId++)
{
std::vector<ImageSample> & group = samples[groupId];
const std::vector<ImageSample> & group = ldrSamples[groupId];
totalPoints += group.size();
}

Expand Down Expand Up @@ -68,10 +64,10 @@ bool DebevecCalibrate::process(const std::vector<std::vector<std::string>>& imag
Dinv.setZero();

size_t countPoints = 0;
for(size_t groupId = 0; groupId < samples.size(); groupId++)
for(size_t groupId = 0; groupId < ldrSamples.size(); groupId++)
{
/*Process a group of brackets*/
const std::vector<ImageSample>& group = samples[groupId];
const std::vector<ImageSample>& group = ldrSamples[groupId];
const std::vector<float> & local_times = times[groupId];

for (size_t sampleId = 0; sampleId < group.size(); sampleId++) {
Expand Down
7 changes: 4 additions & 3 deletions src/aliceVision/hdr/DebevecCalibrate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#pragma once

#include "sampling.hpp"
#include "rgbCurve.hpp"

#include <vector>
Expand All @@ -32,15 +33,15 @@ class DebevecCalibrate
/**
* @brief
* @param[in] LDR images groups
* @param[in] channel quantization
* @param[in] exposure times
* @param[in] channel quantization
* @param[in] calibration weight function
* @param[in] lambda (parameter of smoothness)
* @param[out] camera response function
*/
bool process(const std::vector<std::vector<std::string>> &ldrImageGroups,
std::size_t channelQuantization,
bool process(const std::vector<std::vector<ImageSample>> & ldrSamples,
const std::vector<std::vector<float>> &times,
std::size_t channelQuantization,
const rgbCurve &weight,
float lambda,
rgbCurve &response);
Expand Down
14 changes: 5 additions & 9 deletions src/aliceVision/hdr/GrossbergCalibrate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,10 @@ GrossbergCalibrate::GrossbergCalibrate(unsigned int dimension)
_dimension = dimension;
}

void GrossbergCalibrate::process(const std::vector<std::vector<std::string>>& imagePathsGroups, std::size_t channelQuantization, const std::vector<std::vector<float>>& times, rgbCurve& response)
void GrossbergCalibrate::process(const std::vector<std::vector<ImageSample>>& ldrSamples, const std::vector<std::vector<float>>& times, std::size_t channelQuantization, rgbCurve& response)
{
const double step = 1.0 / double(channelQuantization - 1);

ALICEVISION_LOG_DEBUG("Extract color samples");
std::vector<std::vector<ImageSample>> samples;
extractSamplesGroups(samples, imagePathsGroups, times, channelQuantization);

// set channels count always RGB
static const std::size_t channels = 3;

Expand All @@ -49,9 +45,9 @@ void GrossbergCalibrate::process(const std::vector<std::vector<std::string>>& im
// sum(c_i * f_i(Ba)) - k*sum(c_i * f_i(Bb)) = k*f0(Bb) - f0(Ba)

size_t count_measures = 0;
for(size_t group = 0; group < samples.size(); group++)
for(size_t group = 0; group < ldrSamples.size(); group++)
{
std::vector<ImageSample> & groupSamples = samples[group];
const std::vector<ImageSample> & groupSamples = ldrSamples[group];

for (size_t sampleId = 0; sampleId < groupSamples.size(); sampleId++) {
count_measures += groupSamples[sampleId].descriptions.size() - 1;
Expand All @@ -72,9 +68,9 @@ void GrossbergCalibrate::process(const std::vector<std::vector<std::string>>& im
fdim.setEmorInv(dim + 1);

size_t rowId = 0;
for(size_t groupId = 0; groupId < samples.size(); groupId++)
for(size_t groupId = 0; groupId < ldrSamples.size(); groupId++)
{
const std::vector<ImageSample>& groupSamples = samples[groupId];
const std::vector<ImageSample>& groupSamples = ldrSamples[groupId];

for(size_t sampleId = 0; sampleId < groupSamples.size(); sampleId++)
{
Expand Down
9 changes: 4 additions & 5 deletions src/aliceVision/hdr/GrossbergCalibrate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#pragma once

#include "sampling.hpp"
#include "emorCurve.hpp"
#include "rgbCurve.hpp"

Expand Down Expand Up @@ -35,15 +36,13 @@ class GrossbergCalibrate
/**
* @brief
* @param[in] LDR images groups
* @param[in] channel quantization
* @param[in] exposure times
* @param[in] number of samples
* @param[in] calibration weight function
* @param[in] channel quantization
* @param[out] camera response function
*/
void process(const std::vector<std::vector<std::string>>& imagePathsGroups,
std::size_t channelQuantization,
void process(const std::vector<std::vector<ImageSample>>& ldrSamples,
const std::vector< std::vector<float> > &times,
std::size_t channelQuantization,
rgbCurve &response);

private:
Expand Down
18 changes: 6 additions & 12 deletions src/aliceVision/hdr/LaguerreBACalibration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,17 +158,11 @@ class ExposureConstraint : public ceres::SizedCostFunction<1, 1>
double _ratio;
};

void LaguerreBACalibration::process(const std::vector<std::vector<std::string>>& imagePathsGroups,
const std::size_t channelQuantization,
void LaguerreBACalibration::process(const std::vector<std::vector<ImageSample>>& ldrSamples,
std::vector<std::vector<float>>& cameraExposures,
bool refineExposures, rgbCurve& response)
const std::size_t channelQuantization,
bool refineExposures, rgbCurve& response)
{
/*Extract samples from images*/
ALICEVISION_LOG_DEBUG("Extract color samples");
std::vector<std::vector<ImageSample>> samples;
extractSamplesGroups(samples, imagePathsGroups, cameraExposures, channelQuantization);


std::map<std::pair<float, float>, double> exposureParameters;
for(std::vector<float>& group : cameraExposures)
{
Expand All @@ -191,13 +185,13 @@ void LaguerreBACalibration::process(const std::vector<std::vector<std::string>>&
}

// Convert selected samples into residual blocks
for(int groupId = 0; groupId < samples.size(); ++groupId)
for(int groupId = 0; groupId < ldrSamples.size(); ++groupId)
{
std::vector<ImageSample> & group = samples[groupId];
const std::vector<ImageSample> & group = ldrSamples[groupId];

for (int sampleId = 0; sampleId < group.size(); sampleId++) {

ImageSample & sample = group[sampleId];
const ImageSample & sample = group[sampleId];

for (int bracketPos = 0; bracketPos < sample.descriptions.size() - 1; bracketPos++) {

Expand Down
5 changes: 3 additions & 2 deletions src/aliceVision/hdr/LaguerreBACalibration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#pragma once

#include "sampling.hpp"
#include "emorCurve.hpp"
#include "rgbCurve.hpp"

Expand Down Expand Up @@ -44,9 +45,9 @@ class LaguerreBACalibration
* @param[out] camera response function
*/
void process(
const std::vector<std::vector<std::string>>& imagePathsGroups,
const std::size_t channelQuantization,
const std::vector<std::vector<ImageSample>>& ldrSamples,
std::vector<std::vector<float>>& cameraExposures,
const std::size_t channelQuantization,
bool refineExposures,
rgbCurve &response);
};
Expand Down
Loading

0 comments on commit 5994701

Please sign in to comment.