Skip to content

Commit b62ce7b

Browse files
committed
[prepareDenseScene] fix landmarks-based mask for depth maps
- put masked pixels to 0.5 instead of 0 in order to be taken into consideration for Tc cameras - fix index out of range thrown in case there are no observations for a certain view
1 parent 2254e09 commit b62ce7b

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

src/software/pipeline/main_prepareDenseScene.cpp

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ bool prepareDenseScene(const SfMData& sfmData,
124124
const double medianCameraExposure = sfmData.getMedianCameraExposureSetting().getExposure();
125125
ALICEVISION_LOG_INFO("Median Camera Exposure: " << medianCameraExposure << ", Median EV: " << std::log2(1.0/medianCameraExposure));
126126

127-
const LandmarksPerView landmarksPerView = getLandmarksPerViews(sfmData);
127+
const LandmarksPerView& landmarksPerView = getLandmarksPerViews(sfmData);
128128

129129
#pragma omp parallel for num_threads(3)
130130
for(int i = 0; i < viewIds.size(); ++i)
@@ -250,49 +250,54 @@ bool prepareDenseScene(const SfMData& sfmData,
250250
}
251251

252252
image::Image<unsigned char> maskLandmarks;
253-
if(landmarksMaskScale > 0.f)
253+
bool doMaskLandmarks = landmarksMaskScale > 0.f;
254+
if(doMaskLandmarks)
254255
{
255-
const LandmarkIdSet& landmarksSet = landmarksPerView.at(viewId);
256256
image::Image<RGBAfColor> image;
257257
readImage(srcImage, image, image::EImageColorSpace::LINEAR);
258-
maskLandmarks = image::Image<unsigned char>(image.Width(), image.Height(), true, 0);
258+
// for the T camera, image alpha should be at least 0.4f * 255 (masking)
259+
maskLandmarks = image::Image<unsigned char>(image.Width(), image.Height(), true, 127);
259260
int r = (int)(landmarksMaskScale * 0.5f * (image.Width() + image.Height()));
260-
for(const auto& landmarkId : landmarksSet)
261+
const auto& landmarksSetIt = landmarksPerView.find(viewId);
262+
if(landmarksSetIt != landmarksPerView.end())
261263
{
262-
const sfmData::Landmark& landmark = sfmData.getLandmarks().at(landmarkId);
263-
Observation obs = landmark.observations.at(viewId);
264-
// maskLandmarks(obs.x.y(), obs.x.x()) = 1;
265-
for(int y = std::max(obs.x.y() - r, 0.);
266-
y <= std::min(obs.x.y() + r, (double)maskLandmarks.Height() - 1); y++)
264+
const LandmarkIdSet& landmarksSet = landmarksSetIt->second;
265+
for(const auto& landmarkId : landmarksSet)
267266
{
268-
for(int x = std::max(obs.x.x() - r, 0.);
269-
x <= std::min(obs.x.x() + r, (double)maskLandmarks.Width() - 1); x++)
267+
const sfmData::Landmark& landmark = sfmData.getLandmarks().at(landmarkId);
268+
Observation obs = landmark.observations.at(viewId);
269+
for(int y = std::max(obs.x.y() - r, 0.);
270+
y <= std::min(obs.x.y() + r, (double)maskLandmarks.Height() - 1); y++)
270271
{
271-
maskLandmarks(y, x) = 1;
272+
for(int x = std::max(obs.x.x() - r, 0.);
273+
x <= std::min(obs.x.x() + r, (double)maskLandmarks.Width() - 1); x++)
274+
{
275+
maskLandmarks(y, x) = std::numeric_limits<unsigned char>::max();
276+
}
272277
}
273278
}
274279
}
275280
}
276281

277282
image::Image<unsigned char> mask;
283+
bool maskLoaded = false;
278284
if(tryLoadMask(&mask, masksFolders, viewId, srcImage, maskExtension))
279-
mask = mask * maskLandmarks;
280-
else
281-
mask = maskLandmarks;
282-
process<Image<RGBAfColor>>(dstColorImage, cam, metadata, srcImage, evCorrection, exposureCompensation, [&mask] (Image<RGBAfColor> & image)
283-
{
284-
if(image.Width() * image.Height() != mask.Width() * mask.Height())
285+
maskLoaded = true;
286+
process<Image<RGBAfColor>>(
287+
dstColorImage, cam, metadata, srcImage, evCorrection, exposureCompensation,
288+
[&maskLoaded, &mask, &maskLandmarks, &doMaskLandmarks](Image<RGBAfColor>& image)
285289
{
286-
ALICEVISION_LOG_WARNING("Invalid image mask size: mask is ignored.");
287-
return;
288-
}
290+
if(maskLoaded && (image.Width() * image.Height() != mask.Width() * mask.Height()))
291+
{
292+
ALICEVISION_LOG_WARNING("Invalid image mask size: mask is ignored.");
293+
return;
294+
}
289295

290-
for(int pix = 0; pix < image.Width() * image.Height(); ++pix)
291-
{
292-
const bool masked = (mask(pix) == 0);
293-
image(pix).a() = masked ? 0.f : 1.f;
294-
}
295-
});
296+
for(int pix = 0; pix < image.Width() * image.Height(); ++pix)
297+
{
298+
image(pix).a() = (maskLoaded && mask(pix) == 0) ? 0.f : (doMaskLandmarks && maskLandmarks(pix) == 127) ? .5f : 1.f;
299+
}
300+
});
296301
/* else
297302
{
298303
const auto noMaskingFunc = [] (Image<RGBAfColor> & image) {};

0 commit comments

Comments
 (0)