diff --git a/CMakeLists.txt b/CMakeLists.txt index e9065d0..ee71cbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,8 +59,6 @@ if (CMAKE_CUDA_COMPILER) else() set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS}") endif() -else() - message(FATAL_ERROR "CMake does not find the CUDA SDK, which is required to build this application (even in case CUDA itself will not or cannot be used).") endif() # Cross-platform threading. See: @@ -354,7 +352,7 @@ if(Qt5Widgets_FOUND) endif() if (CMAKE_CUDA_COMPILER) - target_compile_options(libvis PUBLIC -DLIBVIS_HAVE_CUDA) # TODO: is this used anywhere? + target_compile_options(libvis PUBLIC -DLIBVIS_HAVE_CUDA) endif() target_include_directories(libvis @@ -398,6 +396,12 @@ target_link_libraries(libvis png #_static Threads::Threads ) +if(CMAKE_CUDA_COMPILER) + target_link_libraries(libvis + PUBLIC + ${CUDA_cusolver_LIBRARY} + ) +endif() if(VULKAN_FOUND) target_link_libraries(libvis PRIVATE vulkan @@ -473,6 +477,7 @@ if (CMAKE_CUDA_COMPILER) ) target_link_libraries(libvis_cuda PUBLIC libvis + CUDA::cublas ) target_compile_options(libvis_cuda PRIVATE $<$:-use_fast_math> @@ -493,14 +498,12 @@ if (CMAKE_CUDA_COMPILER) gtest_main Threads::Threads libvis_cuda - CUDA::cublas # TODO: currently required because of lm_optimizer.h. That should not be necessary. ) target_include_directories(libvis_cuda_test PRIVATE ${gtest_SOURCE_DIR}/include #${gtest_SOURCE_DIR} ${OpenCV_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS} - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} # TODO: currently required because of lm_optimizer.h. That should not be necessary. ) add_test(libvis_cuda_test libvis_cuda_test @@ -533,15 +536,13 @@ set_property(TARGET libvis_test PROPERTY FOLDER "libvis") target_link_libraries(libvis_test PRIVATE gtest Threads::Threads - libvis - CUDA::cublas # TODO: currently required because of lm_optimizer.h. That should not be necessary. + libvis ) target_include_directories(libvis_test PRIVATE ${gtest_SOURCE_DIR}/include #${gtest_SOURCE_DIR} ${OpenCV_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS} - ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} # TODO: currently required because of lm_optimizer.h. That should not be necessary. ) add_test(libvis_test libvis_test diff --git a/applications/camera_calibration/CMakeLists.txt b/applications/camera_calibration/CMakeLists.txt index c2b52b4..53bd13e 100644 --- a/applications/camera_calibration/CMakeLists.txt +++ b/applications/camera_calibration/CMakeLists.txt @@ -1,63 +1,141 @@ -if (CMAKE_CUDA_COMPILER) - # Make CMake find the Find.cmake files in the cmake subdirectory. - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Make CMake find the Find.cmake files in the cmake subdirectory. +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Packaged third-party library: AprilTag +file(GLOB CAMERA_CALIBRATION_APRILTAG_SRC + "third_party/apriltag/*.h" + "third_party/apriltag/*.c" + "third_party/apriltag/common/*.h" + "third_party/apriltag/common/*.c" +) +add_library(camera_calibration_apriltag ${CAMERA_CALIBRATION_APRILTAG_SRC}) +set_property(TARGET camera_calibration_apriltag PROPERTY C_STANDARD 99) +target_include_directories(camera_calibration_apriltag PRIVATE third_party/apriltag/) +set_target_properties(camera_calibration_apriltag PROPERTIES + POSITION_INDEPENDENT_CODE ON +) + +# Packaged third-party library: YAML-CPP +add_subdirectory(third_party/yaml-cpp-0.6.0) + +# Find external library librealsense2 for live RealSense camera support +find_package(realsense2) +if (realsense2_FOUND) + add_definitions(-DHAVE_REALSENSE) +endif() + +# Find external library Structure SDK for live Structure Core camera support +find_package(Structure) + +# Find external library OpenGV +find_package(opengv REQUIRED) + + +# Base library for both the main executable and the unit test executable +# file(GLOB CAMERA_CALIBRATION_SRC +# "src/*.h" +# "src/*.cc" +# "src/*.cu" +# "src/*.cuh" +# ) +set(CAMERA_CALIBRATION_SRC + src/camera_calibration/bundle_adjustment/ba_state.cc + src/camera_calibration/bundle_adjustment/ba_state.h + src/camera_calibration/bundle_adjustment/joint_optimization.cc + src/camera_calibration/bundle_adjustment/joint_optimization.h + src/camera_calibration/bundle_adjustment/joint_optimization_jacobians.h - # Packaged third-party library: AprilTag - file(GLOB CAMERA_CALIBRATION_APRILTAG_SRC - "third_party/apriltag/*.h" - "third_party/apriltag/*.c" - "third_party/apriltag/common/*.h" - "third_party/apriltag/common/*.c" - ) - add_library(camera_calibration_apriltag ${CAMERA_CALIBRATION_APRILTAG_SRC}) - set_property(TARGET camera_calibration_apriltag PROPERTY C_STANDARD 99) - target_include_directories(camera_calibration_apriltag PRIVATE third_party/apriltag/) - set_target_properties(camera_calibration_apriltag PROPERTIES - POSITION_INDEPENDENT_CODE ON - ) + src/camera_calibration/calibration_initialization/dense_initialization.cc + src/camera_calibration/calibration_initialization/dense_initialization.h - # Packaged third-party library: YAML-CPP - add_subdirectory(third_party/yaml-cpp-0.6.0) - - # Find external library librealsense2 for live RealSense camera support - find_package(realsense2) - if (realsense2_FOUND) - add_definitions(-DHAVE_REALSENSE) - endif() + src/camera_calibration/feature_detection/cpu_refinement_by_matching.h + src/camera_calibration/feature_detection/cpu_refinement_by_symmetry.h + src/camera_calibration/feature_detection/feature_detector.h + src/camera_calibration/feature_detection/feature_detector_tagged_pattern.cc + src/camera_calibration/feature_detection/feature_detector_tagged_pattern.h - # Find external library Structure SDK for live Structure Core camera support - find_package(Structure) + src/camera_calibration/image_input/image_input.cc + src/camera_calibration/image_input/image_input.h + src/camera_calibration/image_input/image_input_realsense.cc + src/camera_calibration/image_input/image_input_realsense.h + src/camera_calibration/image_input/image_input_structure.cc + src/camera_calibration/image_input/image_input_structure.h + src/camera_calibration/image_input/image_input_v4l2.cc + src/camera_calibration/image_input/image_input_v4l2.h - # Find external library OpenGV - find_package(opengv REQUIRED) - - - # Base library for both the main executable and the unit test executable - # file(GLOB CAMERA_CALIBRATION_SRC - # "src/*.h" - # "src/*.cc" - # "src/*.cu" - # "src/*.cuh" - # ) - set(CAMERA_CALIBRATION_SRC - src/camera_calibration/bundle_adjustment/ba_state.cc - src/camera_calibration/bundle_adjustment/ba_state.h + src/camera_calibration/io/calibration_io.cc + src/camera_calibration/io/calibration_io.h + + src/camera_calibration/local_parametrizations/direction_parametrization.h + src/camera_calibration/local_parametrizations/line_parametrization.h + src/camera_calibration/local_parametrizations/quaternion_parametrization.h + + src/camera_calibration/models/camera_model.h + src/camera_calibration/models/central_generic.cc + src/camera_calibration/models/central_generic.h + src/camera_calibration/models/central_opencv.cc + src/camera_calibration/models/central_opencv.h + src/camera_calibration/models/central_radial.cc + src/camera_calibration/models/central_radial.h + src/camera_calibration/models/central_thin_prism_fisheye.cc + src/camera_calibration/models/central_thin_prism_fisheye.h + src/camera_calibration/models/noncentral_generic.cc + src/camera_calibration/models/noncentral_generic.h + src/camera_calibration/models/parametric.cc + src/camera_calibration/models/parametric.h + + src/camera_calibration/relative_pose_initialization/algorithms.h + src/camera_calibration/relative_pose_initialization/central_camera_3d_target.cc + src/camera_calibration/relative_pose_initialization/central_camera_planar_target.cc + src/camera_calibration/relative_pose_initialization/noncentral_camera_3d_target.cc + src/camera_calibration/relative_pose_initialization/noncentral_camera_planar_target.cc + + src/camera_calibration/tools/bundle_adjustment.cc + src/camera_calibration/tools/compare_calibrations.cc + src/camera_calibration/tools/compare_point_clouds.cc + src/camera_calibration/tools/convert_dataset.cc + src/camera_calibration/tools/create_legends.cc + src/camera_calibration/tools/intersect_datasets.cc + src/camera_calibration/tools/localization_accuracy_test.cc + src/camera_calibration/tools/render_synthetic_dataset.cc + src/camera_calibration/tools/stereo_depth_estimation.cc + src/camera_calibration/tools/tools.h + src/camera_calibration/tools/visualize_calibration.cc + + src/camera_calibration/ui/calibration_window.cc + src/camera_calibration/ui/calibration_window.h + src/camera_calibration/ui/live_image_consumer.cc + src/camera_calibration/ui/live_image_consumer.h + src/camera_calibration/ui/main_window.cc + src/camera_calibration/ui/main_window.h + src/camera_calibration/ui/pattern_display.cc + src/camera_calibration/ui/pattern_display.h + src/camera_calibration/ui/settings_window.cc + src/camera_calibration/ui/settings_window.h + + src/camera_calibration/b_spline.h + src/camera_calibration/calibration.cc + src/camera_calibration/calibration.h + src/camera_calibration/calibration_report.cc + src/camera_calibration/calibration_report.h + src/camera_calibration/dataset.cc + src/camera_calibration/dataset.h + src/camera_calibration/fitting_report.h + src/camera_calibration/hash_vec2i.h + src/camera_calibration/util.cc + src/camera_calibration/util.h +) +if(CMAKE_CUDA_COMPILER) + list(APPEND CAMERA_CALIBRATION_SRC src/camera_calibration/bundle_adjustment/cuda_joint_optimization.cc src/camera_calibration/bundle_adjustment/cuda_joint_optimization.cu src/camera_calibration/bundle_adjustment/cuda_joint_optimization.cuh src/camera_calibration/bundle_adjustment/cuda_joint_optimization.h - src/camera_calibration/bundle_adjustment/joint_optimization.cc - src/camera_calibration/bundle_adjustment/joint_optimization.h - src/camera_calibration/bundle_adjustment/joint_optimization_jacobians.h - - src/camera_calibration/calibration_initialization/dense_initialization.cc - src/camera_calibration/calibration_initialization/dense_initialization.h - + src/camera_calibration/cuda/cuda_matrix.cuh src/camera_calibration/cuda/cuda_util.cuh - - src/camera_calibration/feature_detection/cpu_refinement_by_matching.h - src/camera_calibration/feature_detection/cpu_refinement_by_symmetry.h + src/camera_calibration/feature_detection/cuda_refinement_by_matching.cc src/camera_calibration/feature_detection/cuda_refinement_by_matching.cu src/camera_calibration/feature_detection/cuda_refinement_by_matching.cuh @@ -68,199 +146,131 @@ if (CMAKE_CUDA_COMPILER) src/camera_calibration/feature_detection/cuda_refinement_by_symmetry.h src/camera_calibration/feature_detection/cuda_util.cu src/camera_calibration/feature_detection/cuda_util.cuh - src/camera_calibration/feature_detection/feature_detector.h - src/camera_calibration/feature_detection/feature_detector_tagged_pattern.cc - src/camera_calibration/feature_detection/feature_detector_tagged_pattern.h - - src/camera_calibration/image_input/image_input.cc - src/camera_calibration/image_input/image_input.h - src/camera_calibration/image_input/image_input_realsense.cc - src/camera_calibration/image_input/image_input_realsense.h - src/camera_calibration/image_input/image_input_structure.cc - src/camera_calibration/image_input/image_input_structure.h - src/camera_calibration/image_input/image_input_v4l2.cc - src/camera_calibration/image_input/image_input_v4l2.h - - src/camera_calibration/io/calibration_io.cc - src/camera_calibration/io/calibration_io.h - - src/camera_calibration/local_parametrizations/direction_parametrization.h - src/camera_calibration/local_parametrizations/line_parametrization.h - src/camera_calibration/local_parametrizations/quaternion_parametrization.h - - src/camera_calibration/models/camera_model.h - src/camera_calibration/models/central_generic.cc - src/camera_calibration/models/central_generic.h - src/camera_calibration/models/central_opencv.cc - src/camera_calibration/models/central_opencv.h - src/camera_calibration/models/central_radial.cc - src/camera_calibration/models/central_radial.h - src/camera_calibration/models/central_thin_prism_fisheye.cc - src/camera_calibration/models/central_thin_prism_fisheye.h - src/camera_calibration/models/noncentral_generic.cc - src/camera_calibration/models/noncentral_generic.h - src/camera_calibration/models/parametric.cc - src/camera_calibration/models/parametric.h - - src/camera_calibration/relative_pose_initialization/algorithms.h - src/camera_calibration/relative_pose_initialization/central_camera_3d_target.cc - src/camera_calibration/relative_pose_initialization/central_camera_planar_target.cc - src/camera_calibration/relative_pose_initialization/noncentral_camera_3d_target.cc - src/camera_calibration/relative_pose_initialization/noncentral_camera_planar_target.cc - - src/camera_calibration/tools/bundle_adjustment.cc - src/camera_calibration/tools/compare_calibrations.cc - src/camera_calibration/tools/compare_point_clouds.cc - src/camera_calibration/tools/convert_dataset.cc - src/camera_calibration/tools/create_legends.cc - src/camera_calibration/tools/intersect_datasets.cc - src/camera_calibration/tools/localization_accuracy_test.cc - src/camera_calibration/tools/render_synthetic_dataset.cc - src/camera_calibration/tools/stereo_depth_estimation.cc - src/camera_calibration/tools/tools.h - src/camera_calibration/tools/visualize_calibration.cc - - src/camera_calibration/ui/calibration_window.cc - src/camera_calibration/ui/calibration_window.h - src/camera_calibration/ui/live_image_consumer.cc - src/camera_calibration/ui/live_image_consumer.h - src/camera_calibration/ui/main_window.cc - src/camera_calibration/ui/main_window.h - src/camera_calibration/ui/pattern_display.cc - src/camera_calibration/ui/pattern_display.h - src/camera_calibration/ui/settings_window.cc - src/camera_calibration/ui/settings_window.h - - src/camera_calibration/b_spline.h - src/camera_calibration/calibration.cc - src/camera_calibration/calibration.h - src/camera_calibration/calibration_report.cc - src/camera_calibration/calibration_report.h - src/camera_calibration/dataset.cc - src/camera_calibration/dataset.h - src/camera_calibration/fitting_report.h - src/camera_calibration/hash_vec2i.h - src/camera_calibration/util.cc - src/camera_calibration/util.h ) - add_library(camera_calibration_baselib SHARED - ${CAMERA_CALIBRATION_SRC} - ) - set_target_properties(camera_calibration_baselib PROPERTIES POSITION_INDEPENDENT_CODE ON) - target_compile_options(camera_calibration_baselib - PUBLIC - "${LIBVIS_WARNING_OPTIONS}" - # NOTE: The -march=native was required to be able to use opengv, otherwise - # it would just crash when calling an opengv function. I suspect - # that it might be because the Eigen objects passed to opengv might - # be compiled to have different layouts then. - $<$:-march=native> +endif() + +add_library(camera_calibration_baselib SHARED + ${CAMERA_CALIBRATION_SRC} +) +set_target_properties(camera_calibration_baselib PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_compile_options(camera_calibration_baselib + PUBLIC + "${LIBVIS_WARNING_OPTIONS}" + # NOTE: The -march=native was required to be able to use opengv, otherwise + # it would just crash when calling an opengv function. I suspect + # that it might be because the Eigen objects passed to opengv might + # be compiled to have different layouts then. + $<$:-march=native> # $<$:-use_fast_math> - $<$:--expt-relaxed-constexpr> - ) - target_include_directories(camera_calibration_baselib PRIVATE - src - ${CERES_INCLUDE_DIRS} - third_party/apriltag - third_party/yaml-cpp-0.6.0/include - ${realsense_INCLUDE_DIR} - ${OpenCV_INCLUDE_DIRS} - ) + $<$:--expt-relaxed-constexpr> +) +target_include_directories(camera_calibration_baselib PRIVATE + src + ${CERES_INCLUDE_DIRS} + third_party/apriltag + third_party/yaml-cpp-0.6.0/include + ${realsense_INCLUDE_DIR} + ${OpenCV_INCLUDE_DIRS} +) +if(CMAKE_CUDA_COMPILER) if (CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 11) target_include_directories(camera_calibration_baselib PRIVATE third_party/cub-1.8.0 ) endif() target_link_libraries(camera_calibration_baselib PUBLIC - libvis libvis_cuda - libvis_external_io - ${CERES_LIBRARIES} CUDA::cublas - opengv - camera_calibration_apriltag - yaml-cpp2 - ${OpenCV_LIBS} - ${realsense2_LIBRARY} - Qt5::Widgets - ${Boost_LIBRARIES} - v4l2 - X11 ) - - if (TARGET StructurePrebuilt) - target_link_libraries(camera_calibration_baselib PUBLIC - StructurePrebuilt - ) - target_compile_definitions(camera_calibration_baselib PUBLIC HAVE_STRUCTURE) - endif() - - # # For cuda-memcheck - # target_compile_options(camera_calibration_baselib - # PUBLIC - # $<$:-Xcompiler -rdynamic> - # $<$:-lineinfo> - # ) - - - # Main executable - add_executable(camera_calibration - src/camera_calibration/main.cc - ) - target_include_directories(camera_calibration PRIVATE - src - third_party/yaml-cpp-0.6.0/include - ) - target_link_libraries(camera_calibration PRIVATE - camera_calibration_baselib - ${Boost_LIBRARIES} - yaml-cpp2 - libvis_external_io - ) - set_target_properties(camera_calibration PROPERTIES - POSITION_INDEPENDENT_CODE ON - ) - - - # Resource files for unit tests - ADD_CUSTOM_TARGET(camera_calibration_test_resources ALL - COMMAND ${CMAKE_COMMAND} -E create_symlink - ${CMAKE_CURRENT_SOURCE_DIR}/test_data - ${CMAKE_CURRENT_BINARY_DIR}/test_data - ) - - # Unit tests - add_executable(camera_calibration_test - src/camera_calibration/test/b_spline_test.cc - src/camera_calibration/test/camera_unique_representation_test.cc - src/camera_calibration/test/central_generic_test.cc - src/camera_calibration/test/central_opencv_test.cc - src/camera_calibration/test/central_radial_test.cc - src/camera_calibration/test/central_thin_prism_fisheye_test.cc - src/camera_calibration/test/dummy_cuda_file.cu - src/camera_calibration/test/feature_detection_test.cc - src/camera_calibration/test/io_test.cc - src/camera_calibration/test/main.cc - src/camera_calibration/test/noncentral_generic_test.cc - src/camera_calibration/test/opengv_test.cc - src/camera_calibration/test/optimization_test.cc - src/camera_calibration/test/relative_pose_initialization_test.cc - src/camera_calibration/test/util_test.cc - ) - add_dependencies(camera_calibration_test camera_calibration_test_resources) - target_link_libraries(camera_calibration_test - camera_calibration_baselib - gtest - pthread - yaml-cpp2 - ) - target_include_directories(camera_calibration_test PRIVATE - src - ${gtest_SOURCE_DIR}/include - ${gtest_SOURCE_DIR} - third_party/yaml-cpp-0.6.0/include - ) - add_test(camera_calibration_test - camera_calibration_test +endif() + +target_link_libraries(camera_calibration_baselib PUBLIC + libvis + libvis_external_io + ${CERES_LIBRARIES} + opengv + camera_calibration_apriltag + yaml-cpp2 + ${OpenCV_LIBS} + ${realsense2_LIBRARY} + Qt5::Widgets + ${Boost_LIBRARIES} + v4l2 + X11 +) + +if (TARGET StructurePrebuilt) + target_link_libraries(camera_calibration_baselib PUBLIC + StructurePrebuilt ) + target_compile_definitions(camera_calibration_baselib PUBLIC HAVE_STRUCTURE) endif() + +# # For cuda-memcheck +# target_compile_options(camera_calibration_baselib +# PUBLIC +# $<$:-Xcompiler -rdynamic> +# $<$:-lineinfo> +# ) + + +# Main executable +add_executable(camera_calibration + src/camera_calibration/main.cc +) +target_include_directories(camera_calibration PRIVATE + src + third_party/yaml-cpp-0.6.0/include +) +target_link_libraries(camera_calibration PRIVATE + camera_calibration_baselib + ${Boost_LIBRARIES} + yaml-cpp2 + libvis_external_io +) +set_target_properties(camera_calibration PROPERTIES + POSITION_INDEPENDENT_CODE ON +) + + +# Resource files for unit tests +ADD_CUSTOM_TARGET(camera_calibration_test_resources ALL + COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/test_data + ${CMAKE_CURRENT_BINARY_DIR}/test_data +) + +# Unit tests +add_executable(camera_calibration_test + src/camera_calibration/test/b_spline_test.cc + src/camera_calibration/test/camera_unique_representation_test.cc + src/camera_calibration/test/central_generic_test.cc + src/camera_calibration/test/central_opencv_test.cc + src/camera_calibration/test/central_radial_test.cc + src/camera_calibration/test/central_thin_prism_fisheye_test.cc + src/camera_calibration/test/dummy_cuda_file.cu + src/camera_calibration/test/feature_detection_test.cc + src/camera_calibration/test/io_test.cc + src/camera_calibration/test/main.cc + src/camera_calibration/test/noncentral_generic_test.cc + src/camera_calibration/test/opengv_test.cc + src/camera_calibration/test/optimization_test.cc + src/camera_calibration/test/relative_pose_initialization_test.cc + src/camera_calibration/test/util_test.cc +) +add_dependencies(camera_calibration_test camera_calibration_test_resources) +target_link_libraries(camera_calibration_test + camera_calibration_baselib + gtest + pthread + yaml-cpp2 +) +target_include_directories(camera_calibration_test PRIVATE + src + ${gtest_SOURCE_DIR}/include + ${gtest_SOURCE_DIR} + third_party/yaml-cpp-0.6.0/include +) +add_test(camera_calibration_test + camera_calibration_test +) diff --git a/applications/camera_calibration/src/camera_calibration/bundle_adjustment/joint_optimization_jacobians.h b/applications/camera_calibration/src/camera_calibration/bundle_adjustment/joint_optimization_jacobians.h index 8983194..ac6e0d3 100644 --- a/applications/camera_calibration/src/camera_calibration/bundle_adjustment/joint_optimization_jacobians.h +++ b/applications/camera_calibration/src/camera_calibration/bundle_adjustment/joint_optimization_jacobians.h @@ -28,7 +28,7 @@ #pragma once -#include +#include "../cuda_shims.h" #include diff --git a/applications/camera_calibration/src/camera_calibration/cuda_shims.h b/applications/camera_calibration/src/camera_calibration/cuda_shims.h new file mode 100644 index 0000000..b27ae1d --- /dev/null +++ b/applications/camera_calibration/src/camera_calibration/cuda_shims.h @@ -0,0 +1,52 @@ +// Copyright 2019 ETH Zürich, Thomas Schöps +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#ifdef LIBVIS_HAVE_CUDA +#include +#define USE_CUDA_DEFAULT true + +#else +#define USE_CUDA_DEFAULT false + +#ifndef __host__ +#define __host__ +#endif + + +#ifndef __device__ +#define __device__ +#endif + +#if !defined(__forceinline__) +#include +#define __forceinline__ EIGEN_ALWAYS_INLINE +#endif + +#endif diff --git a/applications/camera_calibration/src/camera_calibration/feature_detection/feature_detector_tagged_pattern.cc b/applications/camera_calibration/src/camera_calibration/feature_detection/feature_detector_tagged_pattern.cc index bd4ff3c..2e9656e 100644 --- a/applications/camera_calibration/src/camera_calibration/feature_detection/feature_detector_tagged_pattern.cc +++ b/applications/camera_calibration/src/camera_calibration/feature_detection/feature_detector_tagged_pattern.cc @@ -32,10 +32,17 @@ #include #include -#include + +#include "../cuda_shims.h" +#ifdef LIBVIS_HAVE_CUDA #include +#endif + #include +#ifdef LIBVIS_HAVE_CUDA #include +#endif + #include #include #include @@ -43,12 +50,20 @@ #include "camera_calibration/feature_detection/cpu_refinement_by_matching.h" #include "camera_calibration/feature_detection/cpu_refinement_by_symmetry.h" +#ifdef LIBVIS_HAVE_CUDA #include "camera_calibration/feature_detection/cuda_refinement_by_matching.h" #include "camera_calibration/feature_detection/cuda_refinement_by_symmetry.h" #include "camera_calibration/feature_detection/cuda_util.cuh" +#endif #include "camera_calibration/hash_vec2i.h" +#ifdef LIBVIS_HAVE_CUDA +#define USE_CUDA_DEFAULT true +#else +#define USE_CUDA_DEFAULT false +#endif + namespace vis { /// Attributes belonging to FeatureDetectorTaggedPattern that shall not be part @@ -57,14 +72,19 @@ struct FeatureDetectorTaggedPatternPrivate { FeatureDetectorTaggedPatternPrivate() = default; ~FeatureDetectorTaggedPatternPrivate() { + +#ifdef LIBVIS_HAVE_CUDA if (cuda_objects_initialized) { cudaDestroyTextureObject(image_texture); cudaDestroyTextureObject(gradient_image_texture); cudaFree(cost_buffer); } +#endif } - bool use_cuda = true; + bool use_cuda = USE_CUDA_DEFAULT; + +#ifdef LIBVIS_HAVE_CUDA bool cuda_objects_initialized = false; CUDABufferPtr cuda_image; @@ -80,10 +100,14 @@ struct FeatureDetectorTaggedPatternPrivate { CUDABufferPtr state_buffer; CUDABufferPtr rendered_samples; CUDABufferPtr local_pattern_tr_pixel_buffer; - +#endif + vector samples; // homogeneously distributed in [-1, 1] x [-1, 1]. + +#ifdef LIBVIS_HAVE_CUDA CUDABufferPtr samples_gpu; CUDABufferPtr pattern_samples_gpu; +#endif /// Attention, the index of the object in this vector may be different from /// its pattern_index. Only the latter is relevant. @@ -248,9 +272,11 @@ void FeatureDetectorTaggedPattern::DetectFeatures( } // Prepare CUDA resources. +#ifdef LIBVIS_HAVE_CUDA if (d->use_cuda) { PrepareCUDAResources(image.width(), image.height()); } +#endif // Prepare AprilTag detector. PrepareAprilTagDetector(); @@ -262,10 +288,13 @@ void FeatureDetectorTaggedPattern::DetectFeatures( // Compute gradient image on CPU or GPU. Image gradient_image; Image gradmag_image; +#ifdef LIBVIS_HAVE_CUDA if (d->use_cuda) { d->cuda_image->UploadAsync(/*stream*/ 0, gray_image); ComputeGradientImageCUDA(d->cuda_image->ToCUDA(), gray_image.width(), gray_image.height(), &d->cuda_gradient_image->ToCUDA()); - } else { + } else +#endif + { gradient_image.SetSize(gray_image.size()); gradmag_image.SetSize(gray_image.size()); int width = gray_image.width(); @@ -1361,6 +1390,7 @@ void FeatureDetectorTaggedPattern::PredictAndDetectFeatures( } // while (num_predictions > 0) } +#ifdef LIBVIS_HAVE_CUDA void FeatureDetectorTaggedPattern::PrepareCUDAResources(int image_width, int image_height) { if (!d->cuda_image || d->cuda_image->width() < image_width || @@ -1417,6 +1447,7 @@ void FeatureDetectorTaggedPattern::PrepareCUDAResources(int image_width, int ima d->cuda_objects_initialized = true; } +#endif void FeatureDetectorTaggedPattern::PrepareAprilTagDetector() { if (!d->apriltag_detector) { @@ -1484,6 +1515,8 @@ void FeatureDetectorTaggedPattern::RefineFeatureDetections( const int num_intensity_samples = (1 / 8.) * d->samples.size(); const int num_gradient_samples = d->samples.size(); + +#ifdef LIBVIS_HAVE_CUDA if (d->use_cuda) { if (refinement_type != FeatureRefinement::GradientsXY && refinement_type != FeatureRefinement::Intensities) { LOG(FATAL) << "CUDA-based feature refinement only supports the gradients_xy and intensities refinement types."; @@ -1531,7 +1564,9 @@ void FeatureDetectorTaggedPattern::RefineFeatureDetections( this_output = filtered_detections[i]; } } - } else { + } else +#endif + { for (usize i = 0; i < filtered_predictions.size(); ++ i) { FeatureDetection& this_output = output[filtered_to_original_index[i]]; diff --git a/applications/camera_calibration/src/camera_calibration/models/central_generic.cc b/applications/camera_calibration/src/camera_calibration/models/central_generic.cc index 334a9fc..dc96d2d 100644 --- a/applications/camera_calibration/src/camera_calibration/models/central_generic.cc +++ b/applications/camera_calibration/src/camera_calibration/models/central_generic.cc @@ -28,12 +28,17 @@ #include "camera_calibration/models/central_generic.h" -#include +#include "../cuda_shims.h" +#ifdef LIBVIS_HAVE_CUDA #include +#endif #include #include "camera_calibration/local_parametrizations/direction_parametrization.h" + +#ifdef LIBVIS_HAVE_CUDA #include "camera_calibration/models/cuda_central_generic_model.cuh" +#endif // Include Jacobians implementation #include "camera_calibration/models/central_generic_jacobians.cc" @@ -621,6 +626,7 @@ Mat3d CentralGenericModel::ChooseNiceCameraOrientation() { } CUDACameraModel* CentralGenericModel::CreateCUDACameraModel() { +#ifdef LIBVIS_HAVE_CUDA CUDACentralGenericModel* result = new CUDACentralGenericModel(); result->m_width = m_width; @@ -644,6 +650,9 @@ CUDACameraModel* CentralGenericModel::CreateCUDACameraModel() { result->m_grid = m_cuda_grid->ToCUDA(); return result; +#else + return nullptr; +#endif } } diff --git a/applications/camera_calibration/src/camera_calibration/tools/stereo_depth_estimation.cc b/applications/camera_calibration/src/camera_calibration/tools/stereo_depth_estimation.cc index 931b4b9..c8966f0 100644 --- a/applications/camera_calibration/src/camera_calibration/tools/stereo_depth_estimation.cc +++ b/applications/camera_calibration/src/camera_calibration/tools/stereo_depth_estimation.cc @@ -29,6 +29,7 @@ #include "camera_calibration/tools/tools.h" #include +#include "../cuda_shims.h" #include #include #include @@ -39,8 +40,10 @@ #include "camera_calibration/io/calibration_io.h" #include "camera_calibration/models/central_generic.h" #include "camera_calibration/models/central_thin_prism_fisheye.h" +#ifdef LIBVIS_HAVE_CUDA #include "camera_calibration/models/cuda_camera_model.cuh" #include "camera_calibration/models/cuda_central_generic_model.cuh" +#endif namespace vis { diff --git a/libvis/src/libvis/cuda/patch_match_stereo.h b/libvis/src/libvis/cuda/patch_match_stereo.h index 89672e1..33d1a33 100644 --- a/libvis/src/libvis/cuda/patch_match_stereo.h +++ b/libvis/src/libvis/cuda/patch_match_stereo.h @@ -29,10 +29,12 @@ #pragma once +#ifdef LIBVIS_HAVE_CUDA #include #include "libvis/cuda/cuda_buffer.h" #include "libvis/cuda/cuda_unprojection_lookup.h" +#endif #include "libvis/cuda/pixel_corner_projector.h" #include "libvis/image.h" #include "libvis/libvis.h" diff --git a/libvis/src/libvis/cuda/pixel_corner_projector.cuh b/libvis/src/libvis/cuda/pixel_corner_projector.cuh index 7aaaf16..caceaf4 100644 --- a/libvis/src/libvis/cuda/pixel_corner_projector.cuh +++ b/libvis/src/libvis/cuda/pixel_corner_projector.cuh @@ -29,10 +29,12 @@ #pragma once +#ifdef LIBVIS_HAVE_CUDA #include #include - #include "libvis/cuda/cuda_buffer.cuh" +#endif + #include "libvis/logging.h" namespace vis { @@ -49,8 +51,10 @@ struct PixelCornerProjector_ { min_ny(other.min_ny), max_nx(other.max_nx), max_ny(other.max_ny), +#ifdef LIBVIS_HAVE_CUDA grid2(other.grid2), grid3(other.grid3), +#endif omega(other.omega), two_tan_omega_half(other.two_tan_omega_half), fx(other.fx), fy(other.fy), cx(other.cx), cy(other.cy), @@ -517,9 +521,11 @@ struct PixelCornerProjector_ { float max_nx; float max_ny; +#ifdef LIBVIS_HAVE_CUDA CUDABuffer_ grid2; CUDABuffer_ grid3; - +#endif + float omega; float two_tan_omega_half; float fx, fy, cx, cy; diff --git a/libvis/src/libvis/cuda/pixel_corner_projector.h b/libvis/src/libvis/cuda/pixel_corner_projector.h index c9962ce..e7b1022 100644 --- a/libvis/src/libvis/cuda/pixel_corner_projector.h +++ b/libvis/src/libvis/cuda/pixel_corner_projector.h @@ -29,10 +29,12 @@ #pragma once +#ifdef LIBVIS_HAVE_CUDA #include +#include "libvis/cuda/cuda_buffer.h" +#endif #include "libvis/camera.h" -#include "libvis/cuda/cuda_buffer.h" #include "libvis/cuda/pixel_corner_projector.cuh" #include "libvis/eigen.h" diff --git a/libvis/src/libvis/lm_optimizer.h b/libvis/src/libvis/lm_optimizer.h index a310690..1b099ff 100644 --- a/libvis/src/libvis/lm_optimizer.h +++ b/libvis/src/libvis/lm_optimizer.h @@ -31,10 +31,12 @@ #include +#ifdef LIBVIS_HAVE_CUDA // Only required for optional matrix multiplication on the GPU: #include #include #include +#endif #include @@ -1322,9 +1324,12 @@ class LMOptimizer { Matrix B_T_D_inv_B; B_T_D_inv_B.resize(m_dense_H.rows(), m_dense_H.cols()); +#ifdef LIBVIS_HAVE_CUDA if (m_compute_schur_complement_with_cuda) { MultiplyMatricesWithCuBLAS(D_inv_B, &B_T_D_inv_B); - } else { + } else +#endif // LIBVIS_HAVE_CUDA + { B_T_D_inv_B.template triangularView() = m_off_diag_H.transpose() * D_inv_B; } @@ -1368,6 +1373,7 @@ class LMOptimizer { } } +#ifdef LIBVIS_HAVE_CUDA void MultiplyMatricesWithCuBLAS( const Matrix& D_inv_B, Matrix* B_T_D_inv_B) { @@ -1428,6 +1434,7 @@ class LMOptimizer { *B_T_D_inv_B = result.cast(); } } +#endif // LIBVIS_HAVE_CUDA // void SolveWithCuSolver( // int dense_degrees_of_freedom,