@@ -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*/
3637bool 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