Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions cmake/FindDependencies.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,37 @@ if(TESTS_ENABLED)
find_package(GTest REQUIRED)
endif()

include(FetchContent)

# Use local PoseLib with EQUIRECTANGULAR support
FetchContent_Declare(PoseLib
SOURCE_DIR /home/selstad/Desktop/colmap_workspace/PoseLib
EXCLUDE_FROM_ALL
SYSTEM
)
message(STATUS "Configuring PoseLib (local with EQUIRECTANGULAR)...")
if (FETCH_POSELIB)
FetchContent_MakeAvailable(PoseLib)
else()
find_package(PoseLib REQUIRED)
endif()
message(STATUS "Configuring PoseLib... done")

# Use local COLMAP with EQUIRECTANGULAR support
FetchContent_Declare(COLMAP
SOURCE_DIR /home/selstad/Desktop/colmap_workspace/colmap
EXCLUDE_FROM_ALL
)
message(STATUS "Configuring COLMAP (local with EQUIRECTANGULAR)...")
set(UNINSTALL_ENABLED OFF CACHE INTERNAL "")
set(GUI_ENABLED OFF CACHE INTERNAL "")
if (FETCH_COLMAP)
FetchContent_MakeAvailable(COLMAP)
else()
find_package(COLMAP REQUIRED)
endif()
message(STATUS "Configuring COLMAP... done")

set(CUDA_MIN_VERSION "7.0")
if(CUDA_ENABLED)
if(CMAKE_VERSION VERSION_LESS 3.17)
Expand Down
15 changes: 15 additions & 0 deletions glomap/estimators/view_graph_calibration.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ void ViewGraphCalibrator::Reset(
focals_.clear();
focals_.reserve(cameras.size());
for (const auto& [camera_id, camera] : cameras) {
// Skip spherical cameras - they don't have a focal length to estimate
if (camera.IsSpherical()) {
continue;
}
focals_[camera_id] = camera.Focal();
}

Expand Down Expand Up @@ -85,6 +89,12 @@ void ViewGraphCalibrator::AddImagePair(
const camera_t camera_id1 = images.at(image_pair.image_id1).camera_id;
const camera_t camera_id2 = images.at(image_pair.image_id2).camera_id;

// Skip image pairs involving spherical cameras
if (cameras.at(camera_id1).IsSpherical() ||
cameras.at(camera_id2).IsSpherical()) {
return;
}

if (camera_id1 == camera_id2) {
problem_->AddResidualBlock(
FetzerFocalLengthSameCameraCost::Create(
Expand Down Expand Up @@ -123,6 +133,11 @@ void ViewGraphCalibrator::CopyBackResults(
std::unordered_map<camera_t, Camera>& cameras) {
size_t counter = 0;
for (auto& [camera_id, camera] : cameras) {
// Skip spherical cameras - they were not optimized
if (camera.IsSpherical()) {
continue;
}

if (!problem_->HasParameterBlock(&(focals_[camera_id]))) continue;

// if the estimated parameter is too crazy, reject it
Expand Down
32 changes: 31 additions & 1 deletion glomap/scene/camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,48 @@ struct Camera : public colmap::Camera {

bool has_refined_focal_length = false;

// Returns true if this is a spherical camera model (e.g., EQUIRECTANGULAR)
// Spherical cameras do not have meaningful focal length or principal point
inline bool IsSpherical() const;

inline double Focal() const;
inline Eigen::Vector2d PrincipalPoint() const;
inline Eigen::Matrix3d GetK() const;
};

double Camera::Focal() const { return (FocalLengthX() + FocalLengthY()) / 2.0; }
bool Camera::IsSpherical() const {
// Check by model name since model_id may not be defined for EQUIRECTANGULAR
// in older COLMAP versions
return ModelName() == "EQUIRECTANGULAR" || ModelName() == "SPHERICAL";
}

double Camera::Focal() const {
// Spherical cameras don't have a meaningful focal length
// Return a dummy value based on image dimensions for compatibility
if (IsSpherical()) {
return static_cast<double>(std::max(width, height)) / M_PI;
}
return (FocalLengthX() + FocalLengthY()) / 2.0;
}

Eigen::Vector2d Camera::PrincipalPoint() const {
// Spherical cameras don't have a principal point in the traditional sense
// Return the image center for compatibility
if (IsSpherical()) {
return Eigen::Vector2d(width / 2.0, height / 2.0);
}
return Eigen::Vector2d(PrincipalPointX(), PrincipalPointY());
}

Eigen::Matrix3d Camera::GetK() const {
// Spherical cameras don't have a 3x3 intrinsic matrix
// Return identity-like matrix for compatibility (should not be used)
if (IsSpherical()) {
Eigen::Matrix3d K = Eigen::Matrix3d::Identity();
K(0, 2) = width / 2.0;
K(1, 2) = height / 2.0;
return K;
}
Eigen::Matrix3d K;
K << FocalLengthX(), 0, PrincipalPointX(), 0, FocalLengthY(),
PrincipalPointY(), 0, 0, 1;
Expand Down
Loading