From 07e705127d57f05e1006f4a1a68c296ba239d749 Mon Sep 17 00:00:00 2001 From: ymd-stella Date: Sun, 2 Mar 2025 10:22:26 +0900 Subject: [PATCH] Use cuda-efficient-features (experimental) Future work: Rename names derived from ORB (e.g. orb_extractor) --- Dockerfile.cuda | 285 +++++++++++++++++++++ src/stella_vslam/CMakeLists.txt | 23 +- src/stella_vslam/feature/orb_extractor.cc | 22 +- src/stella_vslam/feature/orb_extractor.h | 40 +++ src/stella_vslam/system.cc | 6 +- test/stella_vslam/data/bow_vocabulary.cc | 2 +- test/stella_vslam/feature/orb_extractor.cc | 26 +- 7 files changed, 384 insertions(+), 20 deletions(-) create mode 100644 Dockerfile.cuda diff --git a/Dockerfile.cuda b/Dockerfile.cuda new file mode 100644 index 000000000..0946d5920 --- /dev/null +++ b/Dockerfile.cuda @@ -0,0 +1,285 @@ +FROM nvidia/cuda:11.8.0-devel-ubuntu22.04 +ENV DEBIAN_FRONTEND noninteractive + +# install dependencies via apt +ENV DEBCONF_NOWARNINGS yes +RUN set -x && \ + apt-get update -y -qq && \ + apt-get upgrade -y -qq --no-install-recommends && \ + : "basic dependencies" && \ + apt-get install -y -qq \ + build-essential \ + pkg-config \ + cmake \ + git \ + wget \ + curl \ + tar \ + unzip && \ + : "g2o dependencies" && \ + apt-get install -y -qq \ + libatlas-base-dev \ + libsuitesparse-dev \ + libglew-dev && \ + : "OpenCV dependencies" && \ + apt-get install -y -qq \ + libgtk-3-dev \ + libjpeg-dev \ + libpng++-dev \ + libtiff-dev \ + libopenexr-dev \ + libwebp-dev \ + ffmpeg \ + libavcodec-dev \ + libavformat-dev \ + libavutil-dev \ + libswscale-dev \ + libtbb-dev && \ + : "backward-cpp dependencies" && \ + apt install -y -qq binutils-dev && \ + : "other dependencies" && \ + apt-get install -y -qq \ + libyaml-cpp-dev \ + sqlite3 \ + libsqlite3-dev && \ + : "remove cache" && \ + apt-get autoremove -y -qq && \ + rm -rf /var/lib/apt/lists/* + +ARG CMAKE_INSTALL_PREFIX=/usr/local +ARG NUM_THREADS=1 + +ENV CPATH=${CMAKE_INSTALL_PREFIX}/include:${CPATH} +ENV C_INCLUDE_PATH=${CMAKE_INSTALL_PREFIX}/include:${C_INCLUDE_PATH} +ENV CPLUS_INCLUDE_PATH=${CMAKE_INSTALL_PREFIX}/include:${CPLUS_INCLUDE_PATH} +ENV LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${LIBRARY_PATH} +ENV LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${LD_LIBRARY_PATH} + +ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all} +ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics + +# Eigen +ARG EIGEN3_VERSION=3.3.7 +WORKDIR /tmp +RUN set -x && \ + wget -q https://gitlab.com/libeigen/eigen/-/archive/${EIGEN3_VERSION}/eigen-${EIGEN3_VERSION}.tar.bz2 && \ + tar xf eigen-${EIGEN3_VERSION}.tar.bz2 && \ + rm -rf eigen-${EIGEN3_VERSION}.tar.bz2 && \ + cd eigen-${EIGEN3_VERSION} && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + cd /tmp && \ + rm -rf * +ENV Eigen3_DIR=${CMAKE_INSTALL_PREFIX}/share/eigen3/cmake + +# g2o +ARG G2O_COMMIT=20230223_git +WORKDIR /tmp +RUN set -x && \ + git clone https://github.com/RainerKuemmerle/g2o.git && \ + cd g2o && \ + git checkout ${G2O_COMMIT} && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_UNITTESTS=OFF \ + -DG2O_USE_CHOLMOD=OFF \ + -DG2O_USE_CSPARSE=ON \ + -DG2O_USE_OPENGL=OFF \ + -DG2O_USE_OPENMP=OFF \ + -DG2O_BUILD_APPS=OFF \ + -DG2O_BUILD_EXAMPLES=OFF \ + -DG2O_BUILD_LINKED_APPS=OFF \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + cd /tmp && \ + rm -rf * +ENV g2o_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/g2o + +# OpenCV +ARG OPENCV_VERSION=4.7.0 +WORKDIR /tmp +RUN set -x && \ + wget -q https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \ + unzip -q ${OPENCV_VERSION}.zip && \ + rm -rf ${OPENCV_VERSION}.zip && \ + wget -q https://github.com/opencv/opencv_contrib/archive/refs/tags/${OPENCV_VERSION}.zip -O opencv_contrib-${OPENCV_VERSION}.zip && \ + unzip -q opencv_contrib-${OPENCV_VERSION}.zip && \ + rm -rf opencv_contrib-${OPENCV_VERSION}.zip && \ + mkdir extra && \ + mv opencv_contrib-${OPENCV_VERSION}/modules/cudev extra && \ + mv opencv_contrib-${OPENCV_VERSION}/modules/cudafilters extra && \ + mv opencv_contrib-${OPENCV_VERSION}/modules/cudaimgproc extra && \ + mv opencv_contrib-${OPENCV_VERSION}/modules/cudawarping extra && \ + mv opencv_contrib-${OPENCV_VERSION}/modules/cudaarithm extra && \ + rm -rf opencv_contrib-${OPENCV_VERSION} && \ + cd opencv-${OPENCV_VERSION} && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + -DBUILD_DOCS=OFF \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_JASPER=OFF \ + -DBUILD_OPENEXR=OFF \ + -DBUILD_PERF_TESTS=OFF \ + -DBUILD_TESTS=OFF \ + -DBUILD_PROTOBUF=OFF \ + -DBUILD_opencv_apps=OFF \ + -DBUILD_opencv_dnn=OFF \ + -DBUILD_opencv_ml=OFF \ + -DBUILD_opencv_python_bindings_generator=OFF \ + -DENABLE_CXX11=ON \ + -DENABLE_FAST_MATH=ON \ + -DWITH_EIGEN=ON \ + -DWITH_FFMPEG=ON \ + -DWITH_TBB=ON \ + -DWITH_OPENMP=ON \ + -DWITH_CUDA=ON \ + -DBUILD_opencv_cudev=ON \ + -DBUILD_opencv_cudafilters=ON \ + -DBUILD_opencv_cudaimgproc=ON \ + -DBUILD_opencv_cudawarping=ON \ + -DOPENCV_EXTRA_MODULES_PATH=/tmp/extra \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + cd /tmp && \ + rm -rf * +ENV OpenCV_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/opencv4 + +# Pangolin +ARG PANGOLIN_COMMIT=eab3d3449a33a042b1ee7225e1b8b593b1b21e3e +WORKDIR /tmp +RUN set -x && \ + git clone https://github.com/stevenlovegrove/Pangolin.git && \ + cd Pangolin && \ + git checkout ${PANGOLIN_COMMIT} && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_PANGOLIN_DEPTHSENSE=OFF \ + -DBUILD_PANGOLIN_FFMPEG=OFF \ + -DBUILD_PANGOLIN_LIBDC1394=OFF \ + -DBUILD_PANGOLIN_LIBJPEG=OFF \ + -DBUILD_PANGOLIN_LIBOPENEXR=OFF \ + -DBUILD_PANGOLIN_LIBPNG=OFF \ + -DBUILD_PANGOLIN_LIBTIFF=OFF \ + -DBUILD_PANGOLIN_LIBUVC=OFF \ + -DBUILD_PANGOLIN_LZ4=OFF \ + -DBUILD_PANGOLIN_OPENNI=OFF \ + -DBUILD_PANGOLIN_OPENNI2=OFF \ + -DBUILD_PANGOLIN_PLEORA=OFF \ + -DBUILD_PANGOLIN_PYTHON=OFF \ + -DBUILD_PANGOLIN_TELICAM=OFF \ + -DBUILD_PANGOLIN_UVC_MEDIAFOUNDATION=OFF \ + -DBUILD_PANGOLIN_V4L=OFF \ + -DBUILD_PANGOLIN_ZSTD=OFF \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + cd /tmp && \ + rm -rf * +ENV Pangolin_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/Pangolin + +# backward-cpp +ARG BACKWARD_CPP_COMMIT=5ffb2c879ebdbea3bdb8477c671e32b1c984beaa +WORKDIR /tmp +RUN set -x && \ + git clone https://github.com/bombela/backward-cpp.git && \ + cd backward-cpp && \ + git checkout ${BACKWARD_CPP_COMMIT} && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + cd /tmp && \ + rm -rf * + +# cuda-efficient-features +ARG CUDA_EFFICIENT_FEATURES_COMMIT=8cf047a4bed6c1ee56fcde81d4a953b57744ed85 +WORKDIR /tmp +RUN set -x && \ + git clone https://github.com/fixstars/cuda-efficient-features.git && \ + cd cuda-efficient-features && \ + git checkout -q ${CUDA_EFFICIENT_FEATURES_COMMIT} && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + cd /tmp && \ + rm -rf * + +# stella_vslam +COPY . /stella_vslam/ +WORKDIR /stella_vslam/ +RUN set -x && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + rm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake example src && \ + chmod -R 777 ./* + +ARG PANGOLIN_VIEWER_COMMIT=f3564675d420bcdbe6380b29b5e2f2b623987dd0 +WORKDIR /tmp +RUN set -x && \ + git clone https://github.com/stella-cv/pangolin_viewer.git && \ + cd pangolin_viewer && \ + git checkout -q ${PANGOLIN_VIEWER_COMMIT} && \ + git submodule update --init --recursive && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + .. && \ + make -j${NUM_THREADS} && \ + make install && \ + cd /tmp && \ + rm -rf * + +ARG EXAMPLES_COMMIT=defc69eecc36e51cdda22885bb86954f08ad6887 +WORKDIR / +RUN set -x && \ + git clone https://github.com/stella-cv/stella_vslam_examples.git && \ + cd stella_vslam_examples && \ + git checkout -q ${EXAMPLES_COMMIT} && \ + git submodule update --init --recursive && \ + mkdir -p build && \ + cd build && \ + cmake \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \ + -DUSE_STACK_TRACE_LOGGER=ON \ + .. && \ + make -j${NUM_THREADS} + +WORKDIR /stella_vslam_examples/build/ +ENTRYPOINT ["/bin/bash"] diff --git a/src/stella_vslam/CMakeLists.txt b/src/stella_vslam/CMakeLists.txt index db0645361..32b47514e 100644 --- a/src/stella_vslam/CMakeLists.txt +++ b/src/stella_vslam/CMakeLists.txt @@ -69,6 +69,18 @@ else() message(FATAL_ERROR "Invalid BoW framework: ${BOW_FRAMEWORK}") endif() +# cuda_efficient_features +set(USE_CUDA_EFFICIENT_DESCRIPTORS OFF CACHE BOOL "Enable cuda_efficient_features") +find_path(cuda_efficient_features_INCLUDE_DIR NAMES cuda_efficient_features.h) +find_library(cuda_efficient_features_LIBRARY NAMES cuda_efficient_features) +find_package_handle_standard_args(cuda_efficient_features DEFAULT_MSG cuda_efficient_features_LIBRARY cuda_efficient_features_INCLUDE_DIR) +if(USE_CUDA_EFFICIENT_DESCRIPTORS AND cuda_efficient_features_FOUND) + message(STATUS "cuda_efficient_features: enabled") +else() + message(STATUS "cuda_efficient_features: disabled") + set(USE_CUDA_EFFICIENT_DESCRIPTORS OFF) +endif() + # ----- Create stella_vslam library ----- add_library(${PROJECT_NAME} @@ -92,6 +104,13 @@ set_target_properties(${PROJECT_NAME} PROPERTIES # ----- Compile configuration ----- +# cuda_efficient_features +if (USE_CUDA_EFFICIENT_DESCRIPTORS) + find_package(OpenCV REQUIRED core features2d cudev cudafilters cudaimgproc cudawarping) + find_package(CUDAToolkit REQUIRED) + target_compile_definitions(${PROJECT_NAME} PUBLIC USE_CUDA_EFFICIENT_DESCRIPTORS) +endif () + # gtsam if (USE_GTSAM) target_compile_definitions(${PROJECT_NAME} PUBLIC USE_GTSAM) @@ -222,8 +241,10 @@ target_link_libraries(${PROJECT_NAME} ${SUITESPARSE_LIBRARIES} ${BoW_LIBRARY} "$<$:spdlog::spdlog>" + "$<$:${cuda_efficient_features_LIBRARY};opencv_cudafilters;opencv_cudawarping>" PRIVATE - ${LAPACK_LIBRARIES}) + ${LAPACK_LIBRARIES} + "$<$:CUDA::cudart;CUDA::cublas>") # ----- Install configuration ----- diff --git a/src/stella_vslam/feature/orb_extractor.cc b/src/stella_vslam/feature/orb_extractor.cc index 19f1741a3..98556e57a 100644 --- a/src/stella_vslam/feature/orb_extractor.cc +++ b/src/stella_vslam/feature/orb_extractor.cc @@ -15,10 +15,14 @@ namespace feature { orb_extractor::orb_extractor(const orb_params* orb_params, const unsigned int min_area, + const descriptor_type desc_type, const std::vector>& mask_rects) - : orb_params_(orb_params), mask_rects_(mask_rects), min_area_sqrt_(std::sqrt(min_area)) { + : orb_params_(orb_params), mask_rects_(mask_rects), min_area_sqrt_(std::sqrt(min_area)), desc_type_(desc_type) { // resize buffers according to the number of levels image_pyramid_.resize(orb_params_->num_levels_); +#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS + hash_sift_ = cv::cuda::HashSIFT::create(1.0, cv::cuda::HashSIFT::SIZE_256_BITS); +#endif } void orb_extractor::extract(const cv::_InputArray& in_image, const cv::_InputArray& in_image_mask, @@ -102,11 +106,23 @@ void orb_extractor::extract(const cv::_InputArray& in_image, const cv::_InputArr descriptors_at_level = cv::Mat::zeros(num_keypts_at_level, 32, CV_8UC1); // To enable parallelization, set the environment variable OMP_MAX_ACTIVE_LEVELS to 2. + if (desc_type_ == feature::descriptor_type::ORB) { #ifdef USE_OPENMP #pragma omp parallel for schedule(static) #endif - for (unsigned int i = 0; i < keypts_at_level.size(); ++i) { - compute_orb_descriptor(keypts_at_level[i], blurred_image, descriptors_at_level.ptr(i)); + for (unsigned int i = 0; i < keypts_at_level.size(); ++i) { + compute_orb_descriptor(keypts_at_level[i], blurred_image, descriptors_at_level.ptr(i)); + } + } + else if (desc_type_ == feature::descriptor_type::HASH_SIFT) { +#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS + hash_sift_->compute(blurred_image, keypts_at_level, descriptors_at_level); +#else + throw std::runtime_error("cuda_efficient_features is not available"); +#endif + } + else { + throw std::runtime_error("Invalid descriptor_type"); } correct_keypoint_scale(keypts_at_level, level); diff --git a/src/stella_vslam/feature/orb_extractor.h b/src/stella_vslam/feature/orb_extractor.h index 25319b170..807ce5edb 100644 --- a/src/stella_vslam/feature/orb_extractor.h +++ b/src/stella_vslam/feature/orb_extractor.h @@ -7,9 +7,42 @@ #include #include +#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS +#include +#endif + namespace stella_vslam { namespace feature { +enum class descriptor_type { + ORB, + HASH_SIFT +}; + +inline descriptor_type descriptor_type_from_string(const std::string& desc_type_str) { + if (desc_type_str == "ORB") { + return descriptor_type::ORB; + } + else if (desc_type_str == "HASH_SIFT" || desc_type_str == "HashSIFT") { + return descriptor_type::HASH_SIFT; + } + else { + throw std::runtime_error("Invalid descriptor_type"); + } +} + +inline std::string descriptor_type_to_string(descriptor_type desc_type) { + if (desc_type == descriptor_type::ORB) { + return "ORB"; + } + else if (desc_type == descriptor_type::HASH_SIFT) { + return "HashSIFT"; + } + else { + throw std::runtime_error("Invalid descriptor_type"); + } +} + class orb_extractor { public: orb_extractor() = delete; @@ -17,6 +50,7 @@ class orb_extractor { //! Constructor orb_extractor(const orb_params* orb_params, const unsigned int min_area, + const descriptor_type desc_type = descriptor_type::ORB, const std::vector>& mask_rects = {}); //! Destructor @@ -76,7 +110,13 @@ class orb_extractor { bool mask_is_initialized_ = false; cv::Mat rect_mask_; + descriptor_type desc_type_; + + //! feature descriptor implementations orb_impl orb_impl_; +#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS + cv::Ptr hash_sift_; +#endif }; } // namespace feature diff --git a/src/stella_vslam/system.cc b/src/stella_vslam/system.cc index a5cdfc488..25f623af7 100644 --- a/src/stella_vslam/system.cc +++ b/src/stella_vslam/system.cc @@ -93,9 +93,11 @@ system::system(const std::shared_ptr& cfg, const std::string& vocab_file auto mask_rectangles = util::get_rectangles(preprocessing_params["mask_rectangles"]); const auto min_size = preprocessing_params["min_size"].as(800); - extractor_left_ = new feature::orb_extractor(orb_params_, min_size, mask_rectangles); + const auto desc_type_str = preprocessing_params["descriptor_type"].as("ORB"); + const auto desc_type = feature::descriptor_type_from_string(desc_type_str); + extractor_left_ = new feature::orb_extractor(orb_params_, min_size, desc_type, mask_rectangles); if (camera_->setup_type_ == camera::setup_type_t::Stereo) { - extractor_right_ = new feature::orb_extractor(orb_params_, min_size, mask_rectangles); + extractor_right_ = new feature::orb_extractor(orb_params_, min_size, desc_type, mask_rectangles); } num_grid_cols_ = preprocessing_params["num_grid_cols"].as(64); diff --git a/test/stella_vslam/data/bow_vocabulary.cc b/test/stella_vslam/data/bow_vocabulary.cc index 2c7c046b5..95794be5b 100644 --- a/test/stella_vslam/data/bow_vocabulary.cc +++ b/test/stella_vslam/data/bow_vocabulary.cc @@ -13,7 +13,7 @@ using namespace stella_vslam; float get_score(data::bow_vocabulary* bow_vocab, const std::string& file1, const std::string& file2) { auto params = feature::orb_params("ORB setting for test"); // mask (Mask the top and bottom 20%) - auto extractor = feature::orb_extractor(¶ms, 1000, {{0.0, 0.2, 0.0, 1.0}, {0.8, 1.0, 0.0, 1.0}}); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB, {{0.0, 0.2, 0.0, 1.0}, {0.8, 1.0, 0.0, 1.0}}); // image const auto img1 = cv::imread(file1, cv::IMREAD_GRAYSCALE); diff --git a/test/stella_vslam/feature/orb_extractor.cc b/test/stella_vslam/feature/orb_extractor.cc index 04355df6f..4c0e3cb62 100644 --- a/test/stella_vslam/feature/orb_extractor.cc +++ b/test/stella_vslam/feature/orb_extractor.cc @@ -24,7 +24,7 @@ using namespace stella_vslam; TEST(orb_extractor, extract_toy_sample_1) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image auto img = cv::Mat(600, 600, CV_8UC1); @@ -51,7 +51,7 @@ TEST(orb_extractor, extract_toy_sample_1) { TEST(orb_extractor, extract_toy_sample_2) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image auto img = cv::Mat(2000, 2000, CV_8UC1); @@ -78,7 +78,7 @@ TEST(orb_extractor, extract_toy_sample_2) { TEST(orb_extractor, extract_without_mask_1) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_001.jpg", cv::IMREAD_GRAYSCALE); @@ -97,7 +97,7 @@ TEST(orb_extractor, extract_without_mask_1) { TEST(orb_extractor, extract_without_mask_2) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_002.jpg", cv::IMREAD_GRAYSCALE); @@ -116,7 +116,7 @@ TEST(orb_extractor, extract_without_mask_2) { TEST(orb_extractor, extract_with_image_mask_1) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_001.jpg", cv::IMREAD_GRAYSCALE); @@ -153,7 +153,7 @@ TEST(orb_extractor, extract_with_image_mask_1) { TEST(orb_extractor, extract_with_image_mask_2) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_002.jpg", cv::IMREAD_GRAYSCALE); @@ -190,7 +190,7 @@ TEST(orb_extractor, extract_with_image_mask_2) { TEST(orb_extractor, extract_with_image_mask_3) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_001.jpg", cv::IMREAD_GRAYSCALE); @@ -231,7 +231,7 @@ TEST(orb_extractor, extract_with_image_mask_3) { TEST(orb_extractor, extract_with_rectangle_mask_1) { auto params = feature::orb_params("ORB setting for test"); // mask (Mask 20% of top and bottom) - auto extractor = feature::orb_extractor(¶ms, 1000, {{0.0, 1.0, 0.0, 0.2}, {0.0, 1.0, 0.8, 1.0}}); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB, {{0.0, 1.0, 0.0, 0.2}, {0.0, 1.0, 0.8, 1.0}}); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_001.jpg", cv::IMREAD_GRAYSCALE); @@ -264,7 +264,7 @@ TEST(orb_extractor, extract_with_rectangle_mask_1) { TEST(orb_extractor, extract_with_rectangle_mask_2) { auto params = feature::orb_params("ORB setting for test"); // mask (Mask 20% of left and right) - auto extractor = feature::orb_extractor(¶ms, 1000, {{0.0, 0.2, 0.0, 1.0}, {0.8, 1.0, 0.0, 1.0}}); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB, {{0.0, 0.2, 0.0, 1.0}, {0.8, 1.0, 0.0, 1.0}}); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_002.jpg", cv::IMREAD_GRAYSCALE); @@ -297,7 +297,7 @@ TEST(orb_extractor, extract_with_rectangle_mask_2) { TEST(orb_extractor, extract_with_rectangle_mask_3) { auto params = feature::orb_params("ORB setting for test"); // mask (Mask 20% of top, bottom, left and right) - auto extractor = feature::orb_extractor(¶ms, 1000, {{0.0, 0.2, 0.0, 1.0}, {0.8, 1.0, 0.0, 1.0}, {0.0, 1.0, 0.0, 0.2}, {0.0, 1.0, 0.8, 1.0}}); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB, {{0.0, 0.2, 0.0, 1.0}, {0.8, 1.0, 0.0, 1.0}, {0.0, 1.0, 0.0, 0.2}, {0.0, 1.0, 0.8, 1.0}}); // image const auto img = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_002.jpg", cv::IMREAD_GRAYSCALE); @@ -331,7 +331,7 @@ TEST(orb_extractor, extract_with_rectangle_mask_3) { TEST(orb_extractor, extract_toy_sample_3) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image auto img = cv::Mat(1200, 600, CV_8UC1); @@ -358,7 +358,7 @@ TEST(orb_extractor, extract_toy_sample_3) { TEST(orb_extractor, extract_without_mask_3) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image const auto img_land = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_001.jpg", cv::IMREAD_GRAYSCALE); @@ -380,7 +380,7 @@ TEST(orb_extractor, extract_without_mask_3) { TEST(orb_extractor, extract_without_mask_4) { const auto params = feature::orb_params("ORB setting for test"); - auto extractor = feature::orb_extractor(¶ms, 1000); + auto extractor = feature::orb_extractor(¶ms, 1000, feature::descriptor_type::ORB); // image const auto img_land = cv::imread(std::string(TEST_DATA_DIR) + "./equirectangular_image_002.jpg", cv::IMREAD_GRAYSCALE);