Skip to content

Commit 32ed687

Browse files
demoulinvcbentejac
authored andcommitted
Manage 2 corner cases, 2 ldr images per group or 3 with mid exposure first
1 parent cbbbd5d commit 32ed687

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

src/aliceVision/hdr/brackets.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,69 @@ std::vector<std::vector<LuminanceInfo>> splitMonotonics(const std::vector<Lumina
259259
return splitted;
260260
}
261261

262+
// Check the specific case of 2 items per group without outlier
263+
if (luminanceInfos.size() % 2 == 0)
264+
{
265+
float exp0 = luminanceInfos[0].mexposure;
266+
float exp1 = luminanceInfos[1].mexposure;
267+
if (exp0 != exp1)
268+
{
269+
int idx = 2;
270+
bool ok = true;
271+
while (ok && idx < luminanceInfos.size())
272+
{
273+
ok = ok && luminanceInfos[idx].mexposure == exp0 && luminanceInfos[idx+1].mexposure == exp1;
274+
idx += 2;
275+
}
276+
if (idx == luminanceInfos.size())
277+
{
278+
std::vector<LuminanceInfo> current;
279+
for (int i = 0; i < luminanceInfos.size(); i++)
280+
{
281+
current.push_back(luminanceInfos[i]);
282+
if (i % 2 == 1)
283+
{
284+
splitted.push_back(current);
285+
current.clear();
286+
}
287+
}
288+
return splitted;
289+
}
290+
}
291+
}
292+
293+
// Check the corner case of 3 items per group ordered with middle exposure first and without outlier
294+
if (luminanceInfos.size() % 3 == 0)
295+
{
296+
float exp0 = luminanceInfos[0].mexposure;
297+
float exp1 = luminanceInfos[1].mexposure;
298+
float exp2 = luminanceInfos[2].mexposure;
299+
if (exp0 > exp1 && exp0 < exp2 || exp0 < exp1 && exp0 > exp2)
300+
{
301+
int idx = 3;
302+
bool ok = true;
303+
while (ok && idx < luminanceInfos.size())
304+
{
305+
ok = ok && luminanceInfos[idx].mexposure == exp0 && luminanceInfos[idx+1].mexposure == exp1 && luminanceInfos[idx+2].mexposure == exp2;
306+
idx += 3;
307+
}
308+
if (idx == luminanceInfos.size())
309+
{
310+
std::vector<LuminanceInfo> current;
311+
for (int i = 0; i < luminanceInfos.size(); i++)
312+
{
313+
current.push_back(luminanceInfos[i]);
314+
if (i % 3 == 2)
315+
{
316+
splitted.push_back(current);
317+
current.clear();
318+
}
319+
}
320+
return splitted;
321+
}
322+
}
323+
}
324+
262325
//Split the luminanceInfos into groups which have monotonic values
263326
//(either increasing or decreasing)
264327
std::vector<LuminanceInfo> current;

0 commit comments

Comments
 (0)