9 #include <aliceVision/types.hpp>
10 #include <aliceVision/numeric/numeric.hpp>
26 double _shutter{-1.0};
27 double _fnumber{-1.0};
30 bool hasShutter()
const {
return _shutter > 0.0 && std::isnormal(_shutter); }
31 bool hasFNumber()
const {
return _fnumber > 0.0 && std::isnormal(_fnumber); }
32 bool hasISO()
const {
return _iso > 0.0 && std::isnormal(_iso); }
34 bool isFullyDefined()
const {
return hasShutter() && hasFNumber() && hasISO(); }
36 bool isPartiallyDefined()
const {
return hasShutter() || hasFNumber(); }
38 double getExposure(
const double referenceISO = 100.0,
const double referenceFNumber = 1.0)
const
40 const bool validShutter = hasShutter();
41 const bool validFNumber = hasFNumber();
43 if (!validShutter && !validFNumber)
46 const bool validRefFNumber = referenceFNumber > 0.0 && std::isnormal(referenceFNumber);
48 double shutter = _shutter;
51 shutter = 1.0 / 200.0;
53 double fnumber = _fnumber;
60 fnumber = referenceFNumber;
64 double lReferenceFNumber = referenceFNumber;
67 lReferenceFNumber = fnumber;
70 const double iso = _iso;
80 double iso2Aperture = 1.0;
81 if (iso > 1e-6 && referenceISO > 1e-6)
84 iso2Aperture = std::sqrt(iso / referenceISO);
93 double newFnumber = fnumber * iso2Aperture;
94 double expIncrease = (lReferenceFNumber / newFnumber) * (lReferenceFNumber / newFnumber);
108 return shutter * expIncrease;
110 bool operator<(
const ExposureSetting& other)
const {
return getExposure() < other.getExposure(); }
111 bool operator==(
const ExposureSetting& other)
const {
return getExposure() == other.getExposure(); }
114 inline std::ostream& operator<<(std::ostream& os,
const ExposureSetting& s)
116 os <<
"shutter: " << s._shutter <<
", fnumber: " << s._fnumber <<
", iso: " << s._iso;
120 inline bool hasComparableExposures(
const std::vector<ExposureSetting>& exposuresSetting)
122 if (exposuresSetting.size() < 2)
125 const bool hasShutter = exposuresSetting.front().hasShutter();
126 const bool hasFNumber = exposuresSetting.front().hasFNumber();
127 const bool hasISO = exposuresSetting.front().hasISO();
128 for (std::size_t i = 1; i < exposuresSetting.size(); ++i)
131 if (hasShutter != s.hasShutter())
133 if (hasFNumber != s.hasFNumber())
135 if (hasISO != s.hasISO())
141 inline std::vector<double> getExposures(
const std::vector<ExposureSetting>& exposuresSetting)
143 std::vector<double> output;
144 output.reserve(exposuresSetting.size());
145 for (
const ExposureSetting& exp : exposuresSetting)
147 output.push_back(exp.getExposure());