Skip to content

Commit

Permalink
updates to cameraInit
Browse files Browse the repository at this point in the history
  • Loading branch information
servantftechnicolor committed Jul 11, 2024
1 parent 6228873 commit 6590e17
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 9 deletions.
8 changes: 7 additions & 1 deletion src/aliceVision/keyframe/KeyframeSelector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1486,7 +1486,13 @@ std::shared_ptr<camera::IntrinsicBase> KeyframeSelector::createIntrinsic(const s
const double imageRatio,
const std::size_t mediaIndex)
{
auto intrinsic = sfmDataIO::getViewIntrinsic(view, focalLength, sensorWidth);
camera::EInitMode mode = camera::EInitMode::ESTIMATED;
if (sensorWidth <= 0)
{
mode = camera::EInitMode::UNKNOWN;
}

auto intrinsic = sfmDataIO::getViewIntrinsic(view, mode, focalLength, sensorWidth);
if (imageRatio > 1.0 && sensorWidth > -1.0)
{
intrinsic->setSensorWidth(sensorWidth);
Expand Down
35 changes: 27 additions & 8 deletions src/aliceVision/sfmDataIO/viewIO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <aliceVision/sfmData/uid.hpp>
#include <aliceVision/camera/camera.hpp>
#include <aliceVision/image/io.hpp>
#include "aliceVision/utils/filesIO.hpp"
#include <aliceVision/utils/filesIO.hpp>

#include <stdexcept>
#include <regex>
Expand Down Expand Up @@ -109,6 +109,7 @@ void updateIncompleteView(sfmData::View& view, EViewIdMethod viewIdMethod, const
}

std::shared_ptr<camera::IntrinsicBase> getViewIntrinsic(const sfmData::View& view,
const camera::EInitMode intrinsicInitMode,
double mmFocalLength,
double sensorWidth,
double defaultFocalLength,
Expand Down Expand Up @@ -190,13 +191,18 @@ std::shared_ptr<camera::IntrinsicBase> getViewIntrinsic(const sfmData::View& vie
hasFocalLengthInput = true;
}

// Do not enforce focal length
if (intrinsicInitMode == camera::EInitMode::NONE || intrinsicInitMode == camera::EInitMode::UNKNOWN)
{
hasFocalLengthInput = false;
}

double focalLengthIn35mm = 36.0 * focalLength;
double pxFocalLength = (focalLength / sensorWidth) * std::max(view.getImage().getWidth(), view.getImage().getHeight());

// retrieve pixel aspect ratio
double pixelAspectRatio = 1.0 / defaultFocalRatio;
view.getImage().getDoubleMetadata({"PixelAspectRatio"}, pixelAspectRatio);
const double focalRatio = 1.0 / pixelAspectRatio;

bool hasFisheyeCompatibleParameters = ((focalLengthIn35mm > 0.0 && focalLengthIn35mm < 18.0) || (defaultFieldOfView > 100.0));

Expand Down Expand Up @@ -239,16 +245,21 @@ std::shared_ptr<camera::IntrinsicBase> getViewIntrinsic(const sfmData::View& vie
distortionType = camera::EDISTORTION::DISTORTION_RADIALK3;
}

//PixelAspectRatio is the vertical size of a pixel over the horizontal size of a pixel
//We divide x scale assuming the focal length on an anamorphic lens is for the vertical dimension
double horizontalScale = (pxFocalLength > 0) ? pxFocalLength / pixelAspectRatio : -1;
double verticalScale = pxFocalLength;

// create the desired intrinsic
std::shared_ptr<camera::IntrinsicBase> intrinsic = camera::createIntrinsic(
/*camera*/ intrinsicType,
intrinsicType,
distortionType,
camera::EUNDISTORTION::UNDISTORTION_NONE,
/*dimensions*/ view.getImage().getWidth(),
view.getImage().getWidth(),
view.getImage().getHeight(),
/*focal length*/ pxFocalLength,
pxFocalLength / focalRatio,
/*offset*/ 0,
horizontalScale,
verticalScale,
0,
0);

if (hasFocalLengthInput)
Expand All @@ -257,7 +268,15 @@ std::shared_ptr<camera::IntrinsicBase> getViewIntrinsic(const sfmData::View& vie

if (intrinsicScaleOffset)
{
intrinsicScaleOffset->setInitialScale({pxFocalLength, (pxFocalLength > 0) ? pxFocalLength / focalRatio : -1});
intrinsicScaleOffset->setInitialScale({horizontalScale, verticalScale});
}
}

//In any case, we can fill the default offset
{
std::shared_ptr<camera::IntrinsicScaleOffset> intrinsicScaleOffset = std::dynamic_pointer_cast<camera::IntrinsicScaleOffset>(intrinsic);
if (intrinsicScaleOffset)
{
intrinsicScaleOffset->setOffset({defaultOffsetX, defaultOffsetY});
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/aliceVision/sfmDataIO/viewIO.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ void updateIncompleteView(sfmData::View& view, EViewIdMethod viewIdMethod = EVie
/**
* @brief create an intrinsic for the given View
* @param[in] view The given view
* @param[in] intrinsicInitMode validity flags
* @param[in] mmFocalLength (-1 if unknown)
* @param[in] sensorWidth (-1 if unknown)
* @param[in] defaultFocalLength (-1 if unknown)
Expand All @@ -78,6 +79,7 @@ void updateIncompleteView(sfmData::View& view, EViewIdMethod viewIdMethod = EVie
* @return shared_ptr IntrinsicBase
*/
std::shared_ptr<camera::IntrinsicBase> getViewIntrinsic(const sfmData::View& view,
const camera::EInitMode intrinsicInitMode,
double mmFocalLength = -1.0,
double sensorWidth = -1,
double defaultFocalLength = -1,
Expand Down
1 change: 1 addition & 0 deletions src/software/pipeline/main_cameraInit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,7 @@ int aliceVision_main(int argc, char** argv)

// build intrinsic
std::shared_ptr<camera::IntrinsicBase> intrinsicBase = getViewIntrinsic(view,
intrinsicInitMode,
focalLengthmm,
sensorWidth,
defaultFocalLength,
Expand Down
1 change: 1 addition & 0 deletions src/software/utils/main_imageProcessing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1750,6 +1750,7 @@ int aliceVision_main(int argc, char* argv[])
const double defaultOffsetX = 0.0;
const double defaultOffsetY = 0.0;
intrinsicBase = sfmDataIO::getViewIntrinsic(view,
intrinsicInitMode,
focalLengthmm,
sensorWidth,
defaultFocalLength,
Expand Down

0 comments on commit 6590e17

Please sign in to comment.