From 23ee62a19b7a3e50d6dbf295359d8b1aff2e03fd Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 29 Oct 2020 23:39:55 +0000 Subject: [PATCH] cmake: support Ceres 2.0.0 --- modules/rgbd/CMakeLists.txt | 8 +- modules/sfm/CMakeLists.txt | 90 ++++++++++++------- .../sfm/cmake/checks/check_glog_gflags.cpp | 7 ++ .../sfm/src/libmv_light/libmv/base/vector.h | 7 ++ .../libmv/multiview/CMakeLists.txt | 3 + .../libmv/multiview/fundamental.cc | 2 +- .../libmv_light/libmv/multiview/homography.cc | 2 +- .../libmv/simple_pipeline/bundle.cc | 2 +- .../libmv/simple_pipeline/intersect.cc | 2 +- .../libmv/simple_pipeline/tracks.cc | 4 - .../libmv/simple_pipeline/tracks.h | 2 +- 11 files changed, 85 insertions(+), 44 deletions(-) create mode 100644 modules/sfm/cmake/checks/check_glog_gflags.cpp diff --git a/modules/rgbd/CMakeLists.txt b/modules/rgbd/CMakeLists.txt index 247c788a9c1..143cdf913af 100644 --- a/modules/rgbd/CMakeLists.txt +++ b/modules/rgbd/CMakeLists.txt @@ -2,10 +2,14 @@ set(the_description "RGBD algorithms") find_package(Ceres QUIET) ocv_define_module(rgbd opencv_core opencv_calib3d opencv_imgproc OPTIONAL opencv_viz WRAP python) -ocv_target_link_libraries(${the_module} ${CERES_LIBRARIES}) if(Ceres_FOUND) ocv_target_compile_definitions(${the_module} PUBLIC CERES_FOUND) + ocv_target_link_libraries(${the_module} ${CERES_LIBRARIES}) + if(Ceres_VERSION VERSION_LESS 2.0.0) + ocv_include_directories("${CERES_INCLUDE_DIRS}") + endif() + add_definitions(/DGLOG_NO_ABBREVIATED_SEVERITIES) # avoid ERROR macro conflict in glog (ceres dependency) else() - message(STATUS "CERES support is disabled. Ceres Solver is Required for Posegraph optimization") + message(STATUS "rgbd: CERES support is disabled. Ceres Solver is Required for Posegraph optimization") endif() diff --git a/modules/sfm/CMakeLists.txt b/modules/sfm/CMakeLists.txt index 53a8d4378a9..045a1fe6e45 100644 --- a/modules/sfm/CMakeLists.txt +++ b/modules/sfm/CMakeLists.txt @@ -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 \n#include \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() @@ -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 @@ -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 @@ -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() @@ -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}) @@ -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 ### diff --git a/modules/sfm/cmake/checks/check_glog_gflags.cpp b/modules/sfm/cmake/checks/check_glog_gflags.cpp new file mode 100644 index 00000000000..3353419cb3e --- /dev/null +++ b/modules/sfm/cmake/checks/check_glog_gflags.cpp @@ -0,0 +1,7 @@ +#include +#include +int main() +{ + (void)(0); + return 0; +} diff --git a/modules/sfm/src/libmv_light/libmv/base/vector.h b/modules/sfm/src/libmv_light/libmv/base/vector.h index 1931fb0b1f9..ac7a2feead0 100644 --- a/modules/sfm/src/libmv_light/libmv/base/vector.h +++ b/modules/sfm/src/libmv_light/libmv/base/vector.h @@ -121,7 +121,14 @@ class vector { void reserve(unsigned int size) { if (size > size_) { T *data = static_cast(allocate(size)); +#if 0 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; diff --git a/modules/sfm/src/libmv_light/libmv/multiview/CMakeLists.txt b/modules/sfm/src/libmv_light/libmv/multiview/CMakeLists.txt index 5b4b40b95e2..14c77fe5787 100644 --- a/modules/sfm/src/libmv_light/libmv/multiview/CMakeLists.txt +++ b/modules/sfm/src/libmv_light/libmv/multiview/CMakeLists.txt @@ -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) diff --git a/modules/sfm/src/libmv_light/libmv/multiview/fundamental.cc b/modules/sfm/src/libmv_light/libmv/multiview/fundamental.cc index a18dab0ffdf..768c39f5220 100644 --- a/modules/sfm/src/libmv_light/libmv/multiview/fundamental.cc +++ b/modules/sfm/src/libmv_light/libmv/multiview/fundamental.cc @@ -521,7 +521,7 @@ bool EstimateFundamentalFromCorrespondences( FundamentalSymmetricEpipolarCostFunctor, 2, // num_residuals 9>(fundamental_symmetric_epipolar_cost_function), - NULL, + nullptr, F->data()); } diff --git a/modules/sfm/src/libmv_light/libmv/multiview/homography.cc b/modules/sfm/src/libmv_light/libmv/multiview/homography.cc index 8816ef5aa6e..31d99277112 100644 --- a/modules/sfm/src/libmv_light/libmv/multiview/homography.cc +++ b/modules/sfm/src/libmv_light/libmv/multiview/homography.cc @@ -318,7 +318,7 @@ bool EstimateHomography2DFromCorrespondences( HomographySymmetricGeometricCostFunctor, 4, // num_residuals 9>(homography_symmetric_geometric_cost_function), - NULL, + nullptr, H->data()); } diff --git a/modules/sfm/src/libmv_light/libmv/simple_pipeline/bundle.cc b/modules/sfm/src/libmv_light/libmv/simple_pipeline/bundle.cc index 58006e72a2c..1a1568da831 100644 --- a/modules/sfm/src/libmv_light/libmv/simple_pipeline/bundle.cc +++ b/modules/sfm/src/libmv_light/libmv/simple_pipeline/bundle.cc @@ -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)); diff --git a/modules/sfm/src/libmv_light/libmv/simple_pipeline/intersect.cc b/modules/sfm/src/libmv_light/libmv/simple_pipeline/intersect.cc index d625c111951..f13d35ad66d 100644 --- a/modules/sfm/src/libmv_light/libmv/simple_pipeline/intersect.cc +++ b/modules/sfm/src/libmv_light/libmv/simple_pipeline/intersect.cc @@ -113,7 +113,7 @@ bool EuclideanIntersect(const vector &markers, EuclideanIntersectCostFunctor, 2, /* num_residuals */ 3>(new EuclideanIntersectCostFunctor(marker, camera)), - NULL, + nullptr, &X(0)); num_residuals++; } diff --git a/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.cc b/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.cc index d5d009708ba..c0d32bebdce 100644 --- a/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.cc +++ b/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.cc @@ -28,10 +28,6 @@ namespace libmv { -Tracks::Tracks(const Tracks &other) { - markers_ = other.markers_; -} - Tracks::Tracks(const vector &markers) : markers_(markers) {} void Tracks::Insert(int image, int track, double x, double y, double weight) { diff --git a/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.h b/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.h index a54a43659b7..906ec2b6911 100644 --- a/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.h +++ b/modules/sfm/src/libmv_light/libmv/simple_pipeline/tracks.h @@ -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 &markers);