Skip to content

(3.4) cmake: support Ceres 2.0.0 #2740

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 7, 2020
Merged
Show file tree
Hide file tree
Changes from all 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
90 changes: 57 additions & 33 deletions modules/sfm/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,56 @@ set(the_description "SFM algorithms")


### LIBMV LIGHT EXTERNAL DEPENDENCIES ###
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
find_package(Gflags QUIET)

find_package(Ceres QUIET)
if(NOT Ceres_FOUND) # Looks like Ceres find glog on the own, so separate search isn't necessary

if(NOT Gflags_FOUND) # Ceres find gflags on the own, so separate search isn't necessary
find_package(Gflags QUIET)
endif()
if(NOT Glog_FOUND) # Ceres find glog on the own, so separate search isn't necessary
find_package(Glog QUIET)
endif()

if((gflags_FOUND OR GFLAGS_FOUND OR GFLAGS_INCLUDE_DIRS) AND (glog_FOUND OR GLOG_FOUND OR GLOG_INCLUDE_DIRS))
set(_fname "${CMAKE_CURRENT_BINARY_DIR}/test_sfm_deps.cpp")
file(WRITE "${_fname}" "#include <glog/logging.h>\n#include <gflags/gflags.h>\nint main() { (void)(0); return 0; }\n")
try_compile(SFM_DEPS_OK "${CMAKE_BINARY_DIR}" "${_fname}"
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${GLOG_INCLUDE_DIRS};${GFLAGS_INCLUDE_DIRS}"
LINK_LIBRARIES ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES}
OUTPUT_VARIABLE OUTPUT
)
file(REMOVE "${_fname}")
message(STATUS "Checking SFM deps... ${SFM_DEPS_OK}")
if(NOT Gflags_FOUND OR NOT Glog_FOUND)
# try local search scripts
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
if(NOT Gflags_FOUND)
find_package(Gflags QUIET)
endif()
if(NOT Glog_FOUND)
find_package(Glog QUIET)
endif()
endif()

if(NOT DEFINED GFLAGS_INCLUDE_DIRS AND DEFINED GFLAGS_INCLUDE_DIR)
set(GFLAGS_INCLUDE_DIRS "${GFLAGS_INCLUDE_DIR}")
endif()
if(NOT DEFINED GLOG_INCLUDE_DIRS AND DEFINED GLOG_INCLUDE_DIR)
set(GLOG_INCLUDE_DIRS "${GLOG_INCLUDE_DIR}")
endif()

