--- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,268 +1,25 @@ -# ---------------------------------------------------------------------------- -# Basic Configuration -# ---------------------------------------------------------------------------- -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +cmake_minimum_required(VERSION 3.10) -set(CMAKE_CXX_STANDARD 11) +project(DBow3 VERSION 1.0.0) -PROJECT(DBoW3) -set(PROJECT_VERSION "0.0.1") -string(REGEX MATCHALL "[0-9]" PROJECT_VERSION_PARTS "${PROJECT_VERSION}") -list(GET PROJECT_VERSION_PARTS 0 PROJECT_VERSION_MAJOR) -list(GET PROJECT_VERSION_PARTS 1 PROJECT_VERSION_MINOR) -list(GET PROJECT_VERSION_PARTS 2 PROJECT_VERSION_PATCH) -set(PROJECT_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") +option(BUILD_EXAMPLES "Set to ON to build examples" OFF) +option(BUILD_TESTS "Set to ON to build tests" OFF) +option(BUILD_SHARED_LIBS "Set to OFF to build static libraries" ON) -message("LIB_INSTALL_DIR: ${LIB_INSTALL_DIR}") +# OpenCV +option(USE_OPENCV_CONTRIB "Set on to use opencv-contrib" ON) -#------------------------------------------------------ -# Build type -#------------------------------------------------------ +# Optimization +option(USE_SIMD "Set on to enabel avx optimization" ON) -IF(NOT CMAKE_BUILD_TYPE ) - SET( CMAKE_BUILD_TYPE "Release" ) -ENDIF() -#------------------------------------------------------ -# Lib Names and Dirs -#------------------------------------------------------ +add_subdirectory(Lib) -if(WIN32) - # Postfix of DLLs: - SET(PROJECT_DLLVERSION "${PROJECT_VERSION_MAJOR}${PROJECT_VERSION_MINOR}${PROJECT_VERSION_PATCH}") - SET(RUNTIME_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "Directory for dlls and binaries") - SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "Directory for binaries") - SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "Directory for dlls") -else() - # Postfix of so's: - set(PROJECT_DLLVERSION) - set(LIB_INSTALL_DIR lib CACHE STRING "Install location of libraries (e.g. lib32 or lib64 for multilib installations)") - SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/cmake/ /usr/${LIB_INSTALL_DIR}/cmake ) -endif() +if(BUILD_EXAMPLES) + add_subdirectory(examples) +endif(BUILD_EXAMPLES) +if(BUILD_TESTS) + add_subdirectory(tests) +endif(BUILD_TESTS) - -# -OPTION(BUILD_UTILS "Set to OFF to not build utils" ON) -OPTION(USE_CONTRIB "Set to ON if contrib are installed" OFF) -OPTION(BUILD_SHARED_LIBS "Set to OFF to build static libraries" ON) - -# ---------------------------------------------------------------------------- -# Find Dependencies -# ---------------------------------------------------------------------------- -find_package(OpenCV REQUIRED) -IF(USE_CONTRIB) -add_definitions(-DUSE_CONTRIB) -ENDIF() -if(NOT OpenCV_VERSION VERSION_LESS "3.0") - ADD_DEFINITIONS(-DOPENCV_VERSION_3) - SET(OPENCV_VERSION_3 ON) -ELSE() - SET(OPENCV_VERSION_3 OFF) -ENDIF() - -include_directories(${OpenCV_INCLUDE_DIRS}) - -SET(REQUIRED_LIBRARIES ${REQUIRED_LIBRARIES} ${OpenCV_LIBS}) - -# ---------------------------------------------------------------------------- -# PROJECT CONFIGURATION -# force some variables that could be defined in the command line to be written to cache -# ---------------------------------------------------------------------------- -OPTION(INSTALL_DOC "Set to ON to build/install Documentation" OFF) -IF (INSTALL_DOC) - FIND_PACKAGE(Doxygen REQUIRED) - MESSAGE( STATUS "INSTALL_DOC: ${INSTALL_DOC} ") - INCLUDE("${PROJECT_SOURCE_DIR}/generateDoc.cmake") - GENERATE_DOCUMENTATION(${PROJECT_SOURCE_DIR}/dox.in) -ENDIF() - -# ---------------------------------------------------------------------------- -# Uninstall target, for "make uninstall" -# ---------------------------------------------------------------------------- -CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) -ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") - -# ---------------------------------------------------------------------------- -# create configuration file from .in file (If you use windows take care with paths) -# ---------------------------------------------------------------------------- - -CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/config.cmake.in" "${PROJECT_BINARY_DIR}/Find${PROJECT_NAME}.cmake") -CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake") -INSTALL(FILES "${PROJECT_BINARY_DIR}/Find${PROJECT_NAME}.cmake" DESTINATION ${LIB_INSTALL_DIR}/cmake/ ) -INSTALL(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" DESTINATION ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME} ) - - - - -# ---------------------------------------------------------------------------- -# Program Optimization and debug (Extracted from OpenCV) -# ---------------------------------------------------------------------------- -set(WARNINGS_ARE_ERRORS OFF CACHE BOOL "Treat warnings as errors") -set(WHOLE_PROGRAM_OPTIMIZATION OFF CACHE BOOL "Flags for whole program optimization.") - -set(EXTRA_C_FLAGS "") -set(EXTRA_C_FLAGS_RELEASE "") -set(EXTRA_C_FLAGS_DEBUG "") -set(EXTRA_EXE_LINKER_FLAGS "") -set(EXTRA_EXE_LINKER_FLAGS_RELEASE "") -set(EXTRA_EXE_LINKER_FLAGS_DEBUG "") - -IF(CMAKE_COMPILER_IS_GNUCXX OR MINGW) - set(ENABLE_PROFILING OFF CACHE BOOL "Enable profiling in the GCC compiler (Add flags: -g -pg)") - set(USE_OMIT_FRAME_POINTER ON CACHE BOOL "Enable -fomit-frame-pointer for GCC") - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES arm*) # We can use only -O2 because the -O3 causes gcc crash - set(USE_O2 ON CACHE BOOL "Enable -O2 for GCC") - set(USE_FAST_MATH OFF CACHE BOOL "Enable -ffast-math for GCC") - endif() - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES powerpc*) - set(USE_O3 ON CACHE BOOL "Enable -O3 for GCC") - set(USE_POWERPC ON CACHE BOOL "Enable PowerPC for GCC") - endif () - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64* OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES x86_64*) - set(USE_O3 ON CACHE BOOL "Enable -O3 for GCC") - set(USE_FAST_MATH OFF CACHE BOOL "Enable -ffast-math for GCC") - set(USE_MMX ON CACHE BOOL "Enable MMX for GCC") - set(USE_SSE ON CACHE BOOL "Enable SSE for GCC") - set(USE_SSE2 ON CACHE BOOL "Enable SSE2 for GCC") - set(USE_SSE3 ON CACHE BOOL "Enable SSE3 for GCC") - endif() - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES i686* OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES x86) - set(USE_O3 ON CACHE BOOL "Enable -O3 for GCC") - set(USE_FAST_MATH OFF CACHE BOOL "Enable -ffast-math for GCC") - set(USE_MMX ON CACHE BOOL "Enable MMX for GCC") - set(USE_SSE OFF CACHE BOOL "Enable SSE for GCC") - set(USE_SSE2 OFF CACHE BOOL "Enable SSE2 for GCC") - set(USE_SSE3 OFF CACHE BOOL "Enable SSE3 for GCC") - endif () - - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wall") - - if(WARNINGS_ARE_ERRORS) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror") - endif() - - # The -Wno-long-long is required in 64bit systems when including sytem headers. - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES x86_64* OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES amd64*) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-long-long") - endif() - - # Whole program optimization - if(WHOLE_PROGRAM_OPTIMIZATION) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -fwhole-program --combine") - endif() - - # Other optimizations - if(USE_OMIT_FRAME_POINTER) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -fomit-frame-pointer") - endif() - if(USE_O2) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -O2") - endif() - if(USE_O3) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -O3") - endif() - if(USE_FAST_MATH) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -ffast-math") - endif() - if(USE_POWERPC) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mcpu=G3 -mtune=G5") - endif() - if(USE_MMX) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -mmmx") - endif() - if(USE_SSE) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse") - endif() - if(USE_SSE2) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse2") - endif() - if(USE_SSE3 AND NOT MINGW) # SSE3 should be disabled under MingW because it generates compiler errors - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -msse3") - endif() - - if(ENABLE_PROFILING) - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -pg -g") - else() - if(NOT APPLE) - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -ffunction-sections") - endif() - endif() - - - set(EXTRA_C_FLAGS_RELEASE "${EXTRA_C_FLAGS_RELEASE} -DNDEBUG ") - set(EXTRA_C_FLAGS_DEBUG "-g3 -O0 -DDEBUG -D_DEBUG -W -Wextra -Wno-return-type ") - - MESSAGE( STATUS "-------------------------------------------------------------------------------" ) - message( STATUS "GNU COMPILER") - MESSAGE( STATUS "-------------------------------------------------------------------------------" ) - - - - -ELSE() # MSVC - - -ENDIF()#END OF COMPILER SPECIFIC OPTIONS -SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS_RELEASE}") -SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS_DEBUG}") -SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -std=c++11") -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -std=c++11") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_FLAGS_DEBUG}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_DEBUG}") -SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EXTRA_EXE_LINKER_FLAGS}") -SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${EXTRA_EXE_LINKER_FLAGS_RELEASE}") -SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${EXTRA_EXE_LINKER_FLAGS_DEBUG}") - - - -#------------------------------------------------ -# DIRS -#------------------------------------------------ -ADD_SUBDIRECTORY(src) -IF (BUILD_UTILS) -ADD_SUBDIRECTORY(utils) -ENDIF() - -IF (BUILD_TESTS) -ADD_SUBDIRECTORY(tests) -ENDIF() - - -# ---------------------------------------------------------------------------- -# display status message for important variables -# ---------------------------------------------------------------------------- -message( STATUS ) -MESSAGE( STATUS "-------------------------------------------------------------------------------" ) -message( STATUS "General configuration for ${PROJECT_NAME} ${PROJECT_VERSION}") -MESSAGE( STATUS "-------------------------------------------------------------------------------" ) -message(" Built as dynamic libs?:" ${BUILD_SHARED_LIBS}) -message(" Compiler:" "${CMAKE_COMPILER}" "${CMAKE_CXX_COMPILER}") - -message( STATUS "Build Type: ${CMAKE_BUILD_TYPE}") -message( STATUS "C++ flags (Release): ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") -message( STATUS "C++ flags (Debug): ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") -message( STATUS "C++ flags (Relase+Debug): ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - -message( STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") -message( STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") - -MESSAGE( STATUS ) -MESSAGE( STATUS "CMAKE_SYSTEM_PROCESSOR = ${CMAKE_SYSTEM_PROCESSOR}" ) -MESSAGE( STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}" ) -MESSAGE( STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}" ) -MESSAGE( STATUS "CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}" ) -MESSAGE( STATUS "BUILD_UTILS= ${BUILD_UTILS}" ) -MESSAGE( STATUS "BUILD_TESTS= ${BUILD_TESTS}" ) -MESSAGE( STATUS "OPENCV_DIR= ${OpenCV_DIR} VERSION=${OpenCV_VERSION}" ) - -MESSAGE( STATUS "USE_CONTRIB= ${USE_CONTRIB}" ) - -MESSAGE( STATUS ) -MESSAGE( STATUS "OpenCV_LIB_DIR=${OpenCV_LIB_DIR}") -MESSAGE( STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}") - -MESSAGE( STATUS ) -MESSAGE( STATUS ) -MESSAGE( STATUS "Change a value with: cmake -D=" ) -MESSAGE( STATUS ) --- /dev/null +++ b/Lib/CMakeLists.txt @@ -0,0 +1,92 @@ +cmake_minimum_required(VERSION 3.10) + +find_package(OpenCV REQUIRED) + +find_package(OpenMP REQUIRED) + +include(${CMAKE_SOURCE_DIR}/cmake/instructionSet.cmake) + +if(BUILD_SHARED_LIBS) + add_library(DBow3 SHARED) + + target_compile_definitions(DBow3 + PUBLIC + DBOW_API + ) + +else() + add_library(DBow3 STATIC) +endif() + +add_library(DBow3::DBow3 ALIAS DBow3) + +target_sources(DBow3 + PRIVATE + src/BowVector.cpp + src/Database.cpp + src/DescManip.cpp + src/FeatureVector.cpp + src/QueryResults.cpp + src/ScoringObject.cpp + src/Vocabulary.cpp + src/quicklz.c +) + +target_include_directories(DBow3 + PUBLIC + $ + $ +) + +target_link_libraries(DBow3 + PUBLIC + OpenMP::OpenMP_CXX +) + +if(USE_OPENCV_CONTRIB) +target_link_libraries(DBow3 + PUBLIC + ${OpenCV_LIBS} +) + +target_include_directories(DBow3 + PUBLIC + ${OpenCV_INCLUDE_DIR} +) +endif() + +target_compile_definitions(DBow3 + PUBLIC + NOMINMAX + _USE_MATH_DEFINES +) + +target_compile_features(DBow3 + PRIVATE + cxx_std_14 +) + + +install(TARGETS DBow3 EXPORT DBow3Targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +install (DIRECTORY include/ DESTINATION include) + +install(EXPORT DBow3Targets + FILE DBow3Targets.cmake + NAMESPACE DBow3:: + DESTINATION cmake/DBow3 +) + +include(CMakePackageConfigHelpers) + +write_basic_package_version_file(DBow3ConfigVersion.cmake + COMPATIBILITY SameMajorVersion +) + +install(FILES DBow3Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/DBow3ConfigVersion.cmake + DESTINATION cmake/DBow3) \ No newline at end of file --- /dev/null +++ b/Lib/DBow3Config.cmake @@ -0,0 +1,4 @@ +include(CMakeFindDependencyMacro) +find_dependency(OpenCV) +find_dependency(OpenMP) +include("${CMAKE_CURRENT_LIST_DIR}/FbowTargets.cmake") \ No newline at end of file diff --git a/src/BowVector.h b/Lib/include/DBow3/BowVector.h similarity index 99% rename from src/BowVector.h rename to Lib/include/DBow3/BowVector.h index d8c17e0..cdbf517 100644 --- a/src/BowVector.h +++ b/Lib/include/DBow3/BowVector.h @@ -12,6 +12,7 @@ #include #include +#include #include "exports.h" #if _WIN32 #include diff --git a/src/DBoW3.h b/Lib/include/DBow3/DBoW3.h similarity index 100% rename from src/DBoW3.h rename to Lib/include/DBow3/DBoW3.h diff --git a/src/Database.h b/Lib/include/DBow3/Database.h similarity index 100% rename from src/Database.h rename to Lib/include/DBow3/Database.h diff --git a/src/DescManip.h b/Lib/include/DBow3/DescManip.h similarity index 100% rename from src/DescManip.h rename to Lib/include/DBow3/DescManip.h diff --git a/src/FeatureVector.h b/Lib/include/DBow3/FeatureVector.h similarity index 100% rename from src/FeatureVector.h rename to Lib/include/DBow3/FeatureVector.h diff --git a/src/QueryResults.h b/Lib/include/DBow3/QueryResults.h similarity index 100% rename from src/QueryResults.h rename to Lib/include/DBow3/QueryResults.h diff --git a/src/ScoringObject.h b/Lib/include/DBow3/ScoringObject.h similarity index 100% rename from src/ScoringObject.h rename to Lib/include/DBow3/ScoringObject.h diff --git a/src/Vocabulary.h b/Lib/include/DBow3/Vocabulary.h similarity index 100% rename from src/Vocabulary.h rename to Lib/include/DBow3/Vocabulary.h diff --git a/src/exports.h b/Lib/include/DBow3/exports.h similarity index 78% rename from src/exports.h rename to Lib/include/DBow3/exports.h index c324953..a31b317 100644 --- a/src/exports.h +++ b/Lib/include/DBow3/exports.h @@ -35,17 +35,15 @@ or implied, of Rafael Muñoz Salinas. #define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio 2005 warnings */ #endif -#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined DBOW_DSO_EXPORTS - #define DBOW_API __declspec(dllexport) - #pragma warning ( disable : 4251 ) //disable warning to templates with dll linkage. - #pragma warning ( disable : 4290 ) //disable warning due to exception specifications. - #pragma warning ( disable : 4996 ) //disable warning regarding unsafe vsprintf. - #pragma warning ( disable : 4244 ) //disable warning convesions with lost of data. - +#ifdef _WIN32 +# ifdef DBOW_API +# define DBOW_API __declspec(dllexport) +# else +# define DBOW_API __declspec(dllimport) +# endif #else - #define DBOW_API +# define DBOW_API #endif - #define DBOW_VERSION "3.0.0" #endif diff --git a/src/quicklz.h b/Lib/include/DBow3/quicklz.h similarity index 100% rename from src/quicklz.h rename to Lib/include/DBow3/quicklz.h diff --git a/src/timers.h b/Lib/include/DBow3/timers.h similarity index 100% rename from src/timers.h rename to Lib/include/DBow3/timers.h diff --git a/src/BowVector.cpp b/Lib/src/BowVector.cpp similarity index 99% rename from src/BowVector.cpp rename to Lib/src/BowVector.cpp index d132213..f61d421 100644 --- a/src/BowVector.cpp +++ b/Lib/src/BowVector.cpp @@ -13,7 +13,7 @@ #include #include -#include "BowVector.h" +#include "DBow3/BowVector.h" namespace DBoW3 { diff --git a/src/Database.cpp b/Lib/src/Database.cpp similarity index 99% rename from src/Database.cpp rename to Lib/src/Database.cpp index d8a1b81..25610a0 100644 --- a/src/Database.cpp +++ b/Lib/src/Database.cpp @@ -1,4 +1,4 @@ -#include "Database.h" +#include "DBow3/Database.h" namespace DBoW3{ diff --git a/src/DescManip.cpp b/Lib/src/DescManip.cpp similarity index 96% rename from src/DescManip.cpp rename to Lib/src/DescManip.cpp index d6331af..430ce2b 100644 --- a/src/DescManip.cpp +++ b/Lib/src/DescManip.cpp @@ -1,273 +1,273 @@ -/** - * File: DescManip.cpp - * Date: June 2012 - * Author: Dorian Galvez-Lopez - * Description: functions for ORB descriptors - * License: see the LICENSE.txt file - * - */ - -#include -#include -#include -#include -#include -#include - -#include "DescManip.h" - -using namespace std; - -namespace DBoW3 { - -// -------------------------------------------------------------------------- - -void DescManip::meanValue(const std::vector &descriptors, - cv::Mat &mean) -{ - - if(descriptors.empty()) return; - - if(descriptors.size() == 1) - { - mean = descriptors[0].clone(); - return; - } - //binary descriptor - if (descriptors[0].type()==CV_8U ){ - //determine number of bytes of the binary descriptor - int L= getDescSizeBytes( descriptors[0]); - vector sum( L * 8, 0); - - for(size_t i = 0; i < descriptors.size(); ++i) - { - const cv::Mat &d = descriptors[i]; - const unsigned char *p = d.ptr(); - - for(int j = 0; j < d.cols; ++j, ++p) - { - if(*p & (1 << 7)) ++sum[ j*8 ]; - if(*p & (1 << 6)) ++sum[ j*8 + 1 ]; - if(*p & (1 << 5)) ++sum[ j*8 + 2 ]; - if(*p & (1 << 4)) ++sum[ j*8 + 3 ]; - if(*p & (1 << 3)) ++sum[ j*8 + 4 ]; - if(*p & (1 << 2)) ++sum[ j*8 + 5 ]; - if(*p & (1 << 1)) ++sum[ j*8 + 6 ]; - if(*p & (1)) ++sum[ j*8 + 7 ]; - } - } - - mean = cv::Mat::zeros(1, L, CV_8U); - unsigned char *p = mean.ptr(); - - const int N2 = (int)descriptors.size() / 2 + descriptors.size() % 2; - for(size_t i = 0; i < sum.size(); ++i) - { - if(sum[i] >= N2) - { - // set bit - *p |= 1 << (7 - (i % 8)); - } - - if(i % 8 == 7) ++p; - } - } - //non binary descriptor - else{ - assert(descriptors[0].type()==CV_32F );//ensure it is float - - mean.create(1, descriptors[0].cols,descriptors[0].type()); - mean.setTo(cv::Scalar::all(0)); - float inv_s =1./double( descriptors.size()); - for(size_t i=0;i(); // a & b are actually CV_8U - pb = b.ptr(); - - uint64_t v, ret = 0; - for(size_t i = 0; i < a.cols / sizeof(uint64_t); ++i, ++pa, ++pb) - { - v = *pa ^ *pb; - v = v - ((v >> 1) & (uint64_t)~(uint64_t)0/3); - v = (v & (uint64_t)~(uint64_t)0/15*3) + ((v >> 2) & - (uint64_t)~(uint64_t)0/15*3); - v = (v + (v >> 4)) & (uint64_t)~(uint64_t)0/255*15; - ret += (uint64_t)(v * ((uint64_t)~(uint64_t)0/255)) >> - (sizeof(uint64_t) - 1) * CHAR_BIT; - } - - return ret; - } - else{ - double sqd = 0.; - assert(a.type()==CV_32F); - assert(a.rows==1); - const float *a_ptr=a.ptr(0); - const float *b_ptr=b.ptr(0); - for(int i = 0; i < a.cols; i ++) - sqd += (a_ptr[i ] - b_ptr[i ])*(a_ptr[i ] - b_ptr[i ]); - return sqd; - } -} - - - - -// -------------------------------------------------------------------------- - -std::string DescManip::toString(const cv::Mat &a) -{ - stringstream ss; - //introduce a magic value to distinguish from DBOw2 - ss<<"dbw3 "; - //save size and type - - - ss <(); - for(int i = 0; i < a.cols; ++i, ++p) - ss << (int)*p << " "; - }else{ - - const float *p = a.ptr(); - for(int i = 0; i < a.cols; ++i, ++p) - ss << *p << " "; - - } - - return ss.str(); -} - -// -------------------------------------------------------------------------- - -void DescManip::fromString(cv::Mat &a, const std::string &s) -{ - - //check if the dbow3 is present - string ss_aux;ss_aux.reserve(10); - for(size_t i=0;i<10 && i data;data.reserve(100); - while( ss>>val) data.push_back(val); - //copy to a - a.create(1,data.size(),CV_8UC1); - memcpy(a.ptr(0),&data[0],data.size()); - } - else { - char szSign[10]; - int type,cols; - stringstream ss(s); - ss >> szSign >> type >> cols; - a.create(1, cols, type); - if(type==CV_8UC1){ - unsigned char *p = a.ptr(); - int n; - for(int i = 0; i < a.cols; ++i, ++p) - if ( ss >> n) *p = (unsigned char)n; - } - else{ - float *p = a.ptr(); - for(int i = 0; i < a.cols; ++i, ++p) - if ( !(ss >> *p))cerr<<"Error reading. Unexpected EOF. DescManip::fromString"< &descriptors, - cv::Mat &mat) -{ - if(descriptors.empty()) - { - mat.release(); - return; - } - - if(descriptors[0].type()==CV_8UC1){ - - const size_t N = descriptors.size(); - int L=getDescSizeBytes(descriptors[0]); - mat.create(N, L*8, CV_32F); - float *p = mat.ptr(); - - for(size_t i = 0; i < N; ++i) - { - const int C = descriptors[i].cols; - const unsigned char *desc = descriptors[i].ptr(); - - for(int j = 0; j < C; ++j, p += 8) - { - p[0] = (desc[j] & (1 << 7) ? 1 : 0); - p[1] = (desc[j] & (1 << 6) ? 1 : 0); - p[2] = (desc[j] & (1 << 5) ? 1 : 0); - p[3] = (desc[j] & (1 << 4) ? 1 : 0); - p[4] = (desc[j] & (1 << 3) ? 1 : 0); - p[5] = (desc[j] & (1 << 2) ? 1 : 0); - p[6] = (desc[j] & (1 << 1) ? 1 : 0); - p[7] = desc[j] & (1); - } - } - } - else{ - assert(descriptors[0].type()==CV_32F); - const int N = descriptors.size(); - int L=descriptors[0].cols; - mat.create(N, L, CV_32F); - for(int i = 0; i < N; ++i) - memcpy(mat.ptr(i),descriptors[i].ptr(0),sizeof(float)*L); - } -} - -void DescManip::toStream(const cv::Mat &m,std::ostream &str){ - assert(m.rows==1 || m.isContinuous()); - int type=m.type(); - int cols=m.cols; - int rows=m.rows; - str.write((char*)&cols,sizeof(cols)); - str.write((char*)&rows,sizeof(rows)); - str.write((char*)&type,sizeof(type)); - str.write((char*)m.ptr(0),m.elemSize()*m.cols); -} - -void DescManip::fromStream(cv::Mat &m,std::istream &str){ - int type,cols,rows; - str.read((char*)&cols,sizeof(cols)); - str.read((char*)&rows,sizeof(rows)); - str.read((char*)&type,sizeof(type)); - m.create(rows,cols,type); - str.read((char*)m.ptr(0),m.elemSize()*m.cols); -} - - -// -------------------------------------------------------------------------- - -} // namespace DBoW3 - +/** + * File: DescManip.cpp + * Date: June 2012 + * Author: Dorian Galvez-Lopez + * Description: functions for ORB descriptors + * License: see the LICENSE.txt file + * + */ + +#include +#include +#include +#include +#include +#include + +#include "DBow3/DescManip.h" + +using namespace std; + +namespace DBoW3 { + +// -------------------------------------------------------------------------- + +void DescManip::meanValue(const std::vector &descriptors, + cv::Mat &mean) +{ + + if(descriptors.empty()) return; + + if(descriptors.size() == 1) + { + mean = descriptors[0].clone(); + return; + } + //binary descriptor + if (descriptors[0].type()==CV_8U ){ + //determine number of bytes of the binary descriptor + int L= getDescSizeBytes( descriptors[0]); + vector sum( L * 8, 0); + + for(size_t i = 0; i < descriptors.size(); ++i) + { + const cv::Mat &d = descriptors[i]; + const unsigned char *p = d.ptr(); + + for(int j = 0; j < d.cols; ++j, ++p) + { + if(*p & (1 << 7)) ++sum[ j*8 ]; + if(*p & (1 << 6)) ++sum[ j*8 + 1 ]; + if(*p & (1 << 5)) ++sum[ j*8 + 2 ]; + if(*p & (1 << 4)) ++sum[ j*8 + 3 ]; + if(*p & (1 << 3)) ++sum[ j*8 + 4 ]; + if(*p & (1 << 2)) ++sum[ j*8 + 5 ]; + if(*p & (1 << 1)) ++sum[ j*8 + 6 ]; + if(*p & (1)) ++sum[ j*8 + 7 ]; + } + } + + mean = cv::Mat::zeros(1, L, CV_8U); + unsigned char *p = mean.ptr(); + + const int N2 = (int)descriptors.size() / 2 + descriptors.size() % 2; + for(size_t i = 0; i < sum.size(); ++i) + { + if(sum[i] >= N2) + { + // set bit + *p |= 1 << (7 - (i % 8)); + } + + if(i % 8 == 7) ++p; + } + } + //non binary descriptor + else{ + assert(descriptors[0].type()==CV_32F );//ensure it is float + + mean.create(1, descriptors[0].cols,descriptors[0].type()); + mean.setTo(cv::Scalar::all(0)); + float inv_s =1./double( descriptors.size()); + for(size_t i=0;i(); // a & b are actually CV_8U + pb = b.ptr(); + + uint64_t v, ret = 0; + for(size_t i = 0; i < a.cols / sizeof(uint64_t); ++i, ++pa, ++pb) + { + v = *pa ^ *pb; + v = v - ((v >> 1) & (uint64_t)~(uint64_t)0/3); + v = (v & (uint64_t)~(uint64_t)0/15*3) + ((v >> 2) & + (uint64_t)~(uint64_t)0/15*3); + v = (v + (v >> 4)) & (uint64_t)~(uint64_t)0/255*15; + ret += (uint64_t)(v * ((uint64_t)~(uint64_t)0/255)) >> + (sizeof(uint64_t) - 1) * CHAR_BIT; + } + + return ret; + } + else{ + double sqd = 0.; + assert(a.type()==CV_32F); + assert(a.rows==1); + const float *a_ptr=a.ptr(0); + const float *b_ptr=b.ptr(0); + for(int i = 0; i < a.cols; i ++) + sqd += (a_ptr[i ] - b_ptr[i ])*(a_ptr[i ] - b_ptr[i ]); + return sqd; + } +} + + + + +// -------------------------------------------------------------------------- + +std::string DescManip::toString(const cv::Mat &a) +{ + stringstream ss; + //introduce a magic value to distinguish from DBOw2 + ss<<"dbw3 "; + //save size and type + + + ss <(); + for(int i = 0; i < a.cols; ++i, ++p) + ss << (int)*p << " "; + }else{ + + const float *p = a.ptr(); + for(int i = 0; i < a.cols; ++i, ++p) + ss << *p << " "; + + } + + return ss.str(); +} + +// -------------------------------------------------------------------------- + +void DescManip::fromString(cv::Mat &a, const std::string &s) +{ + + //check if the dbow3 is present + string ss_aux;ss_aux.reserve(10); + for(size_t i=0;i<10 && i data;data.reserve(100); + while( ss>>val) data.push_back(val); + //copy to a + a.create(1,data.size(),CV_8UC1); + memcpy(a.ptr(0),&data[0],data.size()); + } + else { + char szSign[10]; + int type,cols; + stringstream ss(s); + ss >> szSign >> type >> cols; + a.create(1, cols, type); + if(type==CV_8UC1){ + unsigned char *p = a.ptr(); + int n; + for(int i = 0; i < a.cols; ++i, ++p) + if ( ss >> n) *p = (unsigned char)n; + } + else{ + float *p = a.ptr(); + for(int i = 0; i < a.cols; ++i, ++p) + if ( !(ss >> *p))cerr<<"Error reading. Unexpected EOF. DescManip::fromString"< &descriptors, + cv::Mat &mat) +{ + if(descriptors.empty()) + { + mat.release(); + return; + } + + if(descriptors[0].type()==CV_8UC1){ + + const size_t N = descriptors.size(); + int L=getDescSizeBytes(descriptors[0]); + mat.create(N, L*8, CV_32F); + float *p = mat.ptr(); + + for(size_t i = 0; i < N; ++i) + { + const int C = descriptors[i].cols; + const unsigned char *desc = descriptors[i].ptr(); + + for(int j = 0; j < C; ++j, p += 8) + { + p[0] = (desc[j] & (1 << 7) ? 1 : 0); + p[1] = (desc[j] & (1 << 6) ? 1 : 0); + p[2] = (desc[j] & (1 << 5) ? 1 : 0); + p[3] = (desc[j] & (1 << 4) ? 1 : 0); + p[4] = (desc[j] & (1 << 3) ? 1 : 0); + p[5] = (desc[j] & (1 << 2) ? 1 : 0); + p[6] = (desc[j] & (1 << 1) ? 1 : 0); + p[7] = desc[j] & (1); + } + } + } + else{ + assert(descriptors[0].type()==CV_32F); + const int N = descriptors.size(); + int L=descriptors[0].cols; + mat.create(N, L, CV_32F); + for(int i = 0; i < N; ++i) + memcpy(mat.ptr(i),descriptors[i].ptr(0),sizeof(float)*L); + } +} + +void DescManip::toStream(const cv::Mat &m,std::ostream &str){ + assert(m.rows==1 || m.isContinuous()); + int type=m.type(); + int cols=m.cols; + int rows=m.rows; + str.write((char*)&cols,sizeof(cols)); + str.write((char*)&rows,sizeof(rows)); + str.write((char*)&type,sizeof(type)); + str.write((char*)m.ptr(0),m.elemSize()*m.cols); +} + +void DescManip::fromStream(cv::Mat &m,std::istream &str){ + int type,cols,rows; + str.read((char*)&cols,sizeof(cols)); + str.read((char*)&rows,sizeof(rows)); + str.read((char*)&type,sizeof(type)); + m.create(rows,cols,type); + str.read((char*)m.ptr(0),m.elemSize()*m.cols); +} + + +// -------------------------------------------------------------------------- + +} // namespace DBoW3 + diff --git a/src/FeatureVector.cpp b/Lib/src/FeatureVector.cpp similarity index 98% rename from src/FeatureVector.cpp rename to Lib/src/FeatureVector.cpp index 880eab1..a9cd792 100644 --- a/src/FeatureVector.cpp +++ b/Lib/src/FeatureVector.cpp @@ -7,7 +7,7 @@ * */ -#include "FeatureVector.h" +#include "DBow3/FeatureVector.h" #include #include #include diff --git a/src/QueryResults.cpp b/Lib/src/QueryResults.cpp similarity index 97% rename from src/QueryResults.cpp rename to Lib/src/QueryResults.cpp index 7062400..b852979 100644 --- a/src/QueryResults.cpp +++ b/Lib/src/QueryResults.cpp @@ -9,7 +9,7 @@ #include #include -#include "QueryResults.h" +#include "DBow3/QueryResults.h" using namespace std; diff --git a/src/ScoringObject.cpp b/Lib/src/ScoringObject.cpp similarity index 99% rename from src/ScoringObject.cpp rename to Lib/src/ScoringObject.cpp index 7cf0812..adde8e9 100644 --- a/src/ScoringObject.cpp +++ b/Lib/src/ScoringObject.cpp @@ -8,8 +8,8 @@ */ #include -#include "Vocabulary.h" -#include "BowVector.h" +#include "DBow3/Vocabulary.h" +#include "DBow3/BowVector.h" using namespace DBoW3; diff --git a/src/Vocabulary.cpp b/Lib/src/Vocabulary.cpp similarity index 99% rename from src/Vocabulary.cpp rename to Lib/src/Vocabulary.cpp index 9f0eff3..6ccbbea 100644 --- a/src/Vocabulary.cpp +++ b/Lib/src/Vocabulary.cpp @@ -1,8 +1,8 @@ -#include "Vocabulary.h" -#include "DescManip.h" -#include "quicklz.h" +#include "DBow3/Vocabulary.h" +#include "DBow3/DescManip.h" +#include "DBow3/quicklz.h" #include -#include "timers.h" +#include "DBow3/timers.h" namespace DBoW3{ // -------------------------------------------------------------------------- diff --git a/src/quicklz.c b/Lib/src/quicklz.c similarity index 99% rename from src/quicklz.c rename to Lib/src/quicklz.c index 3742129..bd3cb11 100644 --- a/src/quicklz.c +++ b/Lib/src/quicklz.c @@ -9,7 +9,7 @@ // 1.5.0 final -#include "quicklz.h" +#include "DBow3/quicklz.h" #if QLZ_VERSION_MAJOR != 1 || QLZ_VERSION_MINOR != 5 || QLZ_VERSION_REVISION != 0 #error quicklz.c and quicklz.h have different versions diff --git a/cmake/instructionSet.cmake b/cmake/instructionSet.cmake new file mode 100644 index 0000000..d0febeb --- /dev/null +++ b/cmake/instructionSet.cmake @@ -0,0 +1,13 @@ +add_library( + SSE4.1 + INTERFACE +) + +add_library(SIMD::SSE4.1 ALIAS SSE4.1) + +target_compile_options( + SSE4.1 + INTERFACE + $<$:-msse4.1;-march=native> + $<$:/arch:AVX2> +) diff --git a/cmake_uninstall.cmake.in b/cmake_uninstall.cmake.in deleted file mode 100644 index 81482da..0000000 --- a/cmake_uninstall.cmake.in +++ /dev/null @@ -1,28 +0,0 @@ -# ----------------------------------------------- -# File that provides "make uninstall" target -# We use the file 'install_manifest.txt' -# ----------------------------------------------- -IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") - MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") -ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") - -FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) -STRING(REGEX REPLACE "\n" ";" files "${files}") -FOREACH(file ${files}) - MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") -# IF(EXISTS "$ENV{DESTDIR}${file}") -# EXEC_PROGRAM( -# "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" -# OUTPUT_VARIABLE rm_out -# RETURN_VALUE rm_retval -# ) - EXECUTE_PROCESS(COMMAND rm $ENV{DESTDIR}${file}) -# IF(NOT "${rm_retval}" STREQUAL 0) -# MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") -# ENDIF(NOT "${rm_retval}" STREQUAL 0) -# ELSE(EXISTS "$ENV{DESTDIR}${file}") -# MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") -# ENDIF(EXISTS "$ENV{DESTDIR}${file}") -ENDFOREACH(file) - - diff --git a/config.cmake.in b/config.cmake.in deleted file mode 100644 index 9d15feb..0000000 --- a/config.cmake.in +++ /dev/null @@ -1,36 +0,0 @@ -# =================================================================================== -# @PROJECT_NAME@ CMake configuration file -# -# ** File generated automatically, do not modify ** -# -# Usage from an external project: -# In your CMakeLists.txt, add these lines: -# -# FIND_PACKAGE(@PROJECT_NAME@ REQUIRED ) -# TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${@PROJECT_NAME@_LIBS}) -# -# This file will define the following variables: -# - @PROJECT_NAME@_LIBS : The list of libraries to links against. -# - @PROJECT_NAME@_LIB_DIR : The directory where lib files are. Calling LINK_DIRECTORIES -# with this path is NOT needed. -# - @PROJECT_NAME@_VERSION : The version of this PROJECT_NAME build. Example: "1.2.0" -# - @PROJECT_NAME@_VERSION_MAJOR : Major version part of VERSION. Example: "1" -# - @PROJECT_NAME@_VERSION_MINOR : Minor version part of VERSION. Example: "2" -# - @PROJECT_NAME@_VERSION_PATCH : Patch version part of VERSION. Example: "0" -# -# =================================================================================== -INCLUDE_DIRECTORIES("@CMAKE_INSTALL_PREFIX@/include") -SET(@PROJECT_NAME@_INCLUDE_DIRS "@CMAKE_INSTALL_PREFIX@/include") - -LINK_DIRECTORIES("@CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@") -SET(@PROJECT_NAME@_LIB_DIR "@CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@") - -SET(@PROJECT_NAME@_LIBS @REQUIRED_LIBRARIES@ @PROJECT_NAME@@PROJECT_DLLVERSION@) -SET(@PROJECT_NAME@_LIBRARIES @REQUIRED_LIBRARIES@ @PROJECT_NAME@@PROJECT_DLLVERSION@) - -SET(@PROJECT_NAME@_FOUND YES) -SET(@PROJECT_NAME@_FOUND "YES") -SET(@PROJECT_NAME@_VERSION @PROJECT_VERSION@) -SET(@PROJECT_NAME@_VERSION_MAJOR @PROJECT_VERSION_MAJOR@) -SET(@PROJECT_NAME@_VERSION_MINOR @PROJECT_VERSION_MINOR@) -SET(@PROJECT_NAME@_VERSION_PATCH @PROJECT_VERSION_PATCH@) diff --git a/utils/CMakeLists.txt b/examples/CMakeLists.txt similarity index 100% rename from utils/CMakeLists.txt rename to examples/CMakeLists.txt diff --git a/utils/create_voc_step0.cpp b/examples/create_voc_step0.cpp similarity index 97% rename from utils/create_voc_step0.cpp rename to examples/create_voc_step0.cpp index 4fd78f6..c48a3c4 100644 --- a/utils/create_voc_step0.cpp +++ b/examples/create_voc_step0.cpp @@ -1,126 +1,126 @@ - -//First step of creating a vocabulary is extracting features from a set of images. We save them to a file for next step -#include -#include - -// DBoW3 -#include "DBoW3.h" - -// OpenCV -#include -#include -#include -#ifdef USE_CONTRIB -#include -#include -#endif -#include "DescManip.h" - -using namespace DBoW3; -using namespace std; - - -//command line parser -class CmdLineParser{int argc; char **argv; public: CmdLineParser(int _argc,char **_argv):argc(_argc),argv(_argv){} bool operator[] ( string param ) {int idx=-1; for ( int i=0; i readImagePaths(int argc,char **argv,int start){ - vector paths; - for(int i=start;i loadFeatures( std::vector path_to_images,string descriptor="") throw (std::exception){ - //select detector - cv::Ptr fdetector; - if (descriptor=="orb") fdetector=cv::ORB::create(); - else if (descriptor=="brisk") fdetector=cv::BRISK::create(); -#ifdef OPENCV_VERSION_3 - else if (descriptor=="akaze") fdetector=cv::AKAZE::create(); -#endif -#ifdef USE_CONTRIB - else if(descriptor=="surf" ) fdetector=cv::xfeatures2d::SURF::create(400, 4, 2, EXTENDED_SURF); -#endif - - else throw std::runtime_error("Invalid descriptor"); - assert(!descriptor.empty()); - vector features; - - - cout << "Extracting features..." << endl; - for(size_t i = 0; i < path_to_images.size(); ++i) - { - vector keypoints; - cv::Mat descriptors; - cout<<"reading image: "<detectAndCompute(image, cv::Mat(), keypoints, descriptors); - features.push_back(descriptors); - cout<<"done detecting features"< &features){ - - //test it is not created - std::ifstream ifile(filename); - if (ifile.is_open()){cerr<<"ERROR::: Output File "<(0),f.total()*f.elemSize()); - } -} - -// ---------------------------------------------------------------------------- - -int main(int argc,char **argv) -{ - - try{ - CmdLineParser cml(argc,argv); - if (cml["-h"] || argc==1){ - cerr<<"Usage: descriptor_name output image0 image1 ... \n\t descriptors:brisk,surf,orb(default),akaze(only if using opencv 3)"< features= loadFeatures(images,descriptor); - - //save features to file - saveToFile(argv[2],features); - - }catch(std::exception &ex){ - cerr< +#include + +// DBoW3 +#include "DBoW3.h" + +// OpenCV +#include +#include +#include +#ifdef USE_CONTRIB +#include +#include +#endif +#include "DescManip.h" + +using namespace DBoW3; +using namespace std; + + +//command line parser +class CmdLineParser{int argc; char **argv; public: CmdLineParser(int _argc,char **_argv):argc(_argc),argv(_argv){} bool operator[] ( string param ) {int idx=-1; for ( int i=0; i readImagePaths(int argc,char **argv,int start){ + vector paths; + for(int i=start;i loadFeatures( std::vector path_to_images,string descriptor="") throw (std::exception){ + //select detector + cv::Ptr fdetector; + if (descriptor=="orb") fdetector=cv::ORB::create(); + else if (descriptor=="brisk") fdetector=cv::BRISK::create(); +#ifdef OPENCV_VERSION_3 + else if (descriptor=="akaze") fdetector=cv::AKAZE::create(); +#endif +#ifdef USE_CONTRIB + else if(descriptor=="surf" ) fdetector=cv::xfeatures2d::SURF::create(400, 4, 2, EXTENDED_SURF); +#endif + + else throw std::runtime_error("Invalid descriptor"); + assert(!descriptor.empty()); + vector features; + + + cout << "Extracting features..." << endl; + for(size_t i = 0; i < path_to_images.size(); ++i) + { + vector keypoints; + cv::Mat descriptors; + cout<<"reading image: "<detectAndCompute(image, cv::Mat(), keypoints, descriptors); + features.push_back(descriptors); + cout<<"done detecting features"< &features){ + + //test it is not created + std::ifstream ifile(filename); + if (ifile.is_open()){cerr<<"ERROR::: Output File "<(0),f.total()*f.elemSize()); + } +} + +// ---------------------------------------------------------------------------- + +int main(int argc,char **argv) +{ + + try{ + CmdLineParser cml(argc,argv); + if (cml["-h"] || argc==1){ + cerr<<"Usage: descriptor_name output image0 image1 ... \n\t descriptors:brisk,surf,orb(default),akaze(only if using opencv 3)"< features= loadFeatures(images,descriptor); + + //save features to file + saveToFile(argv[2],features); + + }catch(std::exception &ex){ + cerr< -#include - -// DBoW3 -#include "DBoW3.h" - -// OpenCV -#include -using namespace DBoW3; -using namespace std; - -//command line parser -class CmdLineParser{int argc; char **argv; public: CmdLineParser(int _argc,char **_argv):argc(_argc),argv(_argv){} bool operator[] ( string param ) {int idx=-1; for ( int i=0; i readFeaturesFromFile(string filename){ -vector features; - //test it is not created - std::ifstream ifile(filename); - if (!ifile.is_open()){cerr<<"could not open input file"<(0),features[i].total()*features[i].elemSize()); - } - return features; -} - -// ---------------------------------------------------------------------------- - -int main(int argc,char **argv) -{ - - try{ - CmdLineParser cml(argc,argv); - if (cml["-h"] || argc!=3){ - cerr<<"Usage: features output_voc.yml[.gz]"< +#include + +// DBoW3 +#include "DBoW3.h" + +// OpenCV +#include +using namespace DBoW3; +using namespace std; + +//command line parser +class CmdLineParser{int argc; char **argv; public: CmdLineParser(int _argc,char **_argv):argc(_argc),argv(_argv){} bool operator[] ( string param ) {int idx=-1; for ( int i=0; i readFeaturesFromFile(string filename){ +vector features; + //test it is not created + std::ifstream ifile(filename); + if (!ifile.is_open()){cerr<<"could not open input file"<(0),features[i].total()*features[i].elemSize()); + } + return features; +} + +// ---------------------------------------------------------------------------- + +int main(int argc,char **argv) +{ + + try{ + CmdLineParser cml(argc,argv); + if (cml["-h"] || argc!=3){ + cerr<<"Usage: features output_voc.yml[.gz]"< -#include - -// DBoW3 -#include "DBoW3.h" - -// OpenCV -#include -#include -#include -#ifdef USE_CONTRIB -#include -#include -#endif -#include "DescManip.h" - -using namespace DBoW3; -using namespace std; - - -//command line parser -class CmdLineParser{int argc; char **argv; public: CmdLineParser(int _argc,char **_argv):argc(_argc),argv(_argv){} bool operator[] ( string param ) {int idx=-1; for ( int i=0; i readImagePaths(int argc,char **argv,int start){ - vector paths; - for(int i=start;i loadFeatures( std::vector path_to_images,string descriptor="") throw (std::exception){ - //select detector - cv::Ptr fdetector; - if (descriptor=="orb") fdetector=cv::ORB::create(); - else if (descriptor=="brisk") fdetector=cv::BRISK::create(); -#ifdef OPENCV_VERSION_3 - else if (descriptor=="akaze") fdetector=cv::AKAZE::create(); -#endif -#ifdef USE_CONTRIB - else if(descriptor=="surf" ) fdetector=cv::xfeatures2d::SURF::create(400, 4, 2, EXTENDED_SURF); -#endif - - else throw std::runtime_error("Invalid descriptor"); - assert(!descriptor.empty()); - vector features; - - - cout << "Extracting features..." << endl; - for(size_t i = 0; i < path_to_images.size(); ++i) - { - vector keypoints; - cv::Mat descriptors; - cout<<"reading image: "<detectAndCompute(image, cv::Mat(), keypoints, descriptors); - features.push_back(descriptors); - cout<<"done detecting features"< &features) -{ - // branching factor and depth levels - const int k = 9; - const int L = 3; - const WeightingType weight = TF_IDF; - const ScoringType score = L1_NORM; - - DBoW3::Vocabulary voc(k, L, weight, score); - - cout << "Creating a small " << k << "^" << L << " vocabulary..." << endl; - voc.create(features); - cout << "... done!" << endl; - - cout << "Vocabulary information: " << endl - << voc << endl << endl; - - // lets do something with this vocabulary - cout << "Matching images against themselves (0 low, 1 high): " << endl; - BowVector v1, v2; - for(size_t i = 0; i < features.size(); i++) - { - voc.transform(features[i], v1); - for(size_t j = 0; j < features.size(); j++) - { - voc.transform(features[j], v2); - - double score = voc.score(v1, v2); - cout << "Image " << i << " vs Image " << j << ": " << score << endl; - } - } - - // save the vocabulary to disk - cout << endl << "Saving vocabulary..." << endl; - voc.save("small_voc.yml.gz"); - cout << "Done" << endl; -} - -////// ---------------------------------------------------------------------------- - -void testDatabase(const vector &features) -{ - cout << "Creating a small database..." << endl; - - // load the vocabulary from disk - Vocabulary voc("small_voc.yml.gz"); - - Database db(voc, false, 0); // false = do not use direct index - // (so ignore the last param) - // The direct index is useful if we want to retrieve the features that - // belong to some vocabulary node. - // db creates a copy of the vocabulary, we may get rid of "voc" now - - // add images to the database - for(size_t i = 0; i < features.size(); i++) - db.add(features[i]); - - cout << "... done!" << endl; - - cout << "Database information: " << endl << db << endl; - - // and query the database - cout << "Querying the database: " << endl; - - QueryResults ret; - for(size_t i = 0; i < features.size(); i++) - { - db.query(features[i], ret, 4); - - // ret[0] is always the same image in this case, because we added it to the - // database. ret[1] is the second best match. - - cout << "Searching for Image " << i << ". " << ret << endl; - } - - cout << endl; - - // we can save the database. The created file includes the vocabulary - // and the entries added - cout << "Saving database..." << endl; - db.save("small_db.yml.gz"); - cout << "... done!" << endl; - - // once saved, we can load it again - cout << "Retrieving database once again..." << endl; - Database db2("small_db.yml.gz"); - cout << "... done! This is: " << endl << db2 << endl; -} - - -// ---------------------------------------------------------------------------- - -int main(int argc,char **argv) -{ - - try{ - CmdLineParser cml(argc,argv); - if (cml["-h"] || argc<=2){ - cerr<<"Usage: descriptor_name image0 image1 ... \n\t descriptors:brisk,surf,orb ,akaze(only if using opencv 3)"< features= loadFeatures(images,descriptor); - testVocCreation(features); - - - testDatabase(features); - - }catch(std::exception &ex){ - cerr< +#include + +// DBoW3 +#include "DBoW3.h" + +// OpenCV +#include +#include +#include +#ifdef USE_CONTRIB +#include +#include +#endif +#include "DescManip.h" + +using namespace DBoW3; +using namespace std; + + +//command line parser +class CmdLineParser{int argc; char **argv; public: CmdLineParser(int _argc,char **_argv):argc(_argc),argv(_argv){} bool operator[] ( string param ) {int idx=-1; for ( int i=0; i readImagePaths(int argc,char **argv,int start){ + vector paths; + for(int i=start;i loadFeatures( std::vector path_to_images,string descriptor="") throw (std::exception){ + //select detector + cv::Ptr fdetector; + if (descriptor=="orb") fdetector=cv::ORB::create(); + else if (descriptor=="brisk") fdetector=cv::BRISK::create(); +#ifdef OPENCV_VERSION_3 + else if (descriptor=="akaze") fdetector=cv::AKAZE::create(); +#endif +#ifdef USE_CONTRIB + else if(descriptor=="surf" ) fdetector=cv::xfeatures2d::SURF::create(400, 4, 2, EXTENDED_SURF); +#endif + + else throw std::runtime_error("Invalid descriptor"); + assert(!descriptor.empty()); + vector features; + + + cout << "Extracting features..." << endl; + for(size_t i = 0; i < path_to_images.size(); ++i) + { + vector keypoints; + cv::Mat descriptors; + cout<<"reading image: "<detectAndCompute(image, cv::Mat(), keypoints, descriptors); + features.push_back(descriptors); + cout<<"done detecting features"< &features) +{ + // branching factor and depth levels + const int k = 9; + const int L = 3; + const WeightingType weight = TF_IDF; + const ScoringType score = L1_NORM; + + DBoW3::Vocabulary voc(k, L, weight, score); + + cout << "Creating a small " << k << "^" << L << " vocabulary..." << endl; + voc.create(features); + cout << "... done!" << endl; + + cout << "Vocabulary information: " << endl + << voc << endl << endl; + + // lets do something with this vocabulary + cout << "Matching images against themselves (0 low, 1 high): " << endl; + BowVector v1, v2; + for(size_t i = 0; i < features.size(); i++) + { + voc.transform(features[i], v1); + for(size_t j = 0; j < features.size(); j++) + { + voc.transform(features[j], v2); + + double score = voc.score(v1, v2); + cout << "Image " << i << " vs Image " << j << ": " << score << endl; + } + } + + // save the vocabulary to disk + cout << endl << "Saving vocabulary..." << endl; + voc.save("small_voc.yml.gz"); + cout << "Done" << endl; +} + +////// ---------------------------------------------------------------------------- + +void testDatabase(const vector &features) +{ + cout << "Creating a small database..." << endl; + + // load the vocabulary from disk + Vocabulary voc("small_voc.yml.gz"); + + Database db(voc, false, 0); // false = do not use direct index + // (so ignore the last param) + // The direct index is useful if we want to retrieve the features that + // belong to some vocabulary node. + // db creates a copy of the vocabulary, we may get rid of "voc" now + + // add images to the database + for(size_t i = 0; i < features.size(); i++) + db.add(features[i]); + + cout << "... done!" << endl; + + cout << "Database information: " << endl << db << endl; + + // and query the database + cout << "Querying the database: " << endl; + + QueryResults ret; + for(size_t i = 0; i < features.size(); i++) + { + db.query(features[i], ret, 4); + + // ret[0] is always the same image in this case, because we added it to the + // database. ret[1] is the second best match. + + cout << "Searching for Image " << i << ". " << ret << endl; + } + + cout << endl; + + // we can save the database. The created file includes the vocabulary + // and the entries added + cout << "Saving database..." << endl; + db.save("small_db.yml.gz"); + cout << "... done!" << endl; + + // once saved, we can load it again + cout << "Retrieving database once again..." << endl; + Database db2("small_db.yml.gz"); + cout << "... done! This is: " << endl << db2 << endl; +} + + +// ---------------------------------------------------------------------------- + +int main(int argc,char **argv) +{ + + try{ + CmdLineParser cml(argc,argv); + if (cml["-h"] || argc<=2){ + cerr<<"Usage: descriptor_name image0 image1 ... \n\t descriptors:brisk,surf,orb ,akaze(only if using opencv 3)"< features= loadFeatures(images,descriptor); + testVocCreation(features); + + + testDatabase(features); + + }catch(std::exception &ex){ + cerr< Date: Thu, 15 Aug 2019 14:00:28 +0200 Subject: [PATCH 2/2] Fix DBow3Config.cmake --- Lib/DBow3Config.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/DBow3Config.cmake b/Lib/DBow3Config.cmake index 9720a14..da63d5e 100644 --- a/Lib/DBow3Config.cmake +++ b/Lib/DBow3Config.cmake @@ -1,4 +1,4 @@ include(CMakeFindDependencyMacro) find_dependency(OpenCV) find_dependency(OpenMP) -include("${CMAKE_CURRENT_LIST_DIR}/FbowTargets.cmake") \ No newline at end of file +include("${CMAKE_CURRENT_LIST_DIR}/DBow3Targets.cmake") \ No newline at end of file