2496 lines
79 KiB
Diff
Executable file
2496 lines
79 KiB
Diff
Executable file
From d72cb42f5147f7648c462ee1b211070c1691a887 Mon Sep 17 00:00:00 2001
|
|
From: Ramadan <ramadan.ahmedr93@gmail.com>
|
|
Date: Thu, 15 Aug 2019 12:27:19 +0200
|
|
Subject: [PATCH 1/2] Fix CMakeLists.txt and installation
|
|
|
|
---
|
|
.gitignore | 249 ++++++++++
|
|
CMakeLists.txt | 275 +----------
|
|
Lib/CMakeLists.txt | 99 ++++
|
|
Lib/DBow3Config.cmake | 4 +
|
|
{src => Lib/include/DBow3}/BowVector.h | 1 +
|
|
{src => Lib/include/DBow3}/DBoW3.h | 0
|
|
{src => Lib/include/DBow3}/Database.h | 0
|
|
{src => Lib/include/DBow3}/DescManip.h | 0
|
|
{src => Lib/include/DBow3}/FeatureVector.h | 0
|
|
{src => Lib/include/DBow3}/QueryResults.h | 0
|
|
{src => Lib/include/DBow3}/ScoringObject.h | 0
|
|
{src => Lib/include/DBow3}/Vocabulary.h | 0
|
|
{src => Lib/include/DBow3}/exports.h | 16 +-
|
|
{src => Lib/include/DBow3}/quicklz.h | 0
|
|
{src => Lib/include/DBow3}/timers.h | 0
|
|
{src => Lib/src}/BowVector.cpp | 2 +-
|
|
{src => Lib/src}/Database.cpp | 2 +-
|
|
{src => Lib/src}/DescManip.cpp | 546 ++++++++++-----------
|
|
{src => Lib/src}/FeatureVector.cpp | 2 +-
|
|
{src => Lib/src}/QueryResults.cpp | 2 +-
|
|
{src => Lib/src}/ScoringObject.cpp | 4 +-
|
|
{src => Lib/src}/Vocabulary.cpp | 8 +-
|
|
{src => Lib/src}/quicklz.c | 2 +-
|
|
cmake/instructionSet.cmake | 13 +
|
|
cmake_uninstall.cmake.in | 28 --
|
|
config.cmake.in | 36 --
|
|
{utils => examples}/CMakeLists.txt | 0
|
|
{utils => examples}/create_voc_step0.cpp | 252 +++++-----
|
|
{utils => examples}/create_voc_step1.cpp | 142 +++---
|
|
{utils => examples}/demo_general.cpp | 404 +++++++--------
|
|
{utils => examples}/images/image0.png | Bin
|
|
{utils => examples}/images/image1.png | Bin
|
|
{utils => examples}/images/image2.png | Bin
|
|
{utils => examples}/images/image3.png | Bin
|
|
src/CMakeLists.txt | 35 --
|
|
orbvoc.dbow3 => voc/orbvoc.dbow3 | Bin
|
|
36 files changed, 1072 insertions(+), 1050 deletions(-)
|
|
create mode 100644 .gitignore
|
|
create mode 100644 Lib/CMakeLists.txt
|
|
create mode 100644 Lib/DBow3Config.cmake
|
|
rename {src => Lib/include/DBow3}/BowVector.h (99%)
|
|
rename {src => Lib/include/DBow3}/DBoW3.h (100%)
|
|
rename {src => Lib/include/DBow3}/Database.h (100%)
|
|
rename {src => Lib/include/DBow3}/DescManip.h (100%)
|
|
rename {src => Lib/include/DBow3}/FeatureVector.h (100%)
|
|
rename {src => Lib/include/DBow3}/QueryResults.h (100%)
|
|
rename {src => Lib/include/DBow3}/ScoringObject.h (100%)
|
|
rename {src => Lib/include/DBow3}/Vocabulary.h (100%)
|
|
rename {src => Lib/include/DBow3}/exports.h (78%)
|
|
rename {src => Lib/include/DBow3}/quicklz.h (100%)
|
|
rename {src => Lib/include/DBow3}/timers.h (100%)
|
|
rename {src => Lib/src}/BowVector.cpp (99%)
|
|
rename {src => Lib/src}/Database.cpp (99%)
|
|
rename {src => Lib/src}/DescManip.cpp (96%)
|
|
rename {src => Lib/src}/FeatureVector.cpp (98%)
|
|
rename {src => Lib/src}/QueryResults.cpp (97%)
|
|
rename {src => Lib/src}/ScoringObject.cpp (99%)
|
|
rename {src => Lib/src}/Vocabulary.cpp (99%)
|
|
rename {src => Lib/src}/quicklz.c (99%)
|
|
create mode 100644 cmake/instructionSet.cmake
|
|
delete mode 100644 cmake_uninstall.cmake.in
|
|
delete mode 100644 config.cmake.in
|
|
rename {utils => examples}/CMakeLists.txt (100%)
|
|
rename {utils => examples}/create_voc_step0.cpp (97%)
|
|
rename {utils => examples}/create_voc_step1.cpp (97%)
|
|
rename {utils => examples}/demo_general.cpp (96%)
|
|
rename {utils => examples}/images/image0.png (100%)
|
|
rename {utils => examples}/images/image1.png (100%)
|
|
rename {utils => examples}/images/image2.png (100%)
|
|
rename {utils => examples}/images/image3.png (100%)
|
|
delete mode 100644 src/CMakeLists.txt
|
|
rename orbvoc.dbow3 => voc/orbvoc.dbow3 (100%)
|
|
|
|
diff --git a/.gitignore b/.gitignore
|
|
new file mode 100644
|
|
index 0000000..8c4285e
|
|
--- /dev/null
|
|
+++ b/.gitignore
|
|
@@ -0,0 +1,249 @@
|
|
+## Ignore Visual Studio temporary files, build results, and
|
|
+## files generated by popular Visual Studio add-ons.
|
|
+
|
|
+# User-specific files
|
|
+*.suo
|
|
+*.user
|
|
+*.userosscache
|
|
+*.sln.docstates
|
|
+
|
|
+# User-specific files (MonoDevelop/Xamarin Studio)
|
|
+*.userprefs
|
|
+
|
|
+# Build results
|
|
+[Dd]ebug/
|
|
+[Dd]ebugPublic/
|
|
+[Rr]elease/
|
|
+[Rr]eleases/
|
|
+[Xx]64/
|
|
+[Xx]86/
|
|
+[Bb]uild/
|
|
+bld/
|
|
+[Bb]in/
|
|
+[Oo]bj/
|
|
+
|
|
+# Visual Studio 2015 cache/options directory
|
|
+.vs/
|
|
+out/
|
|
+# Uncomment if you have tasks that create the project's static files in wwwroot
|
|
+#wwwroot/
|
|
+
|
|
+# MSTest test Results
|
|
+[Tt]est[Rr]esult*/
|
|
+[Bb]uild[Ll]og.*
|
|
+
|
|
+# NUNIT
|
|
+*.VisualState.xml
|
|
+TestResult.xml
|
|
+
|
|
+# Build Results of an ATL Project
|
|
+[Dd]ebugPS/
|
|
+[Rr]eleasePS/
|
|
+dlldata.c
|
|
+
|
|
+# DNX
|
|
+project.lock.json
|
|
+artifacts/
|
|
+
|
|
+*_i.c
|
|
+*_p.c
|
|
+*_i.h
|
|
+*.ilk
|
|
+*.meta
|
|
+*.obj
|
|
+*.pch
|
|
+*.pdb
|
|
+*.pgc
|
|
+*.pgd
|
|
+*.rsp
|
|
+*.sbr
|
|
+*.tlb
|
|
+*.tli
|
|
+*.tlh
|
|
+*.tmp
|
|
+*.tmp_proj
|
|
+*.log
|
|
+*.vspscc
|
|
+*.vssscc
|
|
+.builds
|
|
+*.pidb
|
|
+*.svclog
|
|
+*.scc
|
|
+*.tlog
|
|
+*.idb
|
|
+# Chutzpah Test files
|
|
+_Chutzpah*
|
|
+
|
|
+# Visual C++ cache files
|
|
+ipch/
|
|
+*.aps
|
|
+*.ncb
|
|
+*.opendb
|
|
+*.opensdf
|
|
+*.sdf
|
|
+*.cachefile
|
|
+*.VC.db
|
|
+
|
|
+# Visual Studio profiler
|
|
+*.psess
|
|
+*.vsp
|
|
+*.vspx
|
|
+*.sap
|
|
+
|
|
+# TFS 2012 Local Workspace
|
|
+$tf/
|
|
+
|
|
+# Guidance Automation Toolkit
|
|
+*.gpState
|
|
+
|
|
+# ReSharper is a .NET coding add-in
|
|
+_ReSharper*/
|
|
+*.[Rr]e[Ss]harper
|
|
+*.DotSettings.user
|
|
+
|
|
+# JustCode is a .NET coding add-in
|
|
+.JustCode
|
|
+
|
|
+# TeamCity is a build add-in
|
|
+_TeamCity*
|
|
+
|
|
+# DotCover is a Code Coverage Tool
|
|
+*.dotCover
|
|
+
|
|
+# NCrunch
|
|
+_NCrunch_*
|
|
+.*crunch*.local.xml
|
|
+nCrunchTemp_*
|
|
+
|
|
+# MightyMoose
|
|
+*.mm.*
|
|
+AutoTest.Net/
|
|
+
|
|
+# Web workbench (sass)
|
|
+.sass-cache/
|
|
+
|
|
+# Installshield output folder
|
|
+[Ee]xpress/
|
|
+
|
|
+# DocProject is a documentation generator add-in
|
|
+DocProject/buildhelp/
|
|
+DocProject/Help/*.HxT
|
|
+DocProject/Help/*.HxC
|
|
+DocProject/Help/*.hhc
|
|
+DocProject/Help/*.hhk
|
|
+DocProject/Help/*.hhp
|
|
+DocProject/Help/Html2
|
|
+DocProject/Help/html
|
|
+
|
|
+# Click-Once directory
|
|
+publish/
|
|
+
|
|
+# Publish Web Output
|
|
+*.[Pp]ublish.xml
|
|
+*.azurePubxml
|
|
+
|
|
+# TODO: Un-comment the next line if you do not want to checkin
|
|
+# your web deploy settings because they may include unencrypted
|
|
+# passwords
|
|
+#*.pubxml
|
|
+*.publishproj
|
|
+
|
|
+# NuGet Packages
|
|
+*.nupkg
|
|
+# The packages folder can be ignored because of Package Restore
|
|
+**/packages/*
|
|
+# except build/, which is used as an MSBuild target.
|
|
+!**/packages/build/
|
|
+# Uncomment if necessary however generally it will be regenerated when needed
|
|
+#!**/packages/repositories.config
|
|
+# NuGet v3's project.json files produces more ignoreable files
|
|
+*.nuget.props
|
|
+*.nuget.targets
|
|
+
|
|
+# Microsoft Azure Build Output
|
|
+csx/
|
|
+*.build.csdef
|
|
+
|
|
+# Microsoft Azure Emulator
|
|
+ecf/
|
|
+rcf/
|
|
+
|
|
+# Microsoft Azure ApplicationInsights config file
|
|
+ApplicationInsights.config
|
|
+
|
|
+# Windows Store app package directory
|
|
+AppPackages/
|
|
+BundleArtifacts/
|
|
+
|
|
+# Visual Studio cache files
|
|
+# files ending in .cache can be ignored
|
|
+*.[Cc]ache
|
|
+# but keep track of directories ending in .cache
|
|
+!*.[Cc]ache/
|
|
+
|
|
+# Others
|
|
+ClientBin/
|
|
+[Ss]tyle[Cc]op.*
|
|
+~$*
|
|
+*~
|
|
+*.dbmdl
|
|
+*.dbproj.schemaview
|
|
+*.pfx
|
|
+*.publishsettings
|
|
+node_modules/
|
|
+orleans.codegen.cs
|
|
+
|
|
+# RIA/Silverlight projects
|
|
+Generated_Code/
|
|
+
|
|
+# Backup & report files from converting an old project file
|
|
+# to a newer Visual Studio version. Backup files are not needed,
|
|
+# because we have git ;-)
|
|
+_UpgradeReport_Files/
|
|
+Backup*/
|
|
+UpgradeLog*.XML
|
|
+UpgradeLog*.htm
|
|
+
|
|
+# SQL Server files
|
|
+*.mdf
|
|
+*.ldf
|
|
+
|
|
+# Business Intelligence projects
|
|
+*.rdl.data
|
|
+*.bim.layout
|
|
+*.bim_*.settings
|
|
+
|
|
+# Microsoft Fakes
|
|
+FakesAssemblies/
|
|
+
|
|
+# GhostDoc plugin setting file
|
|
+*.GhostDoc.xml
|
|
+
|
|
+# Node.js Tools for Visual Studio
|
|
+.ntvs_analysis.dat
|
|
+
|
|
+# Visual Studio 6 build log
|
|
+*.plg
|
|
+
|
|
+# Visual Studio 6 workspace options file
|
|
+*.opt
|
|
+
|
|
+# Visual Studio LightSwitch build output
|
|
+**/*.HTMLClient/GeneratedArtifacts
|
|
+**/*.DesktopClient/GeneratedArtifacts
|
|
+**/*.DesktopClient/ModelManifest.xml
|
|
+**/*.Server/GeneratedArtifacts
|
|
+**/*.Server/ModelManifest.xml
|
|
+_Pvt_Extensions
|
|
+
|
|
+# LightSwitch generated files
|
|
+GeneratedArtifacts/
|
|
+ModelManifest.xml
|
|
+
|
|
+# Paket dependency manager
|
|
+.paket/paket.exe
|
|
+
|
|
+# FAKE - F# Make
|
|
+.fake/
|
|
+html
|
|
+xml
|
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
index 9541cd7..a2a563a 100644
|
|
--- 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<Variable>=<Value>" )
|
|
-MESSAGE( STATUS )
|
|
diff --git a/Lib/CMakeLists.txt b/Lib/CMakeLists.txt
|
|
new file mode 100644
|
|
index 0000000..e56077b
|
|
--- /dev/null
|
|
+++ b/Lib/CMakeLists.txt
|
|
@@ -0,0 +1,99 @@
|
|
+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
|
|
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
+ $<INSTALL_INTERFACE:include>
|
|
+)
|
|
+
|
|
+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()
|
|
+
|
|
+if(USE_SIMD)
|
|
+ target_link_libraries(DBow3
|
|
+ PRIVATE
|
|
+ SIMD::SSE4.1
|
|
+ )
|
|
+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
|
|
diff --git a/Lib/DBow3Config.cmake b/Lib/DBow3Config.cmake
|
|
new file mode 100644
|
|
index 0000000..9720a14
|
|
--- /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 <map>
|
|
#include <vector>
|
|
+#include <ostream>
|
|
#include "exports.h"
|
|
#if _WIN32
|
|
#include <cstdint>
|
|
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 <algorithm>
|
|
#include <cmath>
|
|
|
|
-#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 <vector>
|
|
-#include <string>
|
|
-#include <sstream>
|
|
-#include <iostream>
|
|
-#include <stdint.h>
|
|
-#include <limits.h>
|
|
-
|
|
-#include "DescManip.h"
|
|
-
|
|
-using namespace std;
|
|
-
|
|
-namespace DBoW3 {
|
|
-
|
|
-// --------------------------------------------------------------------------
|
|
-
|
|
-void DescManip::meanValue(const std::vector<cv::Mat> &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<int> 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<unsigned char>();
|
|
-
|
|
- 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<unsigned char>();
|
|
-
|
|
- 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<descriptors.size();i++)
|
|
- mean += descriptors[i] * inv_s;
|
|
-
|
|
- }
|
|
-
|
|
-}
|
|
-
|
|
-// --------------------------------------------------------------------------
|
|
-static inline uint32_t distance_8uc1(const cv::Mat &a, const cv::Mat &b);
|
|
-
|
|
-double DescManip::distance(const cv::Mat &a, const cv::Mat &b)
|
|
-{
|
|
-
|
|
- //binary descriptor
|
|
- if (a.type()==CV_8U){
|
|
-
|
|
- // Bit count function got from:
|
|
- // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan
|
|
- // This implementation assumes that a.cols (CV_8U) % sizeof(uint64_t) == 0
|
|
-
|
|
- const uint64_t *pa, *pb;
|
|
- pa = a.ptr<uint64_t>(); // a & b are actually CV_8U
|
|
- pb = b.ptr<uint64_t>();
|
|
-
|
|
- 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<float>(0);
|
|
- const float *b_ptr=b.ptr<float>(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 <<a.type()<<" "<<a.cols<<" ";
|
|
-
|
|
- if (a.type()==CV_8U){
|
|
- const unsigned char *p = a.ptr<unsigned char>();
|
|
- for(int i = 0; i < a.cols; ++i, ++p)
|
|
- ss << (int)*p << " ";
|
|
- }else{
|
|
-
|
|
- const float *p = a.ptr<float>();
|
|
- 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<s.size();i++)
|
|
- ss_aux.push_back(s[i]);
|
|
- if(ss_aux.find("dbw3")==std::string::npos){//is dbow2
|
|
- //READ UNTIL END
|
|
- stringstream ss(s);
|
|
- int val;
|
|
- vector<uchar> data;data.reserve(100);
|
|
- while( ss>>val) data.push_back(val);
|
|
- //copy to a
|
|
- a.create(1,data.size(),CV_8UC1);
|
|
- memcpy(a.ptr<char>(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<unsigned char>();
|
|
- int n;
|
|
- for(int i = 0; i < a.cols; ++i, ++p)
|
|
- if ( ss >> n) *p = (unsigned char)n;
|
|
- }
|
|
- else{
|
|
- float *p = a.ptr<float>();
|
|
- for(int i = 0; i < a.cols; ++i, ++p)
|
|
- if ( !(ss >> *p))cerr<<"Error reading. Unexpected EOF. DescManip::fromString"<<endl;
|
|
- }
|
|
-
|
|
- }
|
|
-
|
|
-}
|
|
-
|
|
-// --------------------------------------------------------------------------
|
|
-
|
|
-void DescManip::toMat32F(const std::vector<cv::Mat> &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<float>();
|
|
-
|
|
- for(size_t i = 0; i < N; ++i)
|
|
- {
|
|
- const int C = descriptors[i].cols;
|
|
- const unsigned char *desc = descriptors[i].ptr<unsigned char>();
|
|
-
|
|
- 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<float>(i),descriptors[i].ptr<float>(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<char>(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<char>(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 <vector>
|
|
+#include <string>
|
|
+#include <sstream>
|
|
+#include <iostream>
|
|
+#include <stdint.h>
|
|
+#include <limits.h>
|
|
+
|
|
+#include "DBow3/DescManip.h"
|
|
+
|
|
+using namespace std;
|
|
+
|
|
+namespace DBoW3 {
|
|
+
|
|
+// --------------------------------------------------------------------------
|
|
+
|
|
+void DescManip::meanValue(const std::vector<cv::Mat> &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<int> 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<unsigned char>();
|
|
+
|
|
+ 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<unsigned char>();
|
|
+
|
|
+ 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<descriptors.size();i++)
|
|
+ mean += descriptors[i] * inv_s;
|
|
+
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+// --------------------------------------------------------------------------
|
|
+static inline uint32_t distance_8uc1(const cv::Mat &a, const cv::Mat &b);
|
|
+
|
|
+double DescManip::distance(const cv::Mat &a, const cv::Mat &b)
|
|
+{
|
|
+
|
|
+ //binary descriptor
|
|
+ if (a.type()==CV_8U){
|
|
+
|
|
+ // Bit count function got from:
|
|
+ // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan
|
|
+ // This implementation assumes that a.cols (CV_8U) % sizeof(uint64_t) == 0
|
|
+
|
|
+ const uint64_t *pa, *pb;
|
|
+ pa = a.ptr<uint64_t>(); // a & b are actually CV_8U
|
|
+ pb = b.ptr<uint64_t>();
|
|
+
|
|
+ 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<float>(0);
|
|
+ const float *b_ptr=b.ptr<float>(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 <<a.type()<<" "<<a.cols<<" ";
|
|
+
|
|
+ if (a.type()==CV_8U){
|
|
+ const unsigned char *p = a.ptr<unsigned char>();
|
|
+ for(int i = 0; i < a.cols; ++i, ++p)
|
|
+ ss << (int)*p << " ";
|
|
+ }else{
|
|
+
|
|
+ const float *p = a.ptr<float>();
|
|
+ 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<s.size();i++)
|
|
+ ss_aux.push_back(s[i]);
|
|
+ if(ss_aux.find("dbw3")==std::string::npos){//is dbow2
|
|
+ //READ UNTIL END
|
|
+ stringstream ss(s);
|
|
+ int val;
|
|
+ vector<uchar> data;data.reserve(100);
|
|
+ while( ss>>val) data.push_back(val);
|
|
+ //copy to a
|
|
+ a.create(1,data.size(),CV_8UC1);
|
|
+ memcpy(a.ptr<char>(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<unsigned char>();
|
|
+ int n;
|
|
+ for(int i = 0; i < a.cols; ++i, ++p)
|
|
+ if ( ss >> n) *p = (unsigned char)n;
|
|
+ }
|
|
+ else{
|
|
+ float *p = a.ptr<float>();
|
|
+ for(int i = 0; i < a.cols; ++i, ++p)
|
|
+ if ( !(ss >> *p))cerr<<"Error reading. Unexpected EOF. DescManip::fromString"<<endl;
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+// --------------------------------------------------------------------------
|
|
+
|
|
+void DescManip::toMat32F(const std::vector<cv::Mat> &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<float>();
|
|
+
|
|
+ for(size_t i = 0; i < N; ++i)
|
|
+ {
|
|
+ const int C = descriptors[i].cols;
|
|
+ const unsigned char *desc = descriptors[i].ptr<unsigned char>();
|
|
+
|
|
+ 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<float>(i),descriptors[i].ptr<float>(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<char>(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<char>(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 <map>
|
|
#include <vector>
|
|
#include <iostream>
|
|
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 <iostream>
|
|
#include <fstream>
|
|
-#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 <cfloat>
|
|
-#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 <sstream>
|
|
-#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
|
|
+ $<$<PLATFORM_ID:Linux>:-msse4.1;-march=native>
|
|
+ $<$<PLATFORM_ID:Windows>:/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 <iostream>
|
|
-#include <vector>
|
|
-
|
|
-// DBoW3
|
|
-#include "DBoW3.h"
|
|
-
|
|
-// OpenCV
|
|
-#include <opencv2/core/core.hpp>
|
|
-#include <opencv2/highgui/highgui.hpp>
|
|
-#include <opencv2/features2d/features2d.hpp>
|
|
-#ifdef USE_CONTRIB
|
|
-#include <opencv2/xfeatures2d/nonfree.hpp>
|
|
-#include <opencv2/xfeatures2d.hpp>
|
|
-#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<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; return ( idx!=-1 ) ; } string operator()(string param,string defvalue="-1"){int idx=-1; for ( int i=0; i<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; if ( idx==-1 ) return defvalue; else return ( argv[ idx+1] ); }};
|
|
-
|
|
-
|
|
-// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
-
|
|
-// extended surf gives 128-dimensional vectors
|
|
-const bool EXTENDED_SURF = false;
|
|
-// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
-
|
|
-void wait()
|
|
-{
|
|
- cout << endl << "Press enter to continue" << endl;
|
|
- getchar();
|
|
-}
|
|
-
|
|
-
|
|
-vector<string> readImagePaths(int argc,char **argv,int start){
|
|
- vector<string> paths;
|
|
- for(int i=start;i<argc;i++) paths.push_back(argv[i]);
|
|
- return paths;
|
|
-}
|
|
-
|
|
-vector< cv::Mat > loadFeatures( std::vector<string> path_to_images,string descriptor="") throw (std::exception){
|
|
- //select detector
|
|
- cv::Ptr<cv::Feature2D> 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<cv::Mat> features;
|
|
-
|
|
-
|
|
- cout << "Extracting features..." << endl;
|
|
- for(size_t i = 0; i < path_to_images.size(); ++i)
|
|
- {
|
|
- vector<cv::KeyPoint> keypoints;
|
|
- cv::Mat descriptors;
|
|
- cout<<"reading image: "<<path_to_images[i]<<endl;
|
|
- cv::Mat image = cv::imread(path_to_images[i], 0);
|
|
- if(image.empty())throw std::runtime_error("Could not open image"+path_to_images[i]);
|
|
- cout<<"extracting features"<<endl;
|
|
- fdetector->detectAndCompute(image, cv::Mat(), keypoints, descriptors);
|
|
- features.push_back(descriptors);
|
|
- cout<<"done detecting features"<<endl;
|
|
- }
|
|
- return features;
|
|
-}
|
|
-
|
|
-// ----------------------------------------------------------------------------
|
|
-void saveToFile(string filename,const vector<cv::Mat> &features){
|
|
-
|
|
- //test it is not created
|
|
- std::ifstream ifile(filename);
|
|
- if (ifile.is_open()){cerr<<"ERROR::: Output File "<<filename<<" already exists!!!!!"<<endl;exit(0);}
|
|
- std::ofstream ofile(filename);
|
|
- if (!ofile.is_open()){cerr<<"could not open output file"<<endl;exit(0);}
|
|
- uint32_t size=features.size();
|
|
- ofile.write((char*)&size,sizeof(size));
|
|
- for(auto &f:features){
|
|
- if( !f.isContinuous()){
|
|
- cerr<<"Matrices should be continuous"<<endl;exit(0);
|
|
- }
|
|
- uint32_t aux=f.cols; ofile.write( (char*)&aux,sizeof(aux));
|
|
- aux=f.rows; ofile.write( (char*)&aux,sizeof(aux));
|
|
- aux=f.type(); ofile.write( (char*)&aux,sizeof(aux));
|
|
- ofile.write( (char*)f.ptr<uchar>(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)"<<endl;
|
|
- return -1;
|
|
- }
|
|
-
|
|
- string descriptor=argv[1];
|
|
- string output=argv[2];
|
|
-
|
|
- auto images=readImagePaths(argc,argv,3);
|
|
- vector< cv::Mat > features= loadFeatures(images,descriptor);
|
|
-
|
|
- //save features to file
|
|
- saveToFile(argv[2],features);
|
|
-
|
|
- }catch(std::exception &ex){
|
|
- cerr<<ex.what()<<endl;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
+
|
|
+//First step of creating a vocabulary is extracting features from a set of images. We save them to a file for next step
|
|
+#include <iostream>
|
|
+#include <vector>
|
|
+
|
|
+// DBoW3
|
|
+#include "DBoW3.h"
|
|
+
|
|
+// OpenCV
|
|
+#include <opencv2/core/core.hpp>
|
|
+#include <opencv2/highgui/highgui.hpp>
|
|
+#include <opencv2/features2d/features2d.hpp>
|
|
+#ifdef USE_CONTRIB
|
|
+#include <opencv2/xfeatures2d/nonfree.hpp>
|
|
+#include <opencv2/xfeatures2d.hpp>
|
|
+#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<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; return ( idx!=-1 ) ; } string operator()(string param,string defvalue="-1"){int idx=-1; for ( int i=0; i<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; if ( idx==-1 ) return defvalue; else return ( argv[ idx+1] ); }};
|
|
+
|
|
+
|
|
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
+
|
|
+// extended surf gives 128-dimensional vectors
|
|
+const bool EXTENDED_SURF = false;
|
|
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
+
|
|
+void wait()
|
|
+{
|
|
+ cout << endl << "Press enter to continue" << endl;
|
|
+ getchar();
|
|
+}
|
|
+
|
|
+
|
|
+vector<string> readImagePaths(int argc,char **argv,int start){
|
|
+ vector<string> paths;
|
|
+ for(int i=start;i<argc;i++) paths.push_back(argv[i]);
|
|
+ return paths;
|
|
+}
|
|
+
|
|
+vector< cv::Mat > loadFeatures( std::vector<string> path_to_images,string descriptor="") throw (std::exception){
|
|
+ //select detector
|
|
+ cv::Ptr<cv::Feature2D> 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<cv::Mat> features;
|
|
+
|
|
+
|
|
+ cout << "Extracting features..." << endl;
|
|
+ for(size_t i = 0; i < path_to_images.size(); ++i)
|
|
+ {
|
|
+ vector<cv::KeyPoint> keypoints;
|
|
+ cv::Mat descriptors;
|
|
+ cout<<"reading image: "<<path_to_images[i]<<endl;
|
|
+ cv::Mat image = cv::imread(path_to_images[i], 0);
|
|
+ if(image.empty())throw std::runtime_error("Could not open image"+path_to_images[i]);
|
|
+ cout<<"extracting features"<<endl;
|
|
+ fdetector->detectAndCompute(image, cv::Mat(), keypoints, descriptors);
|
|
+ features.push_back(descriptors);
|
|
+ cout<<"done detecting features"<<endl;
|
|
+ }
|
|
+ return features;
|
|
+}
|
|
+
|
|
+// ----------------------------------------------------------------------------
|
|
+void saveToFile(string filename,const vector<cv::Mat> &features){
|
|
+
|
|
+ //test it is not created
|
|
+ std::ifstream ifile(filename);
|
|
+ if (ifile.is_open()){cerr<<"ERROR::: Output File "<<filename<<" already exists!!!!!"<<endl;exit(0);}
|
|
+ std::ofstream ofile(filename);
|
|
+ if (!ofile.is_open()){cerr<<"could not open output file"<<endl;exit(0);}
|
|
+ uint32_t size=features.size();
|
|
+ ofile.write((char*)&size,sizeof(size));
|
|
+ for(auto &f:features){
|
|
+ if( !f.isContinuous()){
|
|
+ cerr<<"Matrices should be continuous"<<endl;exit(0);
|
|
+ }
|
|
+ uint32_t aux=f.cols; ofile.write( (char*)&aux,sizeof(aux));
|
|
+ aux=f.rows; ofile.write( (char*)&aux,sizeof(aux));
|
|
+ aux=f.type(); ofile.write( (char*)&aux,sizeof(aux));
|
|
+ ofile.write( (char*)f.ptr<uchar>(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)"<<endl;
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ string descriptor=argv[1];
|
|
+ string output=argv[2];
|
|
+
|
|
+ auto images=readImagePaths(argc,argv,3);
|
|
+ vector< cv::Mat > features= loadFeatures(images,descriptor);
|
|
+
|
|
+ //save features to file
|
|
+ saveToFile(argv[2],features);
|
|
+
|
|
+ }catch(std::exception &ex){
|
|
+ cerr<<ex.what()<<endl;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
diff --git a/utils/create_voc_step1.cpp b/examples/create_voc_step1.cpp
|
|
similarity index 97%
|
|
rename from utils/create_voc_step1.cpp
|
|
rename to examples/create_voc_step1.cpp
|
|
index 8d9de7d..1f82c66 100644
|
|
--- a/utils/create_voc_step1.cpp
|
|
+++ b/examples/create_voc_step1.cpp
|
|
@@ -1,71 +1,71 @@
|
|
-//Second step,creates the vocabulary from the set of features. It can be slow
|
|
-#include <iostream>
|
|
-#include <vector>
|
|
-
|
|
-// DBoW3
|
|
-#include "DBoW3.h"
|
|
-
|
|
-// OpenCV
|
|
-#include <opencv2/core/core.hpp>
|
|
-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<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; return ( idx!=-1 ) ; } string operator()(string param,string defvalue="-1"){int idx=-1; for ( int i=0; i<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; if ( idx==-1 ) return defvalue; else return ( argv[ idx+1] ); }};
|
|
-
|
|
-// ----------------------------------------------------------------------------
|
|
-
|
|
-// ----------------------------------------------------------------------------
|
|
-vector<cv::Mat> readFeaturesFromFile(string filename){
|
|
-vector<cv::Mat> features;
|
|
- //test it is not created
|
|
- std::ifstream ifile(filename);
|
|
- if (!ifile.is_open()){cerr<<"could not open input file"<<endl;exit(0);}
|
|
- uint32_t size;
|
|
- ifile.read((char*)&size,sizeof(size));
|
|
- features.resize(size);
|
|
- for(size_t i=0;i<size;i++){
|
|
-
|
|
- uint32_t cols,rows,type;
|
|
- ifile.read( (char*)&cols,sizeof(cols));
|
|
- ifile.read( (char*)&rows,sizeof(rows));
|
|
- ifile.read( (char*)&type,sizeof(type));
|
|
- features[i].create(rows,cols,type);
|
|
- ifile.read( (char*)features[i].ptr<uchar>(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]"<<endl;
|
|
- return -1;
|
|
- }
|
|
-
|
|
-
|
|
- auto features=readFeaturesFromFile(argv[1]);
|
|
-
|
|
- 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);
|
|
- cerr<<"Saving "<<argv[2]<<endl;
|
|
- voc.save(argv[2]);
|
|
-
|
|
-
|
|
- }catch(std::exception &ex){
|
|
- cerr<<ex.what()<<endl;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
+//Second step,creates the vocabulary from the set of features. It can be slow
|
|
+#include <iostream>
|
|
+#include <vector>
|
|
+
|
|
+// DBoW3
|
|
+#include "DBoW3.h"
|
|
+
|
|
+// OpenCV
|
|
+#include <opencv2/core/core.hpp>
|
|
+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<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; return ( idx!=-1 ) ; } string operator()(string param,string defvalue="-1"){int idx=-1; for ( int i=0; i<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; if ( idx==-1 ) return defvalue; else return ( argv[ idx+1] ); }};
|
|
+
|
|
+// ----------------------------------------------------------------------------
|
|
+
|
|
+// ----------------------------------------------------------------------------
|
|
+vector<cv::Mat> readFeaturesFromFile(string filename){
|
|
+vector<cv::Mat> features;
|
|
+ //test it is not created
|
|
+ std::ifstream ifile(filename);
|
|
+ if (!ifile.is_open()){cerr<<"could not open input file"<<endl;exit(0);}
|
|
+ uint32_t size;
|
|
+ ifile.read((char*)&size,sizeof(size));
|
|
+ features.resize(size);
|
|
+ for(size_t i=0;i<size;i++){
|
|
+
|
|
+ uint32_t cols,rows,type;
|
|
+ ifile.read( (char*)&cols,sizeof(cols));
|
|
+ ifile.read( (char*)&rows,sizeof(rows));
|
|
+ ifile.read( (char*)&type,sizeof(type));
|
|
+ features[i].create(rows,cols,type);
|
|
+ ifile.read( (char*)features[i].ptr<uchar>(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]"<<endl;
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+
|
|
+ auto features=readFeaturesFromFile(argv[1]);
|
|
+
|
|
+ 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);
|
|
+ cerr<<"Saving "<<argv[2]<<endl;
|
|
+ voc.save(argv[2]);
|
|
+
|
|
+
|
|
+ }catch(std::exception &ex){
|
|
+ cerr<<ex.what()<<endl;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
diff --git a/utils/demo_general.cpp b/examples/demo_general.cpp
|
|
similarity index 96%
|
|
rename from utils/demo_general.cpp
|
|
rename to examples/demo_general.cpp
|
|
index 63db40b..b4bc391 100644
|
|
--- a/utils/demo_general.cpp
|
|
+++ b/examples/demo_general.cpp
|
|
@@ -1,202 +1,202 @@
|
|
-/**
|
|
- * Date: 2016
|
|
- * Author: Rafael Muñoz Salinas
|
|
- * Description: demo application of DBoW3
|
|
- * License: see the LICENSE.txt file
|
|
- */
|
|
-
|
|
-#include <iostream>
|
|
-#include <vector>
|
|
-
|
|
-// DBoW3
|
|
-#include "DBoW3.h"
|
|
-
|
|
-// OpenCV
|
|
-#include <opencv2/core/core.hpp>
|
|
-#include <opencv2/highgui/highgui.hpp>
|
|
-#include <opencv2/features2d/features2d.hpp>
|
|
-#ifdef USE_CONTRIB
|
|
-#include <opencv2/xfeatures2d/nonfree.hpp>
|
|
-#include <opencv2/xfeatures2d.hpp>
|
|
-#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<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; return ( idx!=-1 ) ; } string operator()(string param,string defvalue="-1"){int idx=-1; for ( int i=0; i<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; if ( idx==-1 ) return defvalue; else return ( argv[ idx+1] ); }};
|
|
-
|
|
-
|
|
-// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
-
|
|
-// extended surf gives 128-dimensional vectors
|
|
-const bool EXTENDED_SURF = false;
|
|
-// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
-
|
|
-void wait()
|
|
-{
|
|
- cout << endl << "Press enter to continue" << endl;
|
|
- getchar();
|
|
-}
|
|
-
|
|
-
|
|
-vector<string> readImagePaths(int argc,char **argv,int start){
|
|
- vector<string> paths;
|
|
- for(int i=start;i<argc;i++) paths.push_back(argv[i]);
|
|
- return paths;
|
|
-}
|
|
-
|
|
-vector< cv::Mat > loadFeatures( std::vector<string> path_to_images,string descriptor="") throw (std::exception){
|
|
- //select detector
|
|
- cv::Ptr<cv::Feature2D> 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<cv::Mat> features;
|
|
-
|
|
-
|
|
- cout << "Extracting features..." << endl;
|
|
- for(size_t i = 0; i < path_to_images.size(); ++i)
|
|
- {
|
|
- vector<cv::KeyPoint> keypoints;
|
|
- cv::Mat descriptors;
|
|
- cout<<"reading image: "<<path_to_images[i]<<endl;
|
|
- cv::Mat image = cv::imread(path_to_images[i], 0);
|
|
- if(image.empty())throw std::runtime_error("Could not open image"+path_to_images[i]);
|
|
- cout<<"extracting features"<<endl;
|
|
- fdetector->detectAndCompute(image, cv::Mat(), keypoints, descriptors);
|
|
- features.push_back(descriptors);
|
|
- cout<<"done detecting features"<<endl;
|
|
- }
|
|
- return features;
|
|
-}
|
|
-
|
|
-// ----------------------------------------------------------------------------
|
|
-
|
|
-void testVocCreation(const vector<cv::Mat> &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<cv::Mat > &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)"<<endl;
|
|
- return -1;
|
|
- }
|
|
-
|
|
- string descriptor=argv[1];
|
|
-
|
|
- auto images=readImagePaths(argc,argv,2);
|
|
- vector< cv::Mat > features= loadFeatures(images,descriptor);
|
|
- testVocCreation(features);
|
|
-
|
|
-
|
|
- testDatabase(features);
|
|
-
|
|
- }catch(std::exception &ex){
|
|
- cerr<<ex.what()<<endl;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
+/**
|
|
+ * Date: 2016
|
|
+ * Author: Rafael Muñoz Salinas
|
|
+ * Description: demo application of DBoW3
|
|
+ * License: see the LICENSE.txt file
|
|
+ */
|
|
+
|
|
+#include <iostream>
|
|
+#include <vector>
|
|
+
|
|
+// DBoW3
|
|
+#include "DBoW3.h"
|
|
+
|
|
+// OpenCV
|
|
+#include <opencv2/core/core.hpp>
|
|
+#include <opencv2/highgui/highgui.hpp>
|
|
+#include <opencv2/features2d/features2d.hpp>
|
|
+#ifdef USE_CONTRIB
|
|
+#include <opencv2/xfeatures2d/nonfree.hpp>
|
|
+#include <opencv2/xfeatures2d.hpp>
|
|
+#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<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; return ( idx!=-1 ) ; } string operator()(string param,string defvalue="-1"){int idx=-1; for ( int i=0; i<argc && idx==-1; i++ ) if ( string ( argv[i] ) ==param ) idx=i; if ( idx==-1 ) return defvalue; else return ( argv[ idx+1] ); }};
|
|
+
|
|
+
|
|
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
+
|
|
+// extended surf gives 128-dimensional vectors
|
|
+const bool EXTENDED_SURF = false;
|
|
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
+
|
|
+void wait()
|
|
+{
|
|
+ cout << endl << "Press enter to continue" << endl;
|
|
+ getchar();
|
|
+}
|
|
+
|
|
+
|
|
+vector<string> readImagePaths(int argc,char **argv,int start){
|
|
+ vector<string> paths;
|
|
+ for(int i=start;i<argc;i++) paths.push_back(argv[i]);
|
|
+ return paths;
|
|
+}
|
|
+
|
|
+vector< cv::Mat > loadFeatures( std::vector<string> path_to_images,string descriptor="") throw (std::exception){
|
|
+ //select detector
|
|
+ cv::Ptr<cv::Feature2D> 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<cv::Mat> features;
|
|
+
|
|
+
|
|
+ cout << "Extracting features..." << endl;
|
|
+ for(size_t i = 0; i < path_to_images.size(); ++i)
|
|
+ {
|
|
+ vector<cv::KeyPoint> keypoints;
|
|
+ cv::Mat descriptors;
|
|
+ cout<<"reading image: "<<path_to_images[i]<<endl;
|
|
+ cv::Mat image = cv::imread(path_to_images[i], 0);
|
|
+ if(image.empty())throw std::runtime_error("Could not open image"+path_to_images[i]);
|
|
+ cout<<"extracting features"<<endl;
|
|
+ fdetector->detectAndCompute(image, cv::Mat(), keypoints, descriptors);
|
|
+ features.push_back(descriptors);
|
|
+ cout<<"done detecting features"<<endl;
|
|
+ }
|
|
+ return features;
|
|
+}
|
|
+
|
|
+// ----------------------------------------------------------------------------
|
|
+
|
|
+void testVocCreation(const vector<cv::Mat> &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<cv::Mat > &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)"<<endl;
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ string descriptor=argv[1];
|
|
+
|
|
+ auto images=readImagePaths(argc,argv,2);
|
|
+ vector< cv::Mat > features= loadFeatures(images,descriptor);
|
|
+ testVocCreation(features);
|
|
+
|
|
+
|
|
+ testDatabase(features);
|
|
+
|
|
+ }catch(std::exception &ex){
|
|
+ cerr<<ex.what()<<endl;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
diff --git a/utils/images/image0.png b/examples/images/image0.png
|
|
similarity index 100%
|
|
rename from utils/images/image0.png
|
|
rename to examples/images/image0.png
|
|
diff --git a/utils/images/image1.png b/examples/images/image1.png
|
|
similarity index 100%
|
|
rename from utils/images/image1.png
|
|
rename to examples/images/image1.png
|
|
diff --git a/utils/images/image2.png b/examples/images/image2.png
|
|
similarity index 100%
|
|
rename from utils/images/image2.png
|
|
rename to examples/images/image2.png
|
|
diff --git a/utils/images/image3.png b/examples/images/image3.png
|
|
similarity index 100%
|
|
rename from utils/images/image3.png
|
|
rename to examples/images/image3.png
|
|
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
|
|
deleted file mode 100644
|
|
index a9c52b4..0000000
|
|
--- a/src/CMakeLists.txt
|
|
+++ /dev/null
|
|
@@ -1,35 +0,0 @@
|
|
-INCLUDE_DIRECTORIES(. ./utils/)
|
|
-
|
|
-FILE(GLOB hdrs_base "*.h" )
|
|
-FILE(GLOB srcs_base "*.c*")
|
|
-
|
|
-FILE(GLOB hdrs ${hdrs_base} )
|
|
-FILE(GLOB srcs ${srcs_base} )
|
|
-
|
|
-
|
|
-ADD_LIBRARY(${PROJECT_NAME} ${srcs} ${hdrs})
|
|
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} )
|
|
-
|
|
-SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES # create *nix style library versions + symbolic links
|
|
- DEFINE_SYMBOL DBOW_DSO_EXPORTS
|
|
- VERSION ${PROJECT_VERSION}
|
|
- SOVERSION ${PROJECT_SOVERSION}
|
|
- CLEAN_DIRECT_OUTPUT 1 # allow creating static and shared libs without conflicts
|
|
- OUTPUT_NAME "${PROJECT_NAME}${PROJECT_DLLVERSION}" # avoid conflicts between library and binary target names
|
|
-)
|
|
-
|
|
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${REQUIRED_LIBRARIES} )
|
|
-
|
|
-INSTALL(TARGETS ${PROJECT_NAME}
|
|
- RUNTIME DESTINATION bin COMPONENT main # Install the dll file in bin directory
|
|
- LIBRARY DESTINATION ${LIB_INSTALL_DIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE COMPONENT main
|
|
- ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT main) # Install the dll.a file in lib directory
|
|
-
|
|
-
|
|
-
|
|
-INSTALL(FILES ${hdrs_base}
|
|
- DESTINATION include/${PROJECT_NAME}
|
|
- COMPONENT main)
|
|
-
|
|
-
|
|
-
|
|
diff --git a/orbvoc.dbow3 b/voc/orbvoc.dbow3
|
|
similarity index 100%
|
|
rename from orbvoc.dbow3
|
|
rename to voc/orbvoc.dbow3
|
|
|
|
From 9f9a9125423edd0b2cc7c84897d4387c5dcea44b Mon Sep 17 00:00:00 2001
|
|
From: Ramadan <ramadan.ahmedr93@gmail.com>
|
|
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
|