if((gflags_FOUND OR Gflags_FOUND OR GFLAGS_FOUND OR GFLAGS_INCLUDE_DIRS) AND (glog_FOUND OR Glog_FOUND OR GLOG_FOUND OR GLOG_INCLUDE_DIRS))
set(__cache_key "${GLOG_INCLUDE_DIRS} ~ ${GFLAGS_INCLUDE_DIRS} ~ ${GLOG_LIBRARIES} ~ ${GFLAGS_LIBRARIES}")
if(NOT DEFINED SFM_GLOG_GFLAGS_TEST_CACHE_KEY OR NOT (SFM_GLOG_GFLAGS_TEST_CACHE_KEY STREQUAL __cache_key))
set(__fname "${CMAKE_CURRENT_LIST_DIR}/cmake/checks/check_glog_gflags.cpp")
try_compile(
SFM_GLOG_GFLAGS_TEST "${CMAKE_BINARY_DIR}" "${__fname}"
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${GLOG_INCLUDE_DIRS};${GFLAGS_INCLUDE_DIRS}"
LINK_LIBRARIES ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES}
OUTPUT_VARIABLE __output
)
if(NOT SFM_GLOG_GFLAGS_TEST)
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Failed compilation check: ${__fname}\n"
"${__output}\n\n"
)
endif()
set(SFM_GLOG_GFLAGS_TEST "${SFM_GLOG_GFLAGS_TEST}" CACHE INTERNAL "")
set(SFM_GLOG_GFLAGS_TEST_CACHE_KEY "${__cache_key}" CACHE INTERNAL "")
message(STATUS "Checking SFM glog/gflags deps... ${SFM_GLOG_GFLAGS_TEST}")
endif()
unset(__cache_key)
set(SFM_DEPS_OK "${SFM_GLOG_GFLAGS_TEST}")
else()
set(SFM_DEPS_OK FALSE)
endif()
Expand Down Expand Up @@ -57,23 +90,14 @@ set(LIBMV_LIGHT_LIBS
if(Ceres_FOUND)
add_definitions("-DCERES_FOUND=1")
list(APPEND LIBMV_LIGHT_LIBS simple_pipeline)
list(APPEND LIBMV_LIGHT_INCLUDES "${CERES_INCLUDE_DIR}")
if(Ceres_VERSION VERSION_LESS 2.0.0)
list(APPEND LIBMV_LIGHT_INCLUDES "${CERES_INCLUDE_DIRS}")
endif()
else()
add_definitions("-DCERES_FOUND=0")
message(STATUS "CERES support is disabled. Ceres Solver for reconstruction API is required.")
endif()

### COMPILE WITH C++11 IF CERES WAS COMPILED WITH C++11

if(Ceres_FOUND)
list (FIND CERES_COMPILED_COMPONENTS "C++11" _index)
if (${_index} GREATER -1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
endif()

### DEFINE OPENCV SFM MODULE DEPENDENCIES ###

### CREATE OPENCV SFM MODULE ###

ocv_add_module(sfm
Expand All @@ -85,6 +109,7 @@ ocv_add_module(sfm
WRAP python
)

add_definitions(/DGLOG_NO_ABBREVIATED_SEVERITIES) # avoid ERROR macro conflict in glog (ceres dependency)

ocv_warnings_disable(CMAKE_CXX_FLAGS
-Wundef
Expand All @@ -97,12 +122,6 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS
-Wsuggest-override
)

if(UNIX)
if(CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
endif()
endif()

ocv_include_directories( ${LIBMV_LIGHT_INCLUDES} )
ocv_module_include_directories()

Expand All @@ -117,14 +136,16 @@ ocv_set_module_sources(HEADERS ${OPENCV_SFM_HDRS}

ocv_create_module()

# build libmv_light

### BUILD libmv_light ###

if(NOT CMAKE_VERSION VERSION_LESS 2.8.11) # See ocv_target_include_directories() implementation
if(TARGET ${the_module})
get_target_property(__include_dirs ${the_module} INCLUDE_DIRECTORIES)
include_directories(${__include_dirs})
endif()
endif()
include_directories(${OCV_TARGET_INCLUDE_DIRS_${the_module}})
#include_directories(${OCV_TARGET_INCLUDE_DIRS_${the_module}})
add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/src/libmv_light" "${CMAKE_CURRENT_BINARY_DIR}/src/libmv")

ocv_target_link_libraries(${the_module} ${LIBMV_LIGHT_LIBS})
Expand All @@ -133,6 +154,9 @@ ocv_target_link_libraries(${the_module} ${LIBMV_LIGHT_LIBS})
### CREATE OPENCV SFM TESTS ###

ocv_add_accuracy_tests()
if(Ceres_FOUND AND TARGET opencv_test_sfm)
ocv_target_link_libraries(opencv_test_sfm ${CERES_LIBRARIES})
endif ()


### CREATE OPENCV SFM SAMPLES ###
Expand Down
7 changes: 7 additions & 0 deletions modules/sfm/cmake/checks/check_glog_gflags.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include <glog/logging.h>
#include <gflags/gflags.h>
int main()
{
(void)(0);
return 0;
}
2 changes: 2 additions & 0 deletions modules/sfm/src/libmv_capi.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
#ifndef __OPENCV_SFM_LIBMV_CAPI__
#define __OPENCV_SFM_LIBMV_CAPI__

#include <memory>

#include "libmv/logging/logging.h"

#include "libmv/correspondence/feature.h"
Expand Down
7 changes: 7 additions & 0 deletions modules/sfm/src/libmv_light/libmv/base/vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,14 @@ class vector {
void reserve(unsigned int size) {
if (size > size_) {
T *data = static_cast<T *>(allocate(size));
#if defined(__GNUC__) && __GNUC__ < 5 // legacy compilers branch
memcpy(data, data_, sizeof(*data)*size_);
#else
for (int i = 0; i < size_; ++i)
new (&data[i]) T(std::move(data_[i]));
for (int i = 0; i < size_; ++i)
data_[i].~T();
#endif
allocator_.deallocate(data_, capacity_);
data_ = data;
capacity_ = size;
Expand Down
3 changes: 3 additions & 0 deletions modules/sfm/src/libmv_light/libmv/multiview/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,8 @@ TARGET_LINK_LIBRARIES(multiview LINK_PRIVATE ${GLOG_LIBRARY} numeric)
IF(TARGET Eigen3::Eigen)
TARGET_LINK_LIBRARIES(multiview LINK_PUBLIC Eigen3::Eigen)
ENDIF()
IF(CERES_LIBRARIES)
TARGET_LINK_LIBRARIES(multiview LINK_PRIVATE ${CERES_LIBRARIES})
ENDIF()

LIBMV_INSTALL_LIB(multiview)
2 changes: 1 addition & 1 deletion modules/sfm/src/libmv_light/libmv/multiview/fundamental.cc
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ bool EstimateFundamentalFromCorrespondences(
FundamentalSymmetricEpipolarCostFunctor,
2, // num_residuals
9>(fundamental_symmetric_epipolar_cost_function),
NULL,
nullptr,
F->data());
}

Expand Down
2 changes: 1 addition & 1 deletion modules/sfm/src/libmv_light/libmv/multiview/homography.cc
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ bool EstimateHomography2DFromCorrespondences(
HomographySymmetricGeometricCostFunctor,
4, // num_residuals
9>(homography_symmetric_geometric_cost_function),
NULL,
nullptr,
H->data());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ void EuclideanBundlePointsOnly(const DistortionModelType distortion_model,
marker.x,
marker.y,
1.0)),
NULL,
nullptr,
ceres_intrinsics,
current_camera_R_t,
&point->X(0));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ bool EuclideanIntersect(const vector<Marker> &markers,
EuclideanIntersectCostFunctor,
2, /* num_residuals */
3>(new EuclideanIntersectCostFunctor(marker, camera)),
NULL,
nullptr,
&X(0));
num_residuals++;
}
Expand Down
4 changes: 0 additions & 4 deletions modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,6 @@

namespace libmv {

Tracks::Tracks(const Tracks &other) {
markers_ = other.markers_;
}

Tracks::Tracks(const vector<Marker> &markers) : markers_(markers) {}

void Tracks::Insert(int image, int track, double x, double y, double weight) {
Expand Down
2 changes: 1 addition & 1 deletion modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class Tracks {
Tracks() { }

// Copy constructor for a tracks object.
Tracks(const Tracks &other);
Tracks(const Tracks &other) = default;

/// Construct a new tracks object using the given markers to start.
explicit Tracks(const vector<Marker> &markers);
Expand Down