Skip to content

Commit b3d7eb4

Browse files
author
Fabien Servant
committed
Update intrinsicsTransforming to enable decimating
1 parent a97b6e9 commit b3d7eb4

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

meshroom/aliceVision/IntrinsicsTransforming.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ class IntrinsicsTransforming(desc.AVCommandLineNode):
4040
value=90.0,
4141
range=(1.0, 179.0, 0.1),
4242
),
43+
desc.FloatParam(
44+
name="scaleFactor",
45+
label="Scale Factor",
46+
description="Rescale the size of the images in the sfmData description",
47+
value=1.0,
48+
range=(0.0, 1.0, 0.1),
49+
enabled=lambda node: node.type.value == "pinhole"
50+
),
4351
desc.BoolParam(
4452
name="correctPrincipalPoint",
4553
label="Correct Principal Point",

src/software/utils/main_intrinsicsTransforming.cpp

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,29 @@ namespace fs = std::filesystem;
3131
* @param sfmData the original sfmData
3232
* @param outputSfmData the result sfmData
3333
* @param fakeFov if one intrinsic is non pinhole, what is the required fov for the "fake" camera
34+
* @param scaleFactor the scale factor of all intrinsics
3435
* @return true if everything worked
3536
*/
3637
bool convertToPinhole(const sfmData::SfMData & sfmData,
3738
sfmData::SfMData & outputSfmData,
38-
double fakeFov)
39+
double fakeFov,
40+
double scaleFactor)
3941
{
4042
outputSfmData.getIntrinsics().clear();
43+
44+
if (scaleFactor != 1.0)
45+
{
46+
// Rescale the views
47+
for (auto & [idView, view] : outputSfmData.getViews().valueRange())
48+
{
49+
int w = view.getImage().getWidth();
50+
int h = view.getImage().getHeight();
51+
w = int(std::round(double(w) * scaleFactor));
52+
h = int(std::round(double(h) * scaleFactor));
53+
view.getImage().setWidth(w);
54+
view.getImage().setHeight(h);
55+
}
56+
}
4157

4258
// Loop over all input intrinsics
4359
for (const auto & [intrinsicId, intrinsicPtr] : sfmData.getIntrinsics())
@@ -63,12 +79,21 @@ bool convertToPinhole(const sfmData::SfMData & sfmData,
6379
cy = pinhole.getOffset().y();
6480
}
6581

82+
// Apply scale factor to all values
83+
int w = intrinsicPtr->w();
84+
int h = intrinsicPtr->h();
85+
w = int(std::round(double(w) * scaleFactor));
86+
h = int(std::round(double(h) * scaleFactor));
87+
fx = fx * scaleFactor;
88+
fy = fy * scaleFactor;
89+
cx = cx * scaleFactor;
90+
cy = cy * scaleFactor;
91+
6692
std::shared_ptr<camera::IntrinsicBase> fakecam = camera::createIntrinsic(
6793
camera::EINTRINSIC::PINHOLE_CAMERA,
6894
camera::DISTORTION_NONE,
6995
camera::UNDISTORTION_NONE,
70-
intrinsicPtr->w(),
71-
intrinsicPtr->h(),
96+
w, h,
7297
fx, fy, cx, cy
7398
);
7499

@@ -229,6 +254,7 @@ int aliceVision_main(int argc, char* argv[])
229254
std::string outputTracksFilename;
230255
std::string cameraTypeStr;
231256
double fakeFov = 90.0;
257+
double scaleFactor = 1.0;
232258
bool correctPrincipalPoint = false;
233259

234260
// clang-format off
@@ -243,6 +269,8 @@ int aliceVision_main(int argc, char* argv[])
243269
optionalParams.add_options()
244270
("fakeFov", po::value<double>(&fakeFov)->default_value(fakeFov),
245271
"Virtual FOV if output is pinhole and input is not.")
272+
("scaleFactor", po::value<double>(&scaleFactor)->default_value(scaleFactor),
273+
"Rescale the size of the images in the sfmData description.")
246274
("type", po::value<std::string>(&cameraTypeStr)->default_value(cameraTypeStr),
247275
"Default camera model type (pinhole, equidistant, equirectangular).")
248276
("correctPrincipalPoint", po::value<bool>(&correctPrincipalPoint)->default_value(correctPrincipalPoint),
@@ -282,7 +310,7 @@ int aliceVision_main(int argc, char* argv[])
282310
sfmData::SfMData outputSfmData(inputSfmData);
283311
if (cameraType == camera::EINTRINSIC::PINHOLE_CAMERA)
284312
{
285-
if (!convertToPinhole(inputSfmData, outputSfmData, fakeFov))
313+
if (!convertToPinhole(inputSfmData, outputSfmData, fakeFov, scaleFactor))
286314
{
287315
ALICEVISION_LOG_ERROR("There was an error converting intrinsics");
288316
return EXIT_FAILURE;

0 commit comments

Comments
 (0)