Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
xuning
/
xlite-dev-rvm-windows
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
ningwebbeginner
2025-04-03 10:08:45 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
308185e542ac7a9487366ed6c19571db744544cb
308185e5
1 parent
3a0d5b4b
inital
隐藏空白字符变更
内嵌
并排对比
正在显示
15 个修改的文件
包含
4390 行增加
和
0 行删除
lite.ai.toolkit/include/opencv2/dnn/layer.hpp
lite.ai.toolkit/include/opencv2/dnn/shape_utils.hpp
lite.ai.toolkit/include/opencv2/dnn/utils/inference_engine.hpp
lite.ai.toolkit/include/opencv2/dnn/version.hpp
lite.ai.toolkit/include/opencv2/features2d.hpp
lite.ai.toolkit/include/opencv2/features2d/features2d.hpp
lite.ai.toolkit/include/opencv2/features2d/hal/interface.h
lite.ai.toolkit/include/opencv2/flann.hpp
lite.ai.toolkit/include/opencv2/flann/all_indices.h
lite.ai.toolkit/include/opencv2/flann/allocator.h
lite.ai.toolkit/include/opencv2/flann/any.h
lite.ai.toolkit/include/opencv2/flann/autotuned_index.h
lite.ai.toolkit/include/opencv2/flann/composite_index.h
lite.ai.toolkit/include/opencv2/flann/config.h
lite.ai.toolkit/include/opencv2/flann/defines.h
要显示太多修改。
重新载入完整差异
差异文件
邮件补丁
为保证性能只显示
15 of 15+
个文件。
lite.ai.toolkit/include/opencv2/dnn/layer.hpp
0 → 100644
查看文件 @
308185e
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef OPENCV_DNN_LAYER_HPP
#define OPENCV_DNN_LAYER_HPP
#include <opencv2/dnn.hpp>
namespace
cv
{
namespace
dnn
{
CV__DNN_INLINE_NS_BEGIN
//! @addtogroup dnn
//! @{
//!
//! @defgroup dnnLayerFactory Utilities for New Layers Registration
//! @{
/** @brief %Layer factory allows to create instances of registered layers. */
class
CV_EXPORTS
LayerFactory
{
public
:
//! Each Layer class must provide this function to the factory
typedef
Ptr
<
Layer
>
(
*
Constructor
)(
LayerParams
&
params
);
//! Registers the layer class with typename @p type and specified @p constructor. Thread-safe.
static
void
registerLayer
(
const
String
&
type
,
Constructor
constructor
);
//! Unregisters registered layer with specified type name. Thread-safe.
static
void
unregisterLayer
(
const
String
&
type
);
/** @brief Creates instance of registered layer.
* @param type type name of creating layer.
* @param params parameters which will be used for layer initialization.
* @note Thread-safe.
*/
static
Ptr
<
Layer
>
createLayerInstance
(
const
String
&
type
,
LayerParams
&
params
);
private
:
LayerFactory
();
};
//! @}
//! @}
CV__DNN_INLINE_NS_END
}
}
#endif
...
...
lite.ai.toolkit/include/opencv2/dnn/shape_utils.hpp
0 → 100644
查看文件 @
308185e
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef OPENCV_DNN_DNN_SHAPE_UTILS_HPP
#define OPENCV_DNN_DNN_SHAPE_UTILS_HPP
#include <opencv2/dnn/dnn.hpp>
#include <opencv2/core/types_c.h> // CV_MAX_DIM
#include <iostream>
#include <ostream>
#include <sstream>
namespace
cv
{
namespace
dnn
{
CV__DNN_INLINE_NS_BEGIN
//Slicing
struct
_Range
:
public
cv
::
Range
{
_Range
(
const
Range
&
r
)
:
cv
::
Range
(
r
)
{}
_Range
(
int
start_
,
int
size_
=
1
)
:
cv
::
Range
(
start_
,
start_
+
size_
)
{}
};
static
inline
Mat
slice
(
const
Mat
&
m
,
const
_Range
&
r0
)
{
Range
ranges
[
CV_MAX_DIM
];
for
(
int
i
=
1
;
i
<
m
.
dims
;
i
++
)
ranges
[
i
]
=
Range
::
all
();
ranges
[
0
]
=
r0
;
return
m
(
&
ranges
[
0
]);
}
static
inline
Mat
slice
(
const
Mat
&
m
,
const
_Range
&
r0
,
const
_Range
&
r1
)
{
CV_Assert
(
m
.
dims
>=
2
);
Range
ranges
[
CV_MAX_DIM
];
for
(
int
i
=
2
;
i
<
m
.
dims
;
i
++
)
ranges
[
i
]
=
Range
::
all
();
ranges
[
0
]
=
r0
;
ranges
[
1
]
=
r1
;
return
m
(
&
ranges
[
0
]);
}
static
inline
Mat
slice
(
const
Mat
&
m
,
const
_Range
&
r0
,
const
_Range
&
r1
,
const
_Range
&
r2
)
{
CV_Assert
(
m
.
dims
>=
3
);
Range
ranges
[
CV_MAX_DIM
];
for
(
int
i
=
3
;
i
<
m
.
dims
;
i
++
)
ranges
[
i
]
=
Range
::
all
();
ranges
[
0
]
=
r0
;
ranges
[
1
]
=
r1
;
ranges
[
2
]
=
r2
;
return
m
(
&
ranges
[
0
]);
}
static
inline
Mat
slice
(
const
Mat
&
m
,
const
_Range
&
r0
,
const
_Range
&
r1
,
const
_Range
&
r2
,
const
_Range
&
r3
)
{
CV_Assert
(
m
.
dims
>=
4
);
Range
ranges
[
CV_MAX_DIM
];
for
(
int
i
=
4
;
i
<
m
.
dims
;
i
++
)
ranges
[
i
]
=
Range
::
all
();
ranges
[
0
]
=
r0
;
ranges
[
1
]
=
r1
;
ranges
[
2
]
=
r2
;
ranges
[
3
]
=
r3
;
return
m
(
&
ranges
[
0
]);
}
static
inline
Mat
getPlane
(
const
Mat
&
m
,
int
n
,
int
cn
)
{
CV_Assert
(
m
.
dims
>
2
);
int
sz
[
CV_MAX_DIM
];
for
(
int
i
=
2
;
i
<
m
.
dims
;
i
++
)
{
sz
[
i
-
2
]
=
m
.
size
.
p
[
i
];
}
return
Mat
(
m
.
dims
-
2
,
sz
,
m
.
type
(),
(
void
*
)
m
.
ptr
<
float
>
(
n
,
cn
));
}
static
inline
MatShape
shape
(
const
int
*
dims
,
const
int
n
)
{
MatShape
shape
;
shape
.
assign
(
dims
,
dims
+
n
);
return
shape
;
}
static
inline
MatShape
shape
(
const
Mat
&
mat
)
{
return
shape
(
mat
.
size
.
p
,
mat
.
dims
);
}
static
inline
MatShape
shape
(
const
MatSize
&
sz
)
{
return
shape
(
sz
.
p
,
sz
.
dims
());
}
static
inline
MatShape
shape
(
const
UMat
&
mat
)
{
return
shape
(
mat
.
size
.
p
,
mat
.
dims
);
}
#if 0 // issues with MatExpr wrapped into InputArray
static inline
MatShape shape(InputArray input)
{
int sz[CV_MAX_DIM];
int ndims = input.sizend(sz);
return shape(sz, ndims);
}
#endif
namespace
{
inline
bool
is_neg
(
int
i
)
{
return
i
<
0
;
}}
static
inline
MatShape
shape
(
int
a0
,
int
a1
=-
1
,
int
a2
=-
1
,
int
a3
=-
1
)
{
int
dims
[]
=
{
a0
,
a1
,
a2
,
a3
};
MatShape
s
=
shape
(
dims
,
4
);
s
.
erase
(
std
::
remove_if
(
s
.
begin
(),
s
.
end
(),
is_neg
),
s
.
end
());
return
s
;
}
static
inline
int
total
(
const
MatShape
&
shape
,
int
start
=
-
1
,
int
end
=
-
1
)
{
if
(
start
==
-
1
)
start
=
0
;
if
(
end
==
-
1
)
end
=
(
int
)
shape
.
size
();
if
(
shape
.
empty
())
return
0
;
int
elems
=
1
;
CV_Assert
(
start
<=
(
int
)
shape
.
size
()
&&
end
<=
(
int
)
shape
.
size
()
&&
start
<=
end
);
for
(
int
i
=
start
;
i
<
end
;
i
++
)
{
elems
*=
shape
[
i
];
}
return
elems
;
}
static
inline
MatShape
concat
(
const
MatShape
&
a
,
const
MatShape
&
b
)
{
MatShape
c
=
a
;
c
.
insert
(
c
.
end
(),
b
.
begin
(),
b
.
end
());
return
c
;
}
static
inline
std
::
string
toString
(
const
MatShape
&
shape
,
const
String
&
name
=
""
)
{
std
::
ostringstream
ss
;
if
(
!
name
.
empty
())
ss
<<
name
<<
' '
;
ss
<<
'['
;
for
(
size_t
i
=
0
,
n
=
shape
.
size
();
i
<
n
;
++
i
)
ss
<<
' '
<<
shape
[
i
];
ss
<<
" ]"
;
return
ss
.
str
();
}
static
inline
void
print
(
const
MatShape
&
shape
,
const
String
&
name
=
""
)
{
std
::
cout
<<
toString
(
shape
,
name
)
<<
std
::
endl
;
}
static
inline
std
::
ostream
&
operator
<<
(
std
::
ostream
&
out
,
const
MatShape
&
shape
)
{
out
<<
toString
(
shape
);
return
out
;
}
/// @brief Converts axis from `[-dims; dims)` (similar to Python's slice notation) to `[0; dims)` range.
static
inline
int
normalize_axis
(
int
axis
,
int
dims
)
{
CV_Check
(
axis
,
axis
>=
-
dims
&&
axis
<
dims
,
""
);
axis
=
(
axis
<
0
)
?
(
dims
+
axis
)
:
axis
;
CV_DbgCheck
(
axis
,
axis
>=
0
&&
axis
<
dims
,
""
);
return
axis
;
}
static
inline
int
normalize_axis
(
int
axis
,
const
MatShape
&
shape
)
{
return
normalize_axis
(
axis
,
(
int
)
shape
.
size
());
}
static
inline
Range
normalize_axis_range
(
const
Range
&
r
,
int
axisSize
)
{
if
(
r
==
Range
::
all
())
return
Range
(
0
,
axisSize
);
CV_CheckGE
(
r
.
start
,
0
,
""
);
Range
clamped
(
r
.
start
,
r
.
end
>
0
?
std
::
min
(
r
.
end
,
axisSize
)
:
axisSize
+
r
.
end
+
1
);
CV_DbgCheckGE
(
clamped
.
start
,
0
,
""
);
CV_CheckLT
(
clamped
.
start
,
clamped
.
end
,
""
);
CV_CheckLE
(
clamped
.
end
,
axisSize
,
""
);
return
clamped
;
}
static
inline
bool
isAllOnes
(
const
MatShape
&
inputShape
,
int
startPos
,
int
endPos
)
{
CV_Assert
(
!
inputShape
.
empty
());
CV_CheckGE
((
int
)
inputShape
.
size
(),
startPos
,
""
);
CV_CheckGE
(
startPos
,
0
,
""
);
CV_CheckLE
(
startPos
,
endPos
,
""
);
CV_CheckLE
((
size_t
)
endPos
,
inputShape
.
size
(),
""
);
for
(
size_t
i
=
startPos
;
i
<
endPos
;
i
++
)
{
if
(
inputShape
[
i
]
!=
1
)
return
false
;
}
return
true
;
}
CV__DNN_INLINE_NS_END
}
}
#endif
...
...
lite.ai.toolkit/include/opencv2/dnn/utils/inference_engine.hpp
0 → 100644
查看文件 @
308185e
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
//
// Copyright (C) 2018-2019, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
#ifndef OPENCV_DNN_UTILS_INF_ENGINE_HPP
#define OPENCV_DNN_UTILS_INF_ENGINE_HPP
#include "../dnn.hpp"
namespace
cv
{
namespace
dnn
{
CV__DNN_INLINE_NS_BEGIN
/* Values for 'OPENCV_DNN_BACKEND_INFERENCE_ENGINE_TYPE' parameter */
#define CV_DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_API "NN_BUILDER"
#define CV_DNN_BACKEND_INFERENCE_ENGINE_NGRAPH "NGRAPH"
/** @brief Returns Inference Engine internal backend API.
*
* See values of `CV_DNN_BACKEND_INFERENCE_ENGINE_*` macros.
*
* Default value is controlled through `OPENCV_DNN_BACKEND_INFERENCE_ENGINE_TYPE` runtime parameter (environment variable).
*/
CV_EXPORTS_W
cv
::
String
getInferenceEngineBackendType
();
/** @brief Specify Inference Engine internal backend API.
*
* See values of `CV_DNN_BACKEND_INFERENCE_ENGINE_*` macros.
*
* @returns previous value of internal backend API
*/
CV_EXPORTS_W
cv
::
String
setInferenceEngineBackendType
(
const
cv
::
String
&
newBackendType
);
/** @brief Release a Myriad device (binded by OpenCV).
*
* Single Myriad device cannot be shared across multiple processes which uses
* Inference Engine's Myriad plugin.
*/
CV_EXPORTS_W
void
resetMyriadDevice
();
/* Values for 'OPENCV_DNN_IE_VPU_TYPE' parameter */
#define CV_DNN_INFERENCE_ENGINE_VPU_TYPE_UNSPECIFIED ""
/// Intel(R) Movidius(TM) Neural Compute Stick, NCS (USB 03e7:2150), Myriad2 (https://software.intel.com/en-us/movidius-ncs)
#define CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_2 "Myriad2"
/// Intel(R) Neural Compute Stick 2, NCS2 (USB 03e7:2485), MyriadX (https://software.intel.com/ru-ru/neural-compute-stick)
#define CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_X "MyriadX"
#define CV_DNN_INFERENCE_ENGINE_CPU_TYPE_ARM_COMPUTE "ARM_COMPUTE"
#define CV_DNN_INFERENCE_ENGINE_CPU_TYPE_X86 "X86"
/** @brief Returns Inference Engine VPU type.
*
* See values of `CV_DNN_INFERENCE_ENGINE_VPU_TYPE_*` macros.
*/
CV_EXPORTS_W
cv
::
String
getInferenceEngineVPUType
();
/** @brief Returns Inference Engine CPU type.
*
* Specify OpenVINO plugin: CPU or ARM.
*/
CV_EXPORTS_W
cv
::
String
getInferenceEngineCPUType
();
/** @brief Release a HDDL plugin.
*/
CV_EXPORTS_W
void
releaseHDDLPlugin
();
CV__DNN_INLINE_NS_END
}}
// namespace
#endif // OPENCV_DNN_UTILS_INF_ENGINE_HPP
...
...
lite.ai.toolkit/include/opencv2/dnn/version.hpp
0 → 100644
查看文件 @
308185e
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
#ifndef OPENCV_DNN_VERSION_HPP
#define OPENCV_DNN_VERSION_HPP
/// Use with major OpenCV version only.
#define OPENCV_DNN_API_VERSION 20210301
#if !defined CV_DOXYGEN && !defined CV_STATIC_ANALYSIS && !defined CV_DNN_DONT_ADD_INLINE_NS
#define CV__DNN_INLINE_NS __CV_CAT(dnn4_v, OPENCV_DNN_API_VERSION)
#define CV__DNN_INLINE_NS_BEGIN namespace CV__DNN_INLINE_NS {
#define CV__DNN_INLINE_NS_END }
namespace
cv
{
namespace
dnn
{
namespace
CV__DNN_INLINE_NS
{
}
using
namespace
CV__DNN_INLINE_NS
;
}}
#else
#define CV__DNN_INLINE_NS_BEGIN
#define CV__DNN_INLINE_NS_END
#endif
#endif // OPENCV_DNN_VERSION_HPP
...
...
lite.ai.toolkit/include/opencv2/features2d.hpp
0 → 100644
查看文件 @
308185e
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef OPENCV_FEATURES_2D_HPP
#define OPENCV_FEATURES_2D_HPP
#include "opencv2/opencv_modules.hpp"
#include "opencv2/core.hpp"
#ifdef HAVE_OPENCV_FLANN
#include "opencv2/flann/miniflann.hpp"
#endif
/**
@defgroup features2d 2D Features Framework
@{
@defgroup features2d_main Feature Detection and Description
@defgroup features2d_match Descriptor Matchers
Matchers of keypoint descriptors in OpenCV have wrappers with a common interface that enables you to
easily switch between different algorithms solving the same problem. This section is devoted to
matching descriptors that are represented as vectors in a multidimensional space. All objects that
implement vector descriptor matchers inherit the DescriptorMatcher interface.
@note
- An example explaining keypoint matching can be found at
opencv_source_code/samples/cpp/descriptor_extractor_matcher.cpp
- An example on descriptor matching evaluation can be found at
opencv_source_code/samples/cpp/detector_descriptor_matcher_evaluation.cpp
- An example on one to many image matching can be found at
opencv_source_code/samples/cpp/matching_to_many_images.cpp
@defgroup features2d_draw Drawing Function of Keypoints and Matches
@defgroup features2d_category Object Categorization
This section describes approaches based on local 2D features and used to categorize objects.
@note
- A complete Bag-Of-Words sample can be found at
opencv_source_code/samples/cpp/bagofwords_classification.cpp
- (Python) An example using the features2D framework to perform object categorization can be
found at opencv_source_code/samples/python/find_obj.py
@defgroup feature2d_hal Hardware Acceleration Layer
@{
@defgroup features2d_hal_interface Interface
@}
@}
*/
namespace
cv
{
//! @addtogroup features2d
//! @{
// //! writes vector of keypoints to the file storage
// CV_EXPORTS void write(FileStorage& fs, const String& name, const std::vector<KeyPoint>& keypoints);
// //! reads vector of keypoints from the specified file storage node
// CV_EXPORTS void read(const FileNode& node, CV_OUT std::vector<KeyPoint>& keypoints);
/** @brief A class filters a vector of keypoints.
Because now it is difficult to provide a convenient interface for all usage scenarios of the
keypoints filter class, it has only several needed by now static methods.
*/
class
CV_EXPORTS
KeyPointsFilter
{
public
:
KeyPointsFilter
(){}
/*
* Remove keypoints within borderPixels of an image edge.
*/
static
void
runByImageBorder
(
std
::
vector
<
KeyPoint
>&
keypoints
,
Size
imageSize
,
int
borderSize
);
/*
* Remove keypoints of sizes out of range.
*/
static
void
runByKeypointSize
(
std
::
vector
<
KeyPoint
>&
keypoints
,
float
minSize
,
float
maxSize
=
FLT_MAX
);
/*
* Remove keypoints from some image by mask for pixels of this image.
*/
static
void
runByPixelsMask
(
std
::
vector
<
KeyPoint
>&
keypoints
,
const
Mat
&
mask
);
/*
* Remove duplicated keypoints.
*/
static
void
removeDuplicated
(
std
::
vector
<
KeyPoint
>&
keypoints
);
/*
* Remove duplicated keypoints and sort the remaining keypoints
*/
static
void
removeDuplicatedSorted
(
std
::
vector
<
KeyPoint
>&
keypoints
);
/*
* Retain the specified number of the best keypoints (according to the response)
*/
static
void
retainBest
(
std
::
vector
<
KeyPoint
>&
keypoints
,
int
npoints
);
};
/************************************ Base Classes ************************************/
/** @brief Abstract base class for 2D image feature detectors and descriptor extractors
*/
#ifdef __EMSCRIPTEN__
class
CV_EXPORTS_W
Feature2D
:
public
Algorithm
#else
class
CV_EXPORTS_W
Feature2D
:
public
virtual
Algorithm
#endif
{
public
:
virtual
~
Feature2D
();
/** @brief Detects keypoints in an image (first variant) or image set (second variant).
@param image Image.
@param keypoints The detected keypoints. In the second variant of the method keypoints[i] is a set
of keypoints detected in images[i] .
@param mask Mask specifying where to look for keypoints (optional). It must be a 8-bit integer
matrix with non-zero values in the region of interest.
*/
CV_WRAP
virtual
void
detect
(
InputArray
image
,
CV_OUT
std
::
vector
<
KeyPoint
>&
keypoints
,
InputArray
mask
=
noArray
()
);
/** @overload
@param images Image set.
@param keypoints The detected keypoints. In the second variant of the method keypoints[i] is a set
of keypoints detected in images[i] .
@param masks Masks for each input image specifying where to look for keypoints (optional).
masks[i] is a mask for images[i].
*/
CV_WRAP
virtual
void
detect
(
InputArrayOfArrays
images
,
CV_OUT
std
::
vector
<
std
::
vector
<
KeyPoint
>
>&
keypoints
,
InputArrayOfArrays
masks
=
noArray
()
);
/** @brief Computes the descriptors for a set of keypoints detected in an image (first variant) or image set
(second variant).
@param image Image.
@param keypoints Input collection of keypoints. Keypoints for which a descriptor cannot be
computed are removed. Sometimes new keypoints can be added, for example: SIFT duplicates keypoint
with several dominant orientations (for each orientation).
@param descriptors Computed descriptors. In the second variant of the method descriptors[i] are
descriptors computed for a keypoints[i]. Row j is the keypoints (or keypoints[i]) is the
descriptor for keypoint j-th keypoint.
*/
CV_WRAP
virtual
void
compute
(
InputArray
image
,
CV_OUT
CV_IN_OUT
std
::
vector
<
KeyPoint
>&
keypoints
,
OutputArray
descriptors
);
/** @overload
@param images Image set.
@param keypoints Input collection of keypoints. Keypoints for which a descriptor cannot be
computed are removed. Sometimes new keypoints can be added, for example: SIFT duplicates keypoint
with several dominant orientations (for each orientation).
@param descriptors Computed descriptors. In the second variant of the method descriptors[i] are
descriptors computed for a keypoints[i]. Row j is the keypoints (or keypoints[i]) is the
descriptor for keypoint j-th keypoint.
*/
CV_WRAP
virtual
void
compute
(
InputArrayOfArrays
images
,
CV_OUT
CV_IN_OUT
std
::
vector
<
std
::
vector
<
KeyPoint
>
>&
keypoints
,
OutputArrayOfArrays
descriptors
);
/** Detects keypoints and computes the descriptors */
CV_WRAP
virtual
void
detectAndCompute
(
InputArray
image
,
InputArray
mask
,
CV_OUT
std
::
vector
<
KeyPoint
>&
keypoints
,
OutputArray
descriptors
,
bool
useProvidedKeypoints
=
false
);
CV_WRAP
virtual
int
descriptorSize
()
const
;
CV_WRAP
virtual
int
descriptorType
()
const
;
CV_WRAP
virtual
int
defaultNorm
()
const
;
CV_WRAP
void
write
(
const
String
&
fileName
)
const
;
CV_WRAP
void
read
(
const
String
&
fileName
);
virtual
void
write
(
FileStorage
&
)
const
CV_OVERRIDE
;
// see corresponding cv::Algorithm method
CV_WRAP
virtual
void
read
(
const
FileNode
&
)
CV_OVERRIDE
;
//! Return true if detector object is empty
CV_WRAP
virtual
bool
empty
()
const
CV_OVERRIDE
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
// see corresponding cv::Algorithm method
CV_WRAP
inline
void
write
(
const
Ptr
<
FileStorage
>&
fs
,
const
String
&
name
=
String
())
const
{
Algorithm
::
write
(
fs
,
name
);
}
};
/** Feature detectors in OpenCV have wrappers with a common interface that enables you to easily switch
between different algorithms solving the same problem. All objects that implement keypoint detectors
inherit the FeatureDetector interface. */
typedef
Feature2D
FeatureDetector
;
/** Extractors of keypoint descriptors in OpenCV have wrappers with a common interface that enables you
to easily switch between different algorithms solving the same problem. This section is devoted to
computing descriptors represented as vectors in a multidimensional space. All objects that implement
the vector descriptor extractors inherit the DescriptorExtractor interface.
*/
typedef
Feature2D
DescriptorExtractor
;
//! @addtogroup features2d_main
//! @{
/** @brief Class for implementing the wrapper which makes detectors and extractors to be affine invariant,
described as ASIFT in @cite YM11 .
*/
class
CV_EXPORTS_W
AffineFeature
:
public
Feature2D
{
public
:
/**
@param backend The detector/extractor you want to use as backend.
@param maxTilt The highest power index of tilt factor. 5 is used in the paper as tilt sampling range n.
@param minTilt The lowest power index of tilt factor. 0 is used in the paper.
@param tiltStep Tilt sampling step \f$\delta_t\f$ in Algorithm 1 in the paper.
@param rotateStepBase Rotation sampling step factor b in Algorithm 1 in the paper.
*/
CV_WRAP
static
Ptr
<
AffineFeature
>
create
(
const
Ptr
<
Feature2D
>&
backend
,
int
maxTilt
=
5
,
int
minTilt
=
0
,
float
tiltStep
=
1.4142135623730951
f
,
float
rotateStepBase
=
72
);
CV_WRAP
virtual
void
setViewParams
(
const
std
::
vector
<
float
>&
tilts
,
const
std
::
vector
<
float
>&
rolls
)
=
0
;
CV_WRAP
virtual
void
getViewParams
(
std
::
vector
<
float
>&
tilts
,
std
::
vector
<
float
>&
rolls
)
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
typedef
AffineFeature
AffineFeatureDetector
;
typedef
AffineFeature
AffineDescriptorExtractor
;
/** @brief Class for extracting keypoints and computing descriptors using the Scale Invariant Feature Transform
(SIFT) algorithm by D. Lowe @cite Lowe04 .
*/
class
CV_EXPORTS_W
SIFT
:
public
Feature2D
{
public
:
/**
@param nfeatures The number of best features to retain. The features are ranked by their scores
(measured in SIFT algorithm as the local contrast)
@param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The
number of octaves is computed automatically from the image resolution.
@param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform
(low-contrast) regions. The larger the threshold, the less features are produced by the detector.
@note The contrast threshold will be divided by nOctaveLayers when the filtering is applied. When
nOctaveLayers is set to default and if you want to use the value used in D. Lowe paper, 0.03, set
this argument to 0.09.
@param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning
is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are
filtered out (more features are retained).
@param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image
is captured with a weak camera with soft lenses, you might want to reduce the number.
*/
CV_WRAP
static
Ptr
<
SIFT
>
create
(
int
nfeatures
=
0
,
int
nOctaveLayers
=
3
,
double
contrastThreshold
=
0.04
,
double
edgeThreshold
=
10
,
double
sigma
=
1.6
);
/** @brief Create SIFT with specified descriptorType.
@param nfeatures The number of best features to retain. The features are ranked by their scores
(measured in SIFT algorithm as the local contrast)
@param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The
number of octaves is computed automatically from the image resolution.
@param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform
(low-contrast) regions. The larger the threshold, the less features are produced by the detector.
@note The contrast threshold will be divided by nOctaveLayers when the filtering is applied. When
nOctaveLayers is set to default and if you want to use the value used in D. Lowe paper, 0.03, set
this argument to 0.09.
@param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning
is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are
filtered out (more features are retained).
@param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image
is captured with a weak camera with soft lenses, you might want to reduce the number.
@param descriptorType The type of descriptors. Only CV_32F and CV_8U are supported.
*/
CV_WRAP
static
Ptr
<
SIFT
>
create
(
int
nfeatures
,
int
nOctaveLayers
,
double
contrastThreshold
,
double
edgeThreshold
,
double
sigma
,
int
descriptorType
);
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
typedef
SIFT
SiftFeatureDetector
;
typedef
SIFT
SiftDescriptorExtractor
;
/** @brief Class implementing the BRISK keypoint detector and descriptor extractor, described in @cite LCS11 .
*/
class
CV_EXPORTS_W
BRISK
:
public
Feature2D
{
public
:
/** @brief The BRISK constructor
@param thresh AGAST detection threshold score.
@param octaves detection octaves. Use 0 to do single scale.
@param patternScale apply this scale to the pattern used for sampling the neighbourhood of a
keypoint.
*/
CV_WRAP
static
Ptr
<
BRISK
>
create
(
int
thresh
=
30
,
int
octaves
=
3
,
float
patternScale
=
1.0
f
);
/** @brief The BRISK constructor for a custom pattern
@param radiusList defines the radii (in pixels) where the samples around a keypoint are taken (for
keypoint scale 1).
@param numberList defines the number of sampling points on the sampling circle. Must be the same
size as radiusList..
@param dMax threshold for the short pairings used for descriptor formation (in pixels for keypoint
scale 1).
@param dMin threshold for the long pairings used for orientation determination (in pixels for
keypoint scale 1).
@param indexChange index remapping of the bits. */
CV_WRAP
static
Ptr
<
BRISK
>
create
(
const
std
::
vector
<
float
>
&
radiusList
,
const
std
::
vector
<
int
>
&
numberList
,
float
dMax
=
5.85
f
,
float
dMin
=
8.2
f
,
const
std
::
vector
<
int
>&
indexChange
=
std
::
vector
<
int
>
());
/** @brief The BRISK constructor for a custom pattern, detection threshold and octaves
@param thresh AGAST detection threshold score.
@param octaves detection octaves. Use 0 to do single scale.
@param radiusList defines the radii (in pixels) where the samples around a keypoint are taken (for
keypoint scale 1).
@param numberList defines the number of sampling points on the sampling circle. Must be the same
size as radiusList..
@param dMax threshold for the short pairings used for descriptor formation (in pixels for keypoint
scale 1).
@param dMin threshold for the long pairings used for orientation determination (in pixels for
keypoint scale 1).
@param indexChange index remapping of the bits. */
CV_WRAP
static
Ptr
<
BRISK
>
create
(
int
thresh
,
int
octaves
,
const
std
::
vector
<
float
>
&
radiusList
,
const
std
::
vector
<
int
>
&
numberList
,
float
dMax
=
5.85
f
,
float
dMin
=
8.2
f
,
const
std
::
vector
<
int
>&
indexChange
=
std
::
vector
<
int
>
());
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
/** @brief Set detection threshold.
@param threshold AGAST detection threshold score.
*/
CV_WRAP
virtual
void
setThreshold
(
int
threshold
)
{
CV_UNUSED
(
threshold
);
return
;
}
CV_WRAP
virtual
int
getThreshold
()
const
{
return
-
1
;
}
/** @brief Set detection octaves.
@param octaves detection octaves. Use 0 to do single scale.
*/
CV_WRAP
virtual
void
setOctaves
(
int
octaves
)
{
CV_UNUSED
(
octaves
);
return
;
}
CV_WRAP
virtual
int
getOctaves
()
const
{
return
-
1
;
}
};
/** @brief Class implementing the ORB (*oriented BRIEF*) keypoint detector and descriptor extractor
described in @cite RRKB11 . The algorithm uses FAST in pyramids to detect stable keypoints, selects
the strongest features using FAST or Harris response, finds their orientation using first-order
moments and computes the descriptors using BRIEF (where the coordinates of random point pairs (or
k-tuples) are rotated according to the measured orientation).
*/
class
CV_EXPORTS_W
ORB
:
public
Feature2D
{
public
:
enum
ScoreType
{
HARRIS_SCORE
=
0
,
FAST_SCORE
=
1
};
static
const
int
kBytes
=
32
;
/** @brief The ORB constructor
@param nfeatures The maximum number of features to retain.
@param scaleFactor Pyramid decimation ratio, greater than 1. scaleFactor==2 means the classical
pyramid, where each next level has 4x less pixels than the previous, but such a big scale factor
will degrade feature matching scores dramatically. On the other hand, too close to 1 scale factor
will mean that to cover certain scale range you will need more pyramid levels and so the speed
will suffer.
@param nlevels The number of pyramid levels. The smallest level will have linear size equal to
input_image_linear_size/pow(scaleFactor, nlevels - firstLevel).
@param edgeThreshold This is size of the border where the features are not detected. It should
roughly match the patchSize parameter.
@param firstLevel The level of pyramid to put source image to. Previous layers are filled
with upscaled source image.
@param WTA_K The number of points that produce each element of the oriented BRIEF descriptor. The
default value 2 means the BRIEF where we take a random point pair and compare their brightnesses,
so we get 0/1 response. Other possible values are 3 and 4. For example, 3 means that we take 3
random points (of course, those point coordinates are random, but they are generated from the
pre-defined seed, so each element of BRIEF descriptor is computed deterministically from the pixel
rectangle), find point of maximum brightness and output index of the winner (0, 1 or 2). Such
output will occupy 2 bits, and therefore it will need a special variant of Hamming distance,
denoted as NORM_HAMMING2 (2 bits per bin). When WTA_K=4, we take 4 random points to compute each
bin (that will also occupy 2 bits with possible values 0, 1, 2 or 3).
@param scoreType The default HARRIS_SCORE means that Harris algorithm is used to rank features
(the score is written to KeyPoint::score and is used to retain best nfeatures features);
FAST_SCORE is alternative value of the parameter that produces slightly less stable keypoints,
but it is a little faster to compute.
@param patchSize size of the patch used by the oriented BRIEF descriptor. Of course, on smaller
pyramid layers the perceived image area covered by a feature will be larger.
@param fastThreshold the fast threshold
*/
CV_WRAP
static
Ptr
<
ORB
>
create
(
int
nfeatures
=
500
,
float
scaleFactor
=
1.2
f
,
int
nlevels
=
8
,
int
edgeThreshold
=
31
,
int
firstLevel
=
0
,
int
WTA_K
=
2
,
ORB
::
ScoreType
scoreType
=
ORB
::
HARRIS_SCORE
,
int
patchSize
=
31
,
int
fastThreshold
=
20
);
CV_WRAP
virtual
void
setMaxFeatures
(
int
maxFeatures
)
=
0
;
CV_WRAP
virtual
int
getMaxFeatures
()
const
=
0
;
CV_WRAP
virtual
void
setScaleFactor
(
double
scaleFactor
)
=
0
;
CV_WRAP
virtual
double
getScaleFactor
()
const
=
0
;
CV_WRAP
virtual
void
setNLevels
(
int
nlevels
)
=
0
;
CV_WRAP
virtual
int
getNLevels
()
const
=
0
;
CV_WRAP
virtual
void
setEdgeThreshold
(
int
edgeThreshold
)
=
0
;
CV_WRAP
virtual
int
getEdgeThreshold
()
const
=
0
;
CV_WRAP
virtual
void
setFirstLevel
(
int
firstLevel
)
=
0
;
CV_WRAP
virtual
int
getFirstLevel
()
const
=
0
;
CV_WRAP
virtual
void
setWTA_K
(
int
wta_k
)
=
0
;
CV_WRAP
virtual
int
getWTA_K
()
const
=
0
;
CV_WRAP
virtual
void
setScoreType
(
ORB
::
ScoreType
scoreType
)
=
0
;
CV_WRAP
virtual
ORB
::
ScoreType
getScoreType
()
const
=
0
;
CV_WRAP
virtual
void
setPatchSize
(
int
patchSize
)
=
0
;
CV_WRAP
virtual
int
getPatchSize
()
const
=
0
;
CV_WRAP
virtual
void
setFastThreshold
(
int
fastThreshold
)
=
0
;
CV_WRAP
virtual
int
getFastThreshold
()
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
/** @brief Maximally stable extremal region extractor
The class encapsulates all the parameters of the %MSER extraction algorithm (see [wiki
article](http://en.wikipedia.org/wiki/Maximally_stable_extremal_regions)).
- there are two different implementation of %MSER: one for grey image, one for color image
- the grey image algorithm is taken from: @cite nister2008linear ; the paper claims to be faster
than union-find method; it actually get 1.5~2m/s on my centrino L7200 1.2GHz laptop.
- the color image algorithm is taken from: @cite forssen2007maximally ; it should be much slower
than grey image method ( 3~4 times )
- (Python) A complete example showing the use of the %MSER detector can be found at samples/python/mser.py
*/
class
CV_EXPORTS_W
MSER
:
public
Feature2D
{
public
:
/** @brief Full constructor for %MSER detector
@param _delta it compares \f$(size_{i}-size_{i-delta})/size_{i-delta}\f$
@param _min_area prune the area which smaller than minArea
@param _max_area prune the area which bigger than maxArea
@param _max_variation prune the area have similar size to its children
@param _min_diversity for color image, trace back to cut off mser with diversity less than min_diversity
@param _max_evolution for color image, the evolution steps
@param _area_threshold for color image, the area threshold to cause re-initialize
@param _min_margin for color image, ignore too small margin
@param _edge_blur_size for color image, the aperture size for edge blur
*/
CV_WRAP
static
Ptr
<
MSER
>
create
(
int
_delta
=
5
,
int
_min_area
=
60
,
int
_max_area
=
14400
,
double
_max_variation
=
0.25
,
double
_min_diversity
=
.2
,
int
_max_evolution
=
200
,
double
_area_threshold
=
1.01
,
double
_min_margin
=
0.003
,
int
_edge_blur_size
=
5
);
/** @brief Detect %MSER regions
@param image input image (8UC1, 8UC3 or 8UC4, must be greater or equal than 3x3)
@param msers resulting list of point sets
@param bboxes resulting bounding boxes
*/
CV_WRAP
virtual
void
detectRegions
(
InputArray
image
,
CV_OUT
std
::
vector
<
std
::
vector
<
Point
>
>&
msers
,
CV_OUT
std
::
vector
<
Rect
>&
bboxes
)
=
0
;
CV_WRAP
virtual
void
setDelta
(
int
delta
)
=
0
;
CV_WRAP
virtual
int
getDelta
()
const
=
0
;
CV_WRAP
virtual
void
setMinArea
(
int
minArea
)
=
0
;
CV_WRAP
virtual
int
getMinArea
()
const
=
0
;
CV_WRAP
virtual
void
setMaxArea
(
int
maxArea
)
=
0
;
CV_WRAP
virtual
int
getMaxArea
()
const
=
0
;
CV_WRAP
virtual
void
setPass2Only
(
bool
f
)
=
0
;
CV_WRAP
virtual
bool
getPass2Only
()
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
//! @} features2d_main
//! @addtogroup features2d_main
//! @{
/** @brief Wrapping class for feature detection using the FAST method. :
*/
class
CV_EXPORTS_W
FastFeatureDetector
:
public
Feature2D
{
public
:
enum
DetectorType
{
TYPE_5_8
=
0
,
TYPE_7_12
=
1
,
TYPE_9_16
=
2
};
enum
{
THRESHOLD
=
10000
,
NONMAX_SUPPRESSION
=
10001
,
FAST_N
=
10002
};
CV_WRAP
static
Ptr
<
FastFeatureDetector
>
create
(
int
threshold
=
10
,
bool
nonmaxSuppression
=
true
,
FastFeatureDetector
::
DetectorType
type
=
FastFeatureDetector
::
TYPE_9_16
);
CV_WRAP
virtual
void
setThreshold
(
int
threshold
)
=
0
;
CV_WRAP
virtual
int
getThreshold
()
const
=
0
;
CV_WRAP
virtual
void
setNonmaxSuppression
(
bool
f
)
=
0
;
CV_WRAP
virtual
bool
getNonmaxSuppression
()
const
=
0
;
CV_WRAP
virtual
void
setType
(
FastFeatureDetector
::
DetectorType
type
)
=
0
;
CV_WRAP
virtual
FastFeatureDetector
::
DetectorType
getType
()
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
/** @overload */
CV_EXPORTS
void
FAST
(
InputArray
image
,
CV_OUT
std
::
vector
<
KeyPoint
>&
keypoints
,
int
threshold
,
bool
nonmaxSuppression
=
true
);
/** @brief Detects corners using the FAST algorithm
@param image grayscale image where keypoints (corners) are detected.
@param keypoints keypoints detected on the image.
@param threshold threshold on difference between intensity of the central pixel and pixels of a
circle around this pixel.
@param nonmaxSuppression if true, non-maximum suppression is applied to detected corners
(keypoints).
@param type one of the three neighborhoods as defined in the paper:
FastFeatureDetector::TYPE_9_16, FastFeatureDetector::TYPE_7_12,
FastFeatureDetector::TYPE_5_8
Detects corners using the FAST algorithm by @cite Rosten06 .
@note In Python API, types are given as cv.FAST_FEATURE_DETECTOR_TYPE_5_8,
cv.FAST_FEATURE_DETECTOR_TYPE_7_12 and cv.FAST_FEATURE_DETECTOR_TYPE_9_16. For corner
detection, use cv.FAST.detect() method.
*/
CV_EXPORTS
void
FAST
(
InputArray
image
,
CV_OUT
std
::
vector
<
KeyPoint
>&
keypoints
,
int
threshold
,
bool
nonmaxSuppression
,
FastFeatureDetector
::
DetectorType
type
);
//! @} features2d_main
//! @addtogroup features2d_main
//! @{
/** @brief Wrapping class for feature detection using the AGAST method. :
*/
class
CV_EXPORTS_W
AgastFeatureDetector
:
public
Feature2D
{
public
:
enum
DetectorType
{
AGAST_5_8
=
0
,
AGAST_7_12d
=
1
,
AGAST_7_12s
=
2
,
OAST_9_16
=
3
,
};
enum
{
THRESHOLD
=
10000
,
NONMAX_SUPPRESSION
=
10001
,
};
CV_WRAP
static
Ptr
<
AgastFeatureDetector
>
create
(
int
threshold
=
10
,
bool
nonmaxSuppression
=
true
,
AgastFeatureDetector
::
DetectorType
type
=
AgastFeatureDetector
::
OAST_9_16
);
CV_WRAP
virtual
void
setThreshold
(
int
threshold
)
=
0
;
CV_WRAP
virtual
int
getThreshold
()
const
=
0
;
CV_WRAP
virtual
void
setNonmaxSuppression
(
bool
f
)
=
0
;
CV_WRAP
virtual
bool
getNonmaxSuppression
()
const
=
0
;
CV_WRAP
virtual
void
setType
(
AgastFeatureDetector
::
DetectorType
type
)
=
0
;
CV_WRAP
virtual
AgastFeatureDetector
::
DetectorType
getType
()
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
/** @overload */
CV_EXPORTS
void
AGAST
(
InputArray
image
,
CV_OUT
std
::
vector
<
KeyPoint
>&
keypoints
,
int
threshold
,
bool
nonmaxSuppression
=
true
);
/** @brief Detects corners using the AGAST algorithm
@param image grayscale image where keypoints (corners) are detected.
@param keypoints keypoints detected on the image.
@param threshold threshold on difference between intensity of the central pixel and pixels of a
circle around this pixel.
@param nonmaxSuppression if true, non-maximum suppression is applied to detected corners
(keypoints).
@param type one of the four neighborhoods as defined in the paper:
AgastFeatureDetector::AGAST_5_8, AgastFeatureDetector::AGAST_7_12d,
AgastFeatureDetector::AGAST_7_12s, AgastFeatureDetector::OAST_9_16
For non-Intel platforms, there is a tree optimised variant of AGAST with same numerical results.
The 32-bit binary tree tables were generated automatically from original code using perl script.
The perl script and examples of tree generation are placed in features2d/doc folder.
Detects corners using the AGAST algorithm by @cite mair2010_agast .
*/
CV_EXPORTS
void
AGAST
(
InputArray
image
,
CV_OUT
std
::
vector
<
KeyPoint
>&
keypoints
,
int
threshold
,
bool
nonmaxSuppression
,
AgastFeatureDetector
::
DetectorType
type
);
/** @brief Wrapping class for feature detection using the goodFeaturesToTrack function. :
*/
class
CV_EXPORTS_W
GFTTDetector
:
public
Feature2D
{
public
:
CV_WRAP
static
Ptr
<
GFTTDetector
>
create
(
int
maxCorners
=
1000
,
double
qualityLevel
=
0.01
,
double
minDistance
=
1
,
int
blockSize
=
3
,
bool
useHarrisDetector
=
false
,
double
k
=
0.04
);
CV_WRAP
static
Ptr
<
GFTTDetector
>
create
(
int
maxCorners
,
double
qualityLevel
,
double
minDistance
,
int
blockSize
,
int
gradiantSize
,
bool
useHarrisDetector
=
false
,
double
k
=
0.04
);
CV_WRAP
virtual
void
setMaxFeatures
(
int
maxFeatures
)
=
0
;
CV_WRAP
virtual
int
getMaxFeatures
()
const
=
0
;
CV_WRAP
virtual
void
setQualityLevel
(
double
qlevel
)
=
0
;
CV_WRAP
virtual
double
getQualityLevel
()
const
=
0
;
CV_WRAP
virtual
void
setMinDistance
(
double
minDistance
)
=
0
;
CV_WRAP
virtual
double
getMinDistance
()
const
=
0
;
CV_WRAP
virtual
void
setBlockSize
(
int
blockSize
)
=
0
;
CV_WRAP
virtual
int
getBlockSize
()
const
=
0
;
CV_WRAP
virtual
void
setHarrisDetector
(
bool
val
)
=
0
;
CV_WRAP
virtual
bool
getHarrisDetector
()
const
=
0
;
CV_WRAP
virtual
void
setK
(
double
k
)
=
0
;
CV_WRAP
virtual
double
getK
()
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
/** @brief Class for extracting blobs from an image. :
The class implements a simple algorithm for extracting blobs from an image:
1. Convert the source image to binary images by applying thresholding with several thresholds from
minThreshold (inclusive) to maxThreshold (exclusive) with distance thresholdStep between
neighboring thresholds.
2. Extract connected components from every binary image by findContours and calculate their
centers.
3. Group centers from several binary images by their coordinates. Close centers form one group that
corresponds to one blob, which is controlled by the minDistBetweenBlobs parameter.
4. From the groups, estimate final centers of blobs and their radiuses and return as locations and
sizes of keypoints.
This class performs several filtrations of returned blobs. You should set filterBy\* to true/false
to turn on/off corresponding filtration. Available filtrations:
- **By color**. This filter compares the intensity of a binary image at the center of a blob to
blobColor. If they differ, the blob is filtered out. Use blobColor = 0 to extract dark blobs
and blobColor = 255 to extract light blobs.
- **By area**. Extracted blobs have an area between minArea (inclusive) and maxArea (exclusive).
- **By circularity**. Extracted blobs have circularity
(\f$\frac{4*\pi*Area}{perimeter * perimeter}\f$) between minCircularity (inclusive) and
maxCircularity (exclusive).
- **By ratio of the minimum inertia to maximum inertia**. Extracted blobs have this ratio
between minInertiaRatio (inclusive) and maxInertiaRatio (exclusive).
- **By convexity**. Extracted blobs have convexity (area / area of blob convex hull) between
minConvexity (inclusive) and maxConvexity (exclusive).
Default values of parameters are tuned to extract dark circular blobs.
*/
class
CV_EXPORTS_W
SimpleBlobDetector
:
public
Feature2D
{
public
:
struct
CV_EXPORTS_W_SIMPLE
Params
{
CV_WRAP
Params
();
CV_PROP_RW
float
thresholdStep
;
CV_PROP_RW
float
minThreshold
;
CV_PROP_RW
float
maxThreshold
;
CV_PROP_RW
size_t
minRepeatability
;
CV_PROP_RW
float
minDistBetweenBlobs
;
CV_PROP_RW
bool
filterByColor
;
CV_PROP_RW
uchar
blobColor
;
CV_PROP_RW
bool
filterByArea
;
CV_PROP_RW
float
minArea
,
maxArea
;
CV_PROP_RW
bool
filterByCircularity
;
CV_PROP_RW
float
minCircularity
,
maxCircularity
;
CV_PROP_RW
bool
filterByInertia
;
CV_PROP_RW
float
minInertiaRatio
,
maxInertiaRatio
;
CV_PROP_RW
bool
filterByConvexity
;
CV_PROP_RW
float
minConvexity
,
maxConvexity
;
void
read
(
const
FileNode
&
fn
);
void
write
(
FileStorage
&
fs
)
const
;
};
CV_WRAP
static
Ptr
<
SimpleBlobDetector
>
create
(
const
SimpleBlobDetector
::
Params
&
parameters
=
SimpleBlobDetector
::
Params
());
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
//! @} features2d_main
//! @addtogroup features2d_main
//! @{
/** @brief Class implementing the KAZE keypoint detector and descriptor extractor, described in @cite ABD12 .
@note AKAZE descriptor can only be used with KAZE or AKAZE keypoints .. [ABD12] KAZE Features. Pablo
F. Alcantarilla, Adrien Bartoli and Andrew J. Davison. In European Conference on Computer Vision
(ECCV), Fiorenze, Italy, October 2012.
*/
class
CV_EXPORTS_W
KAZE
:
public
Feature2D
{
public
:
enum
DiffusivityType
{
DIFF_PM_G1
=
0
,
DIFF_PM_G2
=
1
,
DIFF_WEICKERT
=
2
,
DIFF_CHARBONNIER
=
3
};
/** @brief The KAZE constructor
@param extended Set to enable extraction of extended (128-byte) descriptor.
@param upright Set to enable use of upright descriptors (non rotation-invariant).
@param threshold Detector response threshold to accept point
@param nOctaves Maximum octave evolution of the image
@param nOctaveLayers Default number of sublevels per scale level
@param diffusivity Diffusivity type. DIFF_PM_G1, DIFF_PM_G2, DIFF_WEICKERT or
DIFF_CHARBONNIER
*/
CV_WRAP
static
Ptr
<
KAZE
>
create
(
bool
extended
=
false
,
bool
upright
=
false
,
float
threshold
=
0.001
f
,
int
nOctaves
=
4
,
int
nOctaveLayers
=
4
,
KAZE
::
DiffusivityType
diffusivity
=
KAZE
::
DIFF_PM_G2
);
CV_WRAP
virtual
void
setExtended
(
bool
extended
)
=
0
;
CV_WRAP
virtual
bool
getExtended
()
const
=
0
;
CV_WRAP
virtual
void
setUpright
(
bool
upright
)
=
0
;
CV_WRAP
virtual
bool
getUpright
()
const
=
0
;
CV_WRAP
virtual
void
setThreshold
(
double
threshold
)
=
0
;
CV_WRAP
virtual
double
getThreshold
()
const
=
0
;
CV_WRAP
virtual
void
setNOctaves
(
int
octaves
)
=
0
;
CV_WRAP
virtual
int
getNOctaves
()
const
=
0
;
CV_WRAP
virtual
void
setNOctaveLayers
(
int
octaveLayers
)
=
0
;
CV_WRAP
virtual
int
getNOctaveLayers
()
const
=
0
;
CV_WRAP
virtual
void
setDiffusivity
(
KAZE
::
DiffusivityType
diff
)
=
0
;
CV_WRAP
virtual
KAZE
::
DiffusivityType
getDiffusivity
()
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
/** @brief Class implementing the AKAZE keypoint detector and descriptor extractor, described in @cite ANB13.
@details AKAZE descriptors can only be used with KAZE or AKAZE keypoints. This class is thread-safe.
@note When you need descriptors use Feature2D::detectAndCompute, which
provides better performance. When using Feature2D::detect followed by
Feature2D::compute scale space pyramid is computed twice.
@note AKAZE implements T-API. When image is passed as UMat some parts of the algorithm
will use OpenCL.
@note [ANB13] Fast Explicit Diffusion for Accelerated Features in Nonlinear
Scale Spaces. Pablo F. Alcantarilla, Jesús Nuevo and Adrien Bartoli. In
British Machine Vision Conference (BMVC), Bristol, UK, September 2013.
*/
class
CV_EXPORTS_W
AKAZE
:
public
Feature2D
{
public
:
// AKAZE descriptor type
enum
DescriptorType
{
DESCRIPTOR_KAZE_UPRIGHT
=
2
,
///< Upright descriptors, not invariant to rotation
DESCRIPTOR_KAZE
=
3
,
DESCRIPTOR_MLDB_UPRIGHT
=
4
,
///< Upright descriptors, not invariant to rotation
DESCRIPTOR_MLDB
=
5
};
/** @brief The AKAZE constructor
@param descriptor_type Type of the extracted descriptor: DESCRIPTOR_KAZE,
DESCRIPTOR_KAZE_UPRIGHT, DESCRIPTOR_MLDB or DESCRIPTOR_MLDB_UPRIGHT.
@param descriptor_size Size of the descriptor in bits. 0 -\> Full size
@param descriptor_channels Number of channels in the descriptor (1, 2, 3)
@param threshold Detector response threshold to accept point
@param nOctaves Maximum octave evolution of the image
@param nOctaveLayers Default number of sublevels per scale level
@param diffusivity Diffusivity type. DIFF_PM_G1, DIFF_PM_G2, DIFF_WEICKERT or
DIFF_CHARBONNIER
*/
CV_WRAP
static
Ptr
<
AKAZE
>
create
(
AKAZE
::
DescriptorType
descriptor_type
=
AKAZE
::
DESCRIPTOR_MLDB
,
int
descriptor_size
=
0
,
int
descriptor_channels
=
3
,
float
threshold
=
0.001
f
,
int
nOctaves
=
4
,
int
nOctaveLayers
=
4
,
KAZE
::
DiffusivityType
diffusivity
=
KAZE
::
DIFF_PM_G2
);
CV_WRAP
virtual
void
setDescriptorType
(
AKAZE
::
DescriptorType
dtype
)
=
0
;
CV_WRAP
virtual
AKAZE
::
DescriptorType
getDescriptorType
()
const
=
0
;
CV_WRAP
virtual
void
setDescriptorSize
(
int
dsize
)
=
0
;
CV_WRAP
virtual
int
getDescriptorSize
()
const
=
0
;
CV_WRAP
virtual
void
setDescriptorChannels
(
int
dch
)
=
0
;
CV_WRAP
virtual
int
getDescriptorChannels
()
const
=
0
;
CV_WRAP
virtual
void
setThreshold
(
double
threshold
)
=
0
;
CV_WRAP
virtual
double
getThreshold
()
const
=
0
;
CV_WRAP
virtual
void
setNOctaves
(
int
octaves
)
=
0
;
CV_WRAP
virtual
int
getNOctaves
()
const
=
0
;
CV_WRAP
virtual
void
setNOctaveLayers
(
int
octaveLayers
)
=
0
;
CV_WRAP
virtual
int
getNOctaveLayers
()
const
=
0
;
CV_WRAP
virtual
void
setDiffusivity
(
KAZE
::
DiffusivityType
diff
)
=
0
;
CV_WRAP
virtual
KAZE
::
DiffusivityType
getDiffusivity
()
const
=
0
;
CV_WRAP
virtual
String
getDefaultName
()
const
CV_OVERRIDE
;
};
//! @} features2d_main
/****************************************************************************************\
* Distance *
\****************************************************************************************/
template
<
typename
T
>
struct
CV_EXPORTS
Accumulator
{
typedef
T
Type
;
};
template
<>
struct
Accumulator
<
unsigned
char
>
{
typedef
float
Type
;
};
template
<>
struct
Accumulator
<
unsigned
short
>
{
typedef
float
Type
;
};
template
<>
struct
Accumulator
<
char
>
{
typedef
float
Type
;
};
template
<>
struct
Accumulator
<
short
>
{
typedef
float
Type
;
};
/*
* Squared Euclidean distance functor
*/
template
<
class
T
>
struct
CV_EXPORTS
SL2
{
static
const
NormTypes
normType
=
NORM_L2SQR
;
typedef
T
ValueType
;
typedef
typename
Accumulator
<
T
>::
Type
ResultType
;
ResultType
operator
()(
const
T
*
a
,
const
T
*
b
,
int
size
)
const
{
return
normL2Sqr
<
ValueType
,
ResultType
>
(
a
,
b
,
size
);
}
};
/*
* Euclidean distance functor
*/
template
<
class
T
>
struct
L2
{
static
const
NormTypes
normType
=
NORM_L2
;
typedef
T
ValueType
;
typedef
typename
Accumulator
<
T
>::
Type
ResultType
;
ResultType
operator
()(
const
T
*
a
,
const
T
*
b
,
int
size
)
const
{
return
(
ResultType
)
std
::
sqrt
((
double
)
normL2Sqr
<
ValueType
,
ResultType
>
(
a
,
b
,
size
));
}
};
/*
* Manhattan distance (city block distance) functor
*/
template
<
class
T
>
struct
L1
{
static
const
NormTypes
normType
=
NORM_L1
;
typedef
T
ValueType
;
typedef
typename
Accumulator
<
T
>::
Type
ResultType
;
ResultType
operator
()(
const
T
*
a
,
const
T
*
b
,
int
size
)
const
{
return
normL1
<
ValueType
,
ResultType
>
(
a
,
b
,
size
);
}
};
/****************************************************************************************\
* DescriptorMatcher *
\****************************************************************************************/
//! @addtogroup features2d_match
//! @{
/** @brief Abstract base class for matching keypoint descriptors.
It has two groups of match methods: for matching descriptors of an image with another image or with
an image set.
*/
class
CV_EXPORTS_W
DescriptorMatcher
:
public
Algorithm
{
public
:
enum
MatcherType
{
FLANNBASED
=
1
,
BRUTEFORCE
=
2
,
BRUTEFORCE_L1
=
3
,
BRUTEFORCE_HAMMING
=
4
,
BRUTEFORCE_HAMMINGLUT
=
5
,
BRUTEFORCE_SL2
=
6
};
virtual
~
DescriptorMatcher
();
/** @brief Adds descriptors to train a CPU(trainDescCollectionis) or GPU(utrainDescCollectionis) descriptor
collection.
If the collection is not empty, the new descriptors are added to existing train descriptors.
@param descriptors Descriptors to add. Each descriptors[i] is a set of descriptors from the same
train image.
*/
CV_WRAP
virtual
void
add
(
InputArrayOfArrays
descriptors
);
/** @brief Returns a constant link to the train descriptor collection trainDescCollection .
*/
CV_WRAP
const
std
::
vector
<
Mat
>&
getTrainDescriptors
()
const
;
/** @brief Clears the train descriptor collections.
*/
CV_WRAP
virtual
void
clear
()
CV_OVERRIDE
;
/** @brief Returns true if there are no train descriptors in the both collections.
*/
CV_WRAP
virtual
bool
empty
()
const
CV_OVERRIDE
;
/** @brief Returns true if the descriptor matcher supports masking permissible matches.
*/
CV_WRAP
virtual
bool
isMaskSupported
()
const
=
0
;
/** @brief Trains a descriptor matcher
Trains a descriptor matcher (for example, the flann index). In all methods to match, the method
train() is run every time before matching. Some descriptor matchers (for example, BruteForceMatcher)
have an empty implementation of this method. Other matchers really train their inner structures (for
example, FlannBasedMatcher trains flann::Index ).
*/
CV_WRAP
virtual
void
train
();
/** @brief Finds the best match for each descriptor from a query set.
@param queryDescriptors Query set of descriptors.
@param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
collection stored in the class object.
@param matches Matches. If a query descriptor is masked out in mask , no match is added for this
descriptor. So, matches size may be smaller than the query descriptors count.
@param mask Mask specifying permissible matches between an input query and train matrices of
descriptors.
In the first variant of this method, the train descriptors are passed as an input argument. In the
second variant of the method, train descriptors collection that was set by DescriptorMatcher::add is
used. Optional mask (or masks) can be passed to specify which query and training descriptors can be
matched. Namely, queryDescriptors[i] can be matched with trainDescriptors[j] only if
mask.at\<uchar\>(i,j) is non-zero.
*/
CV_WRAP
void
match
(
InputArray
queryDescriptors
,
InputArray
trainDescriptors
,
CV_OUT
std
::
vector
<
DMatch
>&
matches
,
InputArray
mask
=
noArray
()
)
const
;
/** @brief Finds the k best matches for each descriptor from a query set.
@param queryDescriptors Query set of descriptors.
@param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
collection stored in the class object.
@param mask Mask specifying permissible matches between an input query and train matrices of
descriptors.
@param matches Matches. Each matches[i] is k or less matches for the same query descriptor.
@param k Count of best matches found per each query descriptor or less if a query descriptor has
less than k possible matches in total.
@param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
the matches vector does not contain matches for fully masked-out query descriptors.
These extended variants of DescriptorMatcher::match methods find several best matches for each query
descriptor. The matches are returned in the distance increasing order. See DescriptorMatcher::match
for the details about query and train descriptors.
*/
CV_WRAP
void
knnMatch
(
InputArray
queryDescriptors
,
InputArray
trainDescriptors
,
CV_OUT
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
int
k
,
InputArray
mask
=
noArray
(),
bool
compactResult
=
false
)
const
;
/** @brief For each query descriptor, finds the training descriptors not farther than the specified distance.
@param queryDescriptors Query set of descriptors.
@param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
collection stored in the class object.
@param matches Found matches.
@param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
the matches vector does not contain matches for fully masked-out query descriptors.
@param maxDistance Threshold for the distance between matched descriptors. Distance means here
metric distance (e.g. Hamming distance), not the distance between coordinates (which is measured
in Pixels)!
@param mask Mask specifying permissible matches between an input query and train matrices of
descriptors.
For each query descriptor, the methods find such training descriptors that the distance between the
query descriptor and the training descriptor is equal or smaller than maxDistance. Found matches are
returned in the distance increasing order.
*/
CV_WRAP
void
radiusMatch
(
InputArray
queryDescriptors
,
InputArray
trainDescriptors
,
CV_OUT
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
float
maxDistance
,
InputArray
mask
=
noArray
(),
bool
compactResult
=
false
)
const
;
/** @overload
@param queryDescriptors Query set of descriptors.
@param matches Matches. If a query descriptor is masked out in mask , no match is added for this
descriptor. So, matches size may be smaller than the query descriptors count.
@param masks Set of masks. Each masks[i] specifies permissible matches between the input query
descriptors and stored train descriptors from the i-th image trainDescCollection[i].
*/
CV_WRAP
void
match
(
InputArray
queryDescriptors
,
CV_OUT
std
::
vector
<
DMatch
>&
matches
,
InputArrayOfArrays
masks
=
noArray
()
);
/** @overload
@param queryDescriptors Query set of descriptors.
@param matches Matches. Each matches[i] is k or less matches for the same query descriptor.
@param k Count of best matches found per each query descriptor or less if a query descriptor has
less than k possible matches in total.
@param masks Set of masks. Each masks[i] specifies permissible matches between the input query
descriptors and stored train descriptors from the i-th image trainDescCollection[i].
@param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
the matches vector does not contain matches for fully masked-out query descriptors.
*/
CV_WRAP
void
knnMatch
(
InputArray
queryDescriptors
,
CV_OUT
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
int
k
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
);
/** @overload
@param queryDescriptors Query set of descriptors.
@param matches Found matches.
@param maxDistance Threshold for the distance between matched descriptors. Distance means here
metric distance (e.g. Hamming distance), not the distance between coordinates (which is measured
in Pixels)!
@param masks Set of masks. Each masks[i] specifies permissible matches between the input query
descriptors and stored train descriptors from the i-th image trainDescCollection[i].
@param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
the matches vector does not contain matches for fully masked-out query descriptors.
*/
CV_WRAP
void
radiusMatch
(
InputArray
queryDescriptors
,
CV_OUT
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
float
maxDistance
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
);
CV_WRAP
void
write
(
const
String
&
fileName
)
const
{
FileStorage
fs
(
fileName
,
FileStorage
::
WRITE
);
write
(
fs
);
}
CV_WRAP
void
read
(
const
String
&
fileName
)
{
FileStorage
fs
(
fileName
,
FileStorage
::
READ
);
read
(
fs
.
root
());
}
// Reads matcher object from a file node
// see corresponding cv::Algorithm method
CV_WRAP
virtual
void
read
(
const
FileNode
&
)
CV_OVERRIDE
;
// Writes matcher object to a file storage
virtual
void
write
(
FileStorage
&
)
const
CV_OVERRIDE
;
/** @brief Clones the matcher.
@param emptyTrainData If emptyTrainData is false, the method creates a deep copy of the object,
that is, copies both parameters and train data. If emptyTrainData is true, the method creates an
object copy with the current parameters but with empty train data.
*/
CV_WRAP
virtual
Ptr
<
DescriptorMatcher
>
clone
(
bool
emptyTrainData
=
false
)
const
=
0
;
/** @brief Creates a descriptor matcher of a given type with the default parameters (using default
constructor).
@param descriptorMatcherType Descriptor matcher type. Now the following matcher types are
supported:
- `BruteForce` (it uses L2 )
- `BruteForce-L1`
- `BruteForce-Hamming`
- `BruteForce-Hamming(2)`
- `FlannBased`
*/
CV_WRAP
static
Ptr
<
DescriptorMatcher
>
create
(
const
String
&
descriptorMatcherType
);
CV_WRAP
static
Ptr
<
DescriptorMatcher
>
create
(
const
DescriptorMatcher
::
MatcherType
&
matcherType
);
// see corresponding cv::Algorithm method
CV_WRAP
inline
void
write
(
const
Ptr
<
FileStorage
>&
fs
,
const
String
&
name
=
String
())
const
{
Algorithm
::
write
(
fs
,
name
);
}
protected
:
/**
* Class to work with descriptors from several images as with one merged matrix.
* It is used e.g. in FlannBasedMatcher.
*/
class
CV_EXPORTS
DescriptorCollection
{
public
:
DescriptorCollection
();
DescriptorCollection
(
const
DescriptorCollection
&
collection
);
virtual
~
DescriptorCollection
();
// Vector of matrices "descriptors" will be merged to one matrix "mergedDescriptors" here.
void
set
(
const
std
::
vector
<
Mat
>&
descriptors
);
virtual
void
clear
();
const
Mat
&
getDescriptors
()
const
;
const
Mat
getDescriptor
(
int
imgIdx
,
int
localDescIdx
)
const
;
const
Mat
getDescriptor
(
int
globalDescIdx
)
const
;
void
getLocalIdx
(
int
globalDescIdx
,
int
&
imgIdx
,
int
&
localDescIdx
)
const
;
int
size
()
const
;
protected
:
Mat
mergedDescriptors
;
std
::
vector
<
int
>
startIdxs
;
};
//! In fact the matching is implemented only by the following two methods. These methods suppose
//! that the class object has been trained already. Public match methods call these methods
//! after calling train().
virtual
void
knnMatchImpl
(
InputArray
queryDescriptors
,
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
int
k
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
)
=
0
;
virtual
void
radiusMatchImpl
(
InputArray
queryDescriptors
,
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
float
maxDistance
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
)
=
0
;
static
bool
isPossibleMatch
(
InputArray
mask
,
int
queryIdx
,
int
trainIdx
);
static
bool
isMaskedOut
(
InputArrayOfArrays
masks
,
int
queryIdx
);
static
Mat
clone_op
(
Mat
m
)
{
return
m
.
clone
();
}
void
checkMasks
(
InputArrayOfArrays
masks
,
int
queryDescriptorsCount
)
const
;
//! Collection of descriptors from train images.
std
::
vector
<
Mat
>
trainDescCollection
;
std
::
vector
<
UMat
>
utrainDescCollection
;
};
/** @brief Brute-force descriptor matcher.
For each descriptor in the first set, this matcher finds the closest descriptor in the second set
by trying each one. This descriptor matcher supports masking permissible matches of descriptor
sets.
*/
class
CV_EXPORTS_W
BFMatcher
:
public
DescriptorMatcher
{
public
:
/** @brief Brute-force matcher constructor (obsolete). Please use BFMatcher.create()
*
*
*/
CV_WRAP
BFMatcher
(
int
normType
=
NORM_L2
,
bool
crossCheck
=
false
);
virtual
~
BFMatcher
()
{}
virtual
bool
isMaskSupported
()
const
CV_OVERRIDE
{
return
true
;
}
/** @brief Brute-force matcher create method.
@param normType One of NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2. L1 and L2 norms are
preferable choices for SIFT and SURF descriptors, NORM_HAMMING should be used with ORB, BRISK and
BRIEF, NORM_HAMMING2 should be used with ORB when WTA_K==3 or 4 (see ORB::ORB constructor
description).
@param crossCheck If it is false, this is will be default BFMatcher behaviour when it finds the k
nearest neighbors for each query descriptor. If crossCheck==true, then the knnMatch() method with
k=1 will only return pairs (i,j) such that for i-th query descriptor the j-th descriptor in the
matcher's collection is the nearest and vice versa, i.e. the BFMatcher will only return consistent
pairs. Such technique usually produces best results with minimal number of outliers when there are
enough matches. This is alternative to the ratio test, used by D. Lowe in SIFT paper.
*/
CV_WRAP
static
Ptr
<
BFMatcher
>
create
(
int
normType
=
NORM_L2
,
bool
crossCheck
=
false
)
;
virtual
Ptr
<
DescriptorMatcher
>
clone
(
bool
emptyTrainData
=
false
)
const
CV_OVERRIDE
;
protected
:
virtual
void
knnMatchImpl
(
InputArray
queryDescriptors
,
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
int
k
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
)
CV_OVERRIDE
;
virtual
void
radiusMatchImpl
(
InputArray
queryDescriptors
,
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
float
maxDistance
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
)
CV_OVERRIDE
;
int
normType
;
bool
crossCheck
;
};
#if defined(HAVE_OPENCV_FLANN) || defined(CV_DOXYGEN)
/** @brief Flann-based descriptor matcher.
This matcher trains cv::flann::Index on a train descriptor collection and calls its nearest search
methods to find the best matches. So, this matcher may be faster when matching a large train
collection than the brute force matcher. FlannBasedMatcher does not support masking permissible
matches of descriptor sets because flann::Index does not support this. :
*/
class
CV_EXPORTS_W
FlannBasedMatcher
:
public
DescriptorMatcher
{
public
:
CV_WRAP
FlannBasedMatcher
(
const
Ptr
<
flann
::
IndexParams
>&
indexParams
=
makePtr
<
flann
::
KDTreeIndexParams
>
(),
const
Ptr
<
flann
::
SearchParams
>&
searchParams
=
makePtr
<
flann
::
SearchParams
>
()
);
virtual
void
add
(
InputArrayOfArrays
descriptors
)
CV_OVERRIDE
;
virtual
void
clear
()
CV_OVERRIDE
;
// Reads matcher object from a file node
virtual
void
read
(
const
FileNode
&
)
CV_OVERRIDE
;
// Writes matcher object to a file storage
virtual
void
write
(
FileStorage
&
)
const
CV_OVERRIDE
;
virtual
void
train
()
CV_OVERRIDE
;
virtual
bool
isMaskSupported
()
const
CV_OVERRIDE
;
CV_WRAP
static
Ptr
<
FlannBasedMatcher
>
create
();
virtual
Ptr
<
DescriptorMatcher
>
clone
(
bool
emptyTrainData
=
false
)
const
CV_OVERRIDE
;
protected
:
static
void
convertToDMatches
(
const
DescriptorCollection
&
descriptors
,
const
Mat
&
indices
,
const
Mat
&
distances
,
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
);
virtual
void
knnMatchImpl
(
InputArray
queryDescriptors
,
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
int
k
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
)
CV_OVERRIDE
;
virtual
void
radiusMatchImpl
(
InputArray
queryDescriptors
,
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches
,
float
maxDistance
,
InputArrayOfArrays
masks
=
noArray
(),
bool
compactResult
=
false
)
CV_OVERRIDE
;
Ptr
<
flann
::
IndexParams
>
indexParams
;
Ptr
<
flann
::
SearchParams
>
searchParams
;
Ptr
<
flann
::
Index
>
flannIndex
;
DescriptorCollection
mergedDescriptors
;
int
addedDescCount
;
};
#endif
//! @} features2d_match
/****************************************************************************************\
* Drawing functions *
\****************************************************************************************/
//! @addtogroup features2d_draw
//! @{
enum
struct
DrawMatchesFlags
{
DEFAULT
=
0
,
//!< Output image matrix will be created (Mat::create),
//!< i.e. existing memory of output image may be reused.
//!< Two source image, matches and single keypoints will be drawn.
//!< For each keypoint only the center point will be drawn (without
//!< the circle around keypoint with keypoint size and orientation).
DRAW_OVER_OUTIMG
=
1
,
//!< Output image matrix will not be created (Mat::create).
//!< Matches will be drawn on existing content of output image.
NOT_DRAW_SINGLE_POINTS
=
2
,
//!< Single keypoints will not be drawn.
DRAW_RICH_KEYPOINTS
=
4
//!< For each keypoint the circle around keypoint with keypoint size and
//!< orientation will be drawn.
};
CV_ENUM_FLAGS
(
DrawMatchesFlags
)
/** @brief Draws keypoints.
@param image Source image.
@param keypoints Keypoints from the source image.
@param outImage Output image. Its content depends on the flags value defining what is drawn in the
output image. See possible flags bit values below.
@param color Color of keypoints.
@param flags Flags setting drawing features. Possible flags bit values are defined by
DrawMatchesFlags. See details above in drawMatches .
@note
For Python API, flags are modified as cv.DRAW_MATCHES_FLAGS_DEFAULT,
cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG,
cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
*/
CV_EXPORTS_W
void
drawKeypoints
(
InputArray
image
,
const
std
::
vector
<
KeyPoint
>&
keypoints
,
InputOutputArray
outImage
,
const
Scalar
&
color
=
Scalar
::
all
(
-
1
),
DrawMatchesFlags
flags
=
DrawMatchesFlags
::
DEFAULT
);
/** @brief Draws the found matches of keypoints from two images.
@param img1 First source image.
@param keypoints1 Keypoints from the first source image.
@param img2 Second source image.
@param keypoints2 Keypoints from the second source image.
@param matches1to2 Matches from the first image to the second one, which means that keypoints1[i]
has a corresponding point in keypoints2[matches[i]] .
@param outImg Output image. Its content depends on the flags value defining what is drawn in the
output image. See possible flags bit values below.
@param matchColor Color of matches (lines and connected keypoints). If matchColor==Scalar::all(-1)
, the color is generated randomly.
@param singlePointColor Color of single keypoints (circles), which means that keypoints do not
have the matches. If singlePointColor==Scalar::all(-1) , the color is generated randomly.
@param matchesMask Mask determining which matches are drawn. If the mask is empty, all matches are
drawn.
@param flags Flags setting drawing features. Possible flags bit values are defined by
DrawMatchesFlags.
This function draws matches of keypoints from two images in the output image. Match is a line
connecting two keypoints (circles). See cv::DrawMatchesFlags.
*/
CV_EXPORTS_W
void
drawMatches
(
InputArray
img1
,
const
std
::
vector
<
KeyPoint
>&
keypoints1
,
InputArray
img2
,
const
std
::
vector
<
KeyPoint
>&
keypoints2
,
const
std
::
vector
<
DMatch
>&
matches1to2
,
InputOutputArray
outImg
,
const
Scalar
&
matchColor
=
Scalar
::
all
(
-
1
),
const
Scalar
&
singlePointColor
=
Scalar
::
all
(
-
1
),
const
std
::
vector
<
char
>&
matchesMask
=
std
::
vector
<
char
>
(),
DrawMatchesFlags
flags
=
DrawMatchesFlags
::
DEFAULT
);
/** @overload */
CV_EXPORTS_AS
(
drawMatchesKnn
)
void
drawMatches
(
InputArray
img1
,
const
std
::
vector
<
KeyPoint
>&
keypoints1
,
InputArray
img2
,
const
std
::
vector
<
KeyPoint
>&
keypoints2
,
const
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches1to2
,
InputOutputArray
outImg
,
const
Scalar
&
matchColor
=
Scalar
::
all
(
-
1
),
const
Scalar
&
singlePointColor
=
Scalar
::
all
(
-
1
),
const
std
::
vector
<
std
::
vector
<
char
>
>&
matchesMask
=
std
::
vector
<
std
::
vector
<
char
>
>
(),
DrawMatchesFlags
flags
=
DrawMatchesFlags
::
DEFAULT
);
//! @} features2d_draw
/****************************************************************************************\
* Functions to evaluate the feature detectors and [generic] descriptor extractors *
\****************************************************************************************/
CV_EXPORTS
void
evaluateFeatureDetector
(
const
Mat
&
img1
,
const
Mat
&
img2
,
const
Mat
&
H1to2
,
std
::
vector
<
KeyPoint
>*
keypoints1
,
std
::
vector
<
KeyPoint
>*
keypoints2
,
float
&
repeatability
,
int
&
correspCount
,
const
Ptr
<
FeatureDetector
>&
fdetector
=
Ptr
<
FeatureDetector
>
()
);
CV_EXPORTS
void
computeRecallPrecisionCurve
(
const
std
::
vector
<
std
::
vector
<
DMatch
>
>&
matches1to2
,
const
std
::
vector
<
std
::
vector
<
uchar
>
>&
correctMatches1to2Mask
,
std
::
vector
<
Point2f
>&
recallPrecisionCurve
);
CV_EXPORTS
float
getRecall
(
const
std
::
vector
<
Point2f
>&
recallPrecisionCurve
,
float
l_precision
);
CV_EXPORTS
int
getNearestPoint
(
const
std
::
vector
<
Point2f
>&
recallPrecisionCurve
,
float
l_precision
);
/****************************************************************************************\
* Bag of visual words *
\****************************************************************************************/
//! @addtogroup features2d_category
//! @{
/** @brief Abstract base class for training the *bag of visual words* vocabulary from a set of descriptors.
For details, see, for example, *Visual Categorization with Bags of Keypoints* by Gabriella Csurka,
Christopher R. Dance, Lixin Fan, Jutta Willamowski, Cedric Bray, 2004. :
*/
class
CV_EXPORTS_W
BOWTrainer
{
public
:
BOWTrainer
();
virtual
~
BOWTrainer
();
/** @brief Adds descriptors to a training set.
@param descriptors Descriptors to add to a training set. Each row of the descriptors matrix is a
descriptor.
The training set is clustered using clustermethod to construct the vocabulary.
*/
CV_WRAP
void
add
(
const
Mat
&
descriptors
);
/** @brief Returns a training set of descriptors.
*/
CV_WRAP
const
std
::
vector
<
Mat
>&
getDescriptors
()
const
;
/** @brief Returns the count of all descriptors stored in the training set.
*/
CV_WRAP
int
descriptorsCount
()
const
;
CV_WRAP
virtual
void
clear
();
/** @overload */
CV_WRAP
virtual
Mat
cluster
()
const
=
0
;
/** @brief Clusters train descriptors.
@param descriptors Descriptors to cluster. Each row of the descriptors matrix is a descriptor.
Descriptors are not added to the inner train descriptor set.
The vocabulary consists of cluster centers. So, this method returns the vocabulary. In the first
variant of the method, train descriptors stored in the object are clustered. In the second variant,
input descriptors are clustered.
*/
CV_WRAP
virtual
Mat
cluster
(
const
Mat
&
descriptors
)
const
=
0
;
protected
:
std
::
vector
<
Mat
>
descriptors
;
int
size
;
};
/** @brief kmeans -based class to train visual vocabulary using the *bag of visual words* approach. :
*/
class
CV_EXPORTS_W
BOWKMeansTrainer
:
public
BOWTrainer
{
public
:
/** @brief The constructor.
@see cv::kmeans
*/
CV_WRAP
BOWKMeansTrainer
(
int
clusterCount
,
const
TermCriteria
&
termcrit
=
TermCriteria
(),
int
attempts
=
3
,
int
flags
=
KMEANS_PP_CENTERS
);
virtual
~
BOWKMeansTrainer
();
// Returns trained vocabulary (i.e. cluster centers).
CV_WRAP
virtual
Mat
cluster
()
const
CV_OVERRIDE
;
CV_WRAP
virtual
Mat
cluster
(
const
Mat
&
descriptors
)
const
CV_OVERRIDE
;
protected
:
int
clusterCount
;
TermCriteria
termcrit
;
int
attempts
;
int
flags
;
};
/** @brief Class to compute an image descriptor using the *bag of visual words*.
Such a computation consists of the following steps:
1. Compute descriptors for a given image and its keypoints set.
2. Find the nearest visual words from the vocabulary for each keypoint descriptor.
3. Compute the bag-of-words image descriptor as is a normalized histogram of vocabulary words
encountered in the image. The i-th bin of the histogram is a frequency of i-th word of the
vocabulary in the given image.
*/
class
CV_EXPORTS_W
BOWImgDescriptorExtractor
{
public
:
/** @brief The constructor.
@param dextractor Descriptor extractor that is used to compute descriptors for an input image and
its keypoints.
@param dmatcher Descriptor matcher that is used to find the nearest word of the trained vocabulary
for each keypoint descriptor of the image.
*/
CV_WRAP
BOWImgDescriptorExtractor
(
const
Ptr
<
DescriptorExtractor
>&
dextractor
,
const
Ptr
<
DescriptorMatcher
>&
dmatcher
);
/** @overload */
BOWImgDescriptorExtractor
(
const
Ptr
<
DescriptorMatcher
>&
dmatcher
);
virtual
~
BOWImgDescriptorExtractor
();
/** @brief Sets a visual vocabulary.
@param vocabulary Vocabulary (can be trained using the inheritor of BOWTrainer ). Each row of the
vocabulary is a visual word (cluster center).
*/
CV_WRAP
void
setVocabulary
(
const
Mat
&
vocabulary
);
/** @brief Returns the set vocabulary.
*/
CV_WRAP
const
Mat
&
getVocabulary
()
const
;
/** @brief Computes an image descriptor using the set visual vocabulary.
@param image Image, for which the descriptor is computed.
@param keypoints Keypoints detected in the input image.
@param imgDescriptor Computed output image descriptor.
@param pointIdxsOfClusters Indices of keypoints that belong to the cluster. This means that
pointIdxsOfClusters[i] are keypoint indices that belong to the i -th cluster (word of vocabulary)
returned if it is non-zero.
@param descriptors Descriptors of the image keypoints that are returned if they are non-zero.
*/
void
compute
(
InputArray
image
,
std
::
vector
<
KeyPoint
>&
keypoints
,
OutputArray
imgDescriptor
,
std
::
vector
<
std
::
vector
<
int
>
>*
pointIdxsOfClusters
=
0
,
Mat
*
descriptors
=
0
);
/** @overload
@param keypointDescriptors Computed descriptors to match with vocabulary.
@param imgDescriptor Computed output image descriptor.
@param pointIdxsOfClusters Indices of keypoints that belong to the cluster. This means that
pointIdxsOfClusters[i] are keypoint indices that belong to the i -th cluster (word of vocabulary)
returned if it is non-zero.
*/
void
compute
(
InputArray
keypointDescriptors
,
OutputArray
imgDescriptor
,
std
::
vector
<
std
::
vector
<
int
>
>*
pointIdxsOfClusters
=
0
);
// compute() is not constant because DescriptorMatcher::match is not constant
CV_WRAP_AS
(
compute
)
void
compute2
(
const
Mat
&
image
,
std
::
vector
<
KeyPoint
>&
keypoints
,
CV_OUT
Mat
&
imgDescriptor
)
{
compute
(
image
,
keypoints
,
imgDescriptor
);
}
/** @brief Returns an image descriptor size if the vocabulary is set. Otherwise, it returns 0.
*/
CV_WRAP
int
descriptorSize
()
const
;
/** @brief Returns an image descriptor type.
*/
CV_WRAP
int
descriptorType
()
const
;
protected
:
Mat
vocabulary
;
Ptr
<
DescriptorExtractor
>
dextractor
;
Ptr
<
DescriptorMatcher
>
dmatcher
;
};
//! @} features2d_category
//! @} features2d
}
/* namespace cv */
#endif
...
...
lite.ai.toolkit/include/opencv2/features2d/features2d.hpp
0 → 100644
查看文件 @
308185e
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifdef __OPENCV_BUILD
#error this is a compatibility header which should not be used inside the OpenCV library
#endif
#include "opencv2/features2d.hpp"
...
...
lite.ai.toolkit/include/opencv2/features2d/hal/interface.h
0 → 100644
查看文件 @
308185e
#ifndef OPENCV_FEATURE2D_HAL_INTERFACE_H
#define OPENCV_FEATURE2D_HAL_INTERFACE_H
#include "opencv2/core/cvdef.h"
//! @addtogroup features2d_hal_interface
//! @{
//! @name Fast feature detector types
//! @sa cv::FastFeatureDetector
//! @{
#define CV_HAL_TYPE_5_8 0
#define CV_HAL_TYPE_7_12 1
#define CV_HAL_TYPE_9_16 2
//! @}
//! @name Key point
//! @sa cv::KeyPoint
//! @{
struct
CV_EXPORTS
cvhalKeyPoint
{
float
x
;
float
y
;
float
size
;
float
angle
;
float
response
;
int
octave
;
int
class_id
;
};
//! @}
//! @}
#endif
...
...
lite.ai.toolkit/include/opencv2/flann.hpp
0 → 100644
查看文件 @
308185e
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef OPENCV_FLANN_HPP
#define OPENCV_FLANN_HPP
#include "opencv2/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/flann/flann_base.hpp"
/**
@defgroup flann Clustering and Search in Multi-Dimensional Spaces
This section documents OpenCV's interface to the FLANN library. FLANN (Fast Library for Approximate
Nearest Neighbors) is a library that contains a collection of algorithms optimized for fast nearest
neighbor search in large datasets and for high dimensional features. More information about FLANN
can be found in @cite Muja2009 .
*/
namespace
cvflann
{
CV_EXPORTS
flann_distance_t
flann_distance_type
();
CV_DEPRECATED
CV_EXPORTS
void
set_distance_type
(
flann_distance_t
distance_type
,
int
order
);
}
namespace
cv
{
namespace
flann
{
//! @addtogroup flann
//! @{
template
<
typename
T
>
struct
CvType
{};
template
<>
struct
CvType
<
unsigned
char
>
{
static
int
type
()
{
return
CV_8U
;
}
};
template
<>
struct
CvType
<
char
>
{
static
int
type
()
{
return
CV_8S
;
}
};
template
<>
struct
CvType
<
unsigned
short
>
{
static
int
type
()
{
return
CV_16U
;
}
};
template
<>
struct
CvType
<
short
>
{
static
int
type
()
{
return
CV_16S
;
}
};
template
<>
struct
CvType
<
int
>
{
static
int
type
()
{
return
CV_32S
;
}
};
template
<>
struct
CvType
<
float
>
{
static
int
type
()
{
return
CV_32F
;
}
};
template
<>
struct
CvType
<
double
>
{
static
int
type
()
{
return
CV_64F
;
}
};
// bring the flann parameters into this namespace
using
::
cvflann
::
get_param
;
using
::
cvflann
::
print_params
;
// bring the flann distances into this namespace
using
::
cvflann
::
L2_Simple
;
using
::
cvflann
::
L2
;
using
::
cvflann
::
L1
;
using
::
cvflann
::
MinkowskiDistance
;
using
::
cvflann
::
MaxDistance
;
using
::
cvflann
::
HammingLUT
;
using
::
cvflann
::
Hamming
;
using
::
cvflann
::
Hamming2
;
using
::
cvflann
::
DNAmmingLUT
;
using
::
cvflann
::
DNAmming2
;
using
::
cvflann
::
HistIntersectionDistance
;
using
::
cvflann
::
HellingerDistance
;
using
::
cvflann
::
ChiSquareDistance
;
using
::
cvflann
::
KL_Divergence
;
/** @brief The FLANN nearest neighbor index class. This class is templated with the type of elements for which
the index is built.
`Distance` functor specifies the metric to be used to calculate the distance between two points.
There are several `Distance` functors that are readily available:
cv::cvflann::L2_Simple - Squared Euclidean distance functor.
This is the simpler, unrolled version. This is preferable for very low dimensionality data (eg 3D points)
cv::flann::L2 - Squared Euclidean distance functor, optimized version.
cv::flann::L1 - Manhattan distance functor, optimized version.
cv::flann::MinkowskiDistance - The Minkowsky distance functor.
This is highly optimised with loop unrolling.
The computation of squared root at the end is omitted for efficiency.
cv::flann::MaxDistance - The max distance functor. It computes the
maximum distance between two vectors. This distance is not a valid kdtree distance, it's not
dimensionwise additive.
cv::flann::HammingLUT - %Hamming distance functor. It counts the bit
differences between two strings using a lookup table implementation.
cv::flann::Hamming - %Hamming distance functor. Population count is
performed using library calls, if available. Lookup table implementation is used as a fallback.
cv::flann::Hamming2 - %Hamming distance functor. Population count is
implemented in 12 arithmetic operations (one of which is multiplication).
cv::flann::DNAmmingLUT - %Adaptation of the Hamming distance functor to DNA comparison.
As the four bases A, C, G, T of the DNA (or A, G, C, U for RNA) can be coded on 2 bits,
it counts the bits pairs differences between two sequences using a lookup table implementation.
cv::flann::DNAmming2 - %Adaptation of the Hamming distance functor to DNA comparison.
Bases differences count are vectorised thanks to arithmetic operations using standard
registers (AVX2 and AVX-512 should come in a near future).
cv::flann::HistIntersectionDistance - The histogram
intersection distance functor.
cv::flann::HellingerDistance - The Hellinger distance functor.
cv::flann::ChiSquareDistance - The chi-square distance functor.
cv::flann::KL_Divergence - The Kullback-Leibler divergence functor.
Although the provided implementations cover a vast range of cases, it is also possible to use
a custom implementation. The distance functor is a class whose `operator()` computes the distance
between two features. If the distance is also a kd-tree compatible distance, it should also provide an
`accum_dist()` method that computes the distance between individual feature dimensions.
In addition to `operator()` and `accum_dist()`, a distance functor should also define the
`ElementType` and the `ResultType` as the types of the elements it operates on and the type of the
result it computes. If a distance functor can be used as a kd-tree distance (meaning that the full
distance between a pair of features can be accumulated from the partial distances between the
individual dimensions) a typedef `is_kdtree_distance` should be present inside the distance functor.
If the distance is not a kd-tree distance, but it's a distance in a vector space (the individual
dimensions of the elements it operates on can be accessed independently) a typedef
`is_vector_space_distance` should be defined inside the functor. If neither typedef is defined, the
distance is assumed to be a metric distance and will only be used with indexes operating on
generic metric distances.
*/
template
<
typename
Distance
>
class
GenericIndex
{
public
:
typedef
typename
Distance
::
ElementType
ElementType
;
typedef
typename
Distance
::
ResultType
DistanceType
;
/** @brief Constructs a nearest neighbor search index for a given dataset.
@param features Matrix of containing the features(points) to index. The size of the matrix is
num_features x feature_dimensionality and the data type of the elements in the matrix must
coincide with the type of the index.
@param params Structure containing the index parameters. The type of index that will be
constructed depends on the type of this parameter. See the description.
@param distance
The method constructs a fast search structure from a set of features using the specified algorithm
with specified parameters, as defined by params. params is a reference to one of the following class
IndexParams descendants:
- **LinearIndexParams** When passing an object of this type, the index will perform a linear,
brute-force search. :
@code
struct LinearIndexParams : public IndexParams
{
};
@endcode
- **KDTreeIndexParams** When passing an object of this type the index constructed will consist of
a set of randomized kd-trees which will be searched in parallel. :
@code
struct KDTreeIndexParams : public IndexParams
{
KDTreeIndexParams( int trees = 4 );
};
@endcode
- **HierarchicalClusteringIndexParams** When passing an object of this type the index constructed
will be a hierarchical tree of clusters, dividing each set of points into n clusters whose centers
are picked among the points without further refinement of their position.
This algorithm fits both floating, integer and binary vectors. :
@code
struct HierarchicalClusteringIndexParams : public IndexParams
{
HierarchicalClusteringIndexParams(
int branching = 32,
flann_centers_init_t centers_init = CENTERS_RANDOM,
int trees = 4,
int leaf_size = 100);
};
@endcode
- **KMeansIndexParams** When passing an object of this type the index constructed will be a
hierarchical k-means tree (one tree by default), dividing each set of points into n clusters
whose barycenters are refined iteratively.
Note that this algorithm has been extended to the support of binary vectors as an alternative
to LSH when knn search speed is the criterium. It will also outperform LSH when processing
directly (i.e. without the use of MCA/PCA) datasets whose points share mostly the same values
for most of the dimensions. It is recommended to set more than one tree with binary data. :
@code
struct KMeansIndexParams : public IndexParams
{
KMeansIndexParams(
int branching = 32,
int iterations = 11,
flann_centers_init_t centers_init = CENTERS_RANDOM,
float cb_index = 0.2,
int trees = 1);
};
@endcode
- **CompositeIndexParams** When using a parameters object of this type the index created
combines the randomized kd-trees and the hierarchical k-means tree. :
@code
struct CompositeIndexParams : public IndexParams
{
CompositeIndexParams(
int trees = 4,
int branching = 32,
int iterations = 11,
flann_centers_init_t centers_init = CENTERS_RANDOM,
float cb_index = 0.2 );
};
@endcode
- **LshIndexParams** When using a parameters object of this type the index created uses
multi-probe LSH (by Multi-Probe LSH: Efficient Indexing for High-Dimensional Similarity Search
by Qin Lv, William Josephson, Zhe Wang, Moses Charikar, Kai Li., Proceedings of the 33rd
International Conference on Very Large Data Bases (VLDB). Vienna, Austria. September 2007).
This algorithm is designed for binary vectors. :
@code
struct LshIndexParams : public IndexParams
{
LshIndexParams(
int table_number,
int key_size,
int multi_probe_level );
};
@endcode
- **AutotunedIndexParams** When passing an object of this type the index created is
automatically tuned to offer the best performance, by choosing the optimal index type
(randomized kd-trees, hierarchical kmeans, linear) and parameters for the dataset provided. :
@code
struct AutotunedIndexParams : public IndexParams
{
AutotunedIndexParams(
float target_precision = 0.9,
float build_weight = 0.01,
float memory_weight = 0,
float sample_fraction = 0.1 );
};
@endcode
- **SavedIndexParams** This object type is used for loading a previously saved index from the
disk. :
@code
struct SavedIndexParams : public IndexParams
{
SavedIndexParams( String filename );
};
@endcode
*/
GenericIndex
(
const
Mat
&
features
,
const
::
cvflann
::
IndexParams
&
params
,
Distance
distance
=
Distance
());
~
GenericIndex
();
/** @brief Performs a K-nearest neighbor search for a given query point using the index.
@param query The query point
@param indices Vector that will contain the indices of the K-nearest neighbors found. It must have
at least knn size.
@param dists Vector that will contain the distances to the K-nearest neighbors found. It must have
at least knn size.
@param knn Number of nearest neighbors to search for.
@param params SearchParams
*/
void
knnSearch
(
const
std
::
vector
<
ElementType
>&
query
,
std
::
vector
<
int
>&
indices
,
std
::
vector
<
DistanceType
>&
dists
,
int
knn
,
const
::
cvflann
::
SearchParams
&
params
);
void
knnSearch
(
const
Mat
&
queries
,
Mat
&
indices
,
Mat
&
dists
,
int
knn
,
const
::
cvflann
::
SearchParams
&
params
);
/** @brief Performs a radius nearest neighbor search for a given query point using the index.
@param query The query point.
@param indices Vector that will contain the indices of the nearest neighbors found.
@param dists Vector that will contain the distances to the nearest neighbors found. It has the same
number of elements as indices.
@param radius The search radius.
@param params SearchParams
This function returns the number of nearest neighbors found.
*/
int
radiusSearch
(
const
std
::
vector
<
ElementType
>&
query
,
std
::
vector
<
int
>&
indices
,
std
::
vector
<
DistanceType
>&
dists
,
DistanceType
radius
,
const
::
cvflann
::
SearchParams
&
params
);
int
radiusSearch
(
const
Mat
&
query
,
Mat
&
indices
,
Mat
&
dists
,
DistanceType
radius
,
const
::
cvflann
::
SearchParams
&
params
);
void
save
(
String
filename
)
{
nnIndex
->
save
(
filename
);
}
int
veclen
()
const
{
return
nnIndex
->
veclen
();
}
int
size
()
const
{
return
(
int
)
nnIndex
->
size
();
}
::
cvflann
::
IndexParams
getParameters
()
{
return
nnIndex
->
getParameters
();
}
CV_DEPRECATED
const
::
cvflann
::
IndexParams
*
getIndexParameters
()
{
return
nnIndex
->
getIndexParameters
();
}
private
:
::
cvflann
::
Index
<
Distance
>*
nnIndex
;
Mat
_dataset
;
};
//! @cond IGNORED
#define FLANN_DISTANCE_CHECK \
if ( ::cvflann::flann_distance_type() != cvflann::FLANN_DIST_L2) { \
printf("[WARNING] You are using cv::flann::Index (or cv::flann::GenericIndex) and have also changed "\
"the distance using cvflann::set_distance_type. This is no longer working as expected "\
"(cv::flann::Index always uses L2). You should create the index templated on the distance, "\
"for example for L1 distance use: GenericIndex< L1<float> > \n"); \
}
template
<
typename
Distance
>
GenericIndex
<
Distance
>::
GenericIndex
(
const
Mat
&
dataset
,
const
::
cvflann
::
IndexParams
&
params
,
Distance
distance
)
:
_dataset
(
dataset
)
{
CV_Assert
(
dataset
.
type
()
==
CvType
<
ElementType
>::
type
());
CV_Assert
(
dataset
.
isContinuous
());
::
cvflann
::
Matrix
<
ElementType
>
m_dataset
((
ElementType
*
)
_dataset
.
ptr
<
ElementType
>
(
0
),
_dataset
.
rows
,
_dataset
.
cols
);
nnIndex
=
new
::
cvflann
::
Index
<
Distance
>
(
m_dataset
,
params
,
distance
);
FLANN_DISTANCE_CHECK
nnIndex
->
buildIndex
();
}
template
<
typename
Distance
>
GenericIndex
<
Distance
>::~
GenericIndex
()
{
delete
nnIndex
;
}
template
<
typename
Distance
>
void
GenericIndex
<
Distance
>::
knnSearch
(
const
std
::
vector
<
ElementType
>&
query
,
std
::
vector
<
int
>&
indices
,
std
::
vector
<
DistanceType
>&
dists
,
int
knn
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
::
cvflann
::
Matrix
<
ElementType
>
m_query
((
ElementType
*
)
&
query
[
0
],
1
,
query
.
size
());
::
cvflann
::
Matrix
<
int
>
m_indices
(
&
indices
[
0
],
1
,
indices
.
size
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
(
&
dists
[
0
],
1
,
dists
.
size
());
FLANN_DISTANCE_CHECK
nnIndex
->
knnSearch
(
m_query
,
m_indices
,
m_dists
,
knn
,
searchParams
);
}
template
<
typename
Distance
>
void
GenericIndex
<
Distance
>::
knnSearch
(
const
Mat
&
queries
,
Mat
&
indices
,
Mat
&
dists
,
int
knn
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
CV_Assert
(
queries
.
type
()
==
CvType
<
ElementType
>::
type
());
CV_Assert
(
queries
.
isContinuous
());
::
cvflann
::
Matrix
<
ElementType
>
m_queries
((
ElementType
*
)
queries
.
ptr
<
ElementType
>
(
0
),
queries
.
rows
,
queries
.
cols
);
CV_Assert
(
indices
.
type
()
==
CV_32S
);
CV_Assert
(
indices
.
isContinuous
());
::
cvflann
::
Matrix
<
int
>
m_indices
((
int
*
)
indices
.
ptr
<
int
>
(
0
),
indices
.
rows
,
indices
.
cols
);
CV_Assert
(
dists
.
type
()
==
CvType
<
DistanceType
>::
type
());
CV_Assert
(
dists
.
isContinuous
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
((
DistanceType
*
)
dists
.
ptr
<
DistanceType
>
(
0
),
dists
.
rows
,
dists
.
cols
);
FLANN_DISTANCE_CHECK
nnIndex
->
knnSearch
(
m_queries
,
m_indices
,
m_dists
,
knn
,
searchParams
);
}
template
<
typename
Distance
>
int
GenericIndex
<
Distance
>::
radiusSearch
(
const
std
::
vector
<
ElementType
>&
query
,
std
::
vector
<
int
>&
indices
,
std
::
vector
<
DistanceType
>&
dists
,
DistanceType
radius
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
::
cvflann
::
Matrix
<
ElementType
>
m_query
((
ElementType
*
)
&
query
[
0
],
1
,
query
.
size
());
::
cvflann
::
Matrix
<
int
>
m_indices
(
&
indices
[
0
],
1
,
indices
.
size
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
(
&
dists
[
0
],
1
,
dists
.
size
());
FLANN_DISTANCE_CHECK
return
nnIndex
->
radiusSearch
(
m_query
,
m_indices
,
m_dists
,
radius
,
searchParams
);
}
template
<
typename
Distance
>
int
GenericIndex
<
Distance
>::
radiusSearch
(
const
Mat
&
query
,
Mat
&
indices
,
Mat
&
dists
,
DistanceType
radius
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
CV_Assert
(
query
.
type
()
==
CvType
<
ElementType
>::
type
());
CV_Assert
(
query
.
isContinuous
());
::
cvflann
::
Matrix
<
ElementType
>
m_query
((
ElementType
*
)
query
.
ptr
<
ElementType
>
(
0
),
query
.
rows
,
query
.
cols
);
CV_Assert
(
indices
.
type
()
==
CV_32S
);
CV_Assert
(
indices
.
isContinuous
());
::
cvflann
::
Matrix
<
int
>
m_indices
((
int
*
)
indices
.
ptr
<
int
>
(
0
),
indices
.
rows
,
indices
.
cols
);
CV_Assert
(
dists
.
type
()
==
CvType
<
DistanceType
>::
type
());
CV_Assert
(
dists
.
isContinuous
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
((
DistanceType
*
)
dists
.
ptr
<
DistanceType
>
(
0
),
dists
.
rows
,
dists
.
cols
);
FLANN_DISTANCE_CHECK
return
nnIndex
->
radiusSearch
(
m_query
,
m_indices
,
m_dists
,
radius
,
searchParams
);
}
/**
* @deprecated Use GenericIndex class instead
*/
template
<
typename
T
>
class
Index_
{
public
:
typedef
typename
L2
<
T
>::
ElementType
ElementType
;
typedef
typename
L2
<
T
>::
ResultType
DistanceType
;
CV_DEPRECATED
Index_
(
const
Mat
&
dataset
,
const
::
cvflann
::
IndexParams
&
params
)
{
printf
(
"[WARNING] The cv::flann::Index_<T> class is deperecated, use cv::flann::GenericIndex<Distance> instead
\n
"
);
CV_Assert
(
dataset
.
type
()
==
CvType
<
ElementType
>::
type
());
CV_Assert
(
dataset
.
isContinuous
());
::
cvflann
::
Matrix
<
ElementType
>
m_dataset
((
ElementType
*
)
dataset
.
ptr
<
ElementType
>
(
0
),
dataset
.
rows
,
dataset
.
cols
);
if
(
::
cvflann
::
flann_distance_type
()
==
cvflann
::
FLANN_DIST_L2
)
{
nnIndex_L1
=
NULL
;
nnIndex_L2
=
new
::
cvflann
::
Index
<
L2
<
ElementType
>
>
(
m_dataset
,
params
);
}
else
if
(
::
cvflann
::
flann_distance_type
()
==
cvflann
::
FLANN_DIST_L1
)
{
nnIndex_L1
=
new
::
cvflann
::
Index
<
L1
<
ElementType
>
>
(
m_dataset
,
params
);
nnIndex_L2
=
NULL
;
}
else
{
printf
(
"[ERROR] cv::flann::Index_<T> only provides backwards compatibility for the L1 and L2 distances. "
"For other distance types you must use cv::flann::GenericIndex<Distance>
\n
"
);
CV_Assert
(
0
);
}
if
(
nnIndex_L1
)
nnIndex_L1
->
buildIndex
();
if
(
nnIndex_L2
)
nnIndex_L2
->
buildIndex
();
}
CV_DEPRECATED
~
Index_
()
{
if
(
nnIndex_L1
)
delete
nnIndex_L1
;
if
(
nnIndex_L2
)
delete
nnIndex_L2
;
}
CV_DEPRECATED
void
knnSearch
(
const
std
::
vector
<
ElementType
>&
query
,
std
::
vector
<
int
>&
indices
,
std
::
vector
<
DistanceType
>&
dists
,
int
knn
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
::
cvflann
::
Matrix
<
ElementType
>
m_query
((
ElementType
*
)
&
query
[
0
],
1
,
query
.
size
());
::
cvflann
::
Matrix
<
int
>
m_indices
(
&
indices
[
0
],
1
,
indices
.
size
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
(
&
dists
[
0
],
1
,
dists
.
size
());
if
(
nnIndex_L1
)
nnIndex_L1
->
knnSearch
(
m_query
,
m_indices
,
m_dists
,
knn
,
searchParams
);
if
(
nnIndex_L2
)
nnIndex_L2
->
knnSearch
(
m_query
,
m_indices
,
m_dists
,
knn
,
searchParams
);
}
CV_DEPRECATED
void
knnSearch
(
const
Mat
&
queries
,
Mat
&
indices
,
Mat
&
dists
,
int
knn
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
CV_Assert
(
queries
.
type
()
==
CvType
<
ElementType
>::
type
());
CV_Assert
(
queries
.
isContinuous
());
::
cvflann
::
Matrix
<
ElementType
>
m_queries
((
ElementType
*
)
queries
.
ptr
<
ElementType
>
(
0
),
queries
.
rows
,
queries
.
cols
);
CV_Assert
(
indices
.
type
()
==
CV_32S
);
CV_Assert
(
indices
.
isContinuous
());
::
cvflann
::
Matrix
<
int
>
m_indices
((
int
*
)
indices
.
ptr
<
int
>
(
0
),
indices
.
rows
,
indices
.
cols
);
CV_Assert
(
dists
.
type
()
==
CvType
<
DistanceType
>::
type
());
CV_Assert
(
dists
.
isContinuous
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
((
DistanceType
*
)
dists
.
ptr
<
DistanceType
>
(
0
),
dists
.
rows
,
dists
.
cols
);
if
(
nnIndex_L1
)
nnIndex_L1
->
knnSearch
(
m_queries
,
m_indices
,
m_dists
,
knn
,
searchParams
);
if
(
nnIndex_L2
)
nnIndex_L2
->
knnSearch
(
m_queries
,
m_indices
,
m_dists
,
knn
,
searchParams
);
}
CV_DEPRECATED
int
radiusSearch
(
const
std
::
vector
<
ElementType
>&
query
,
std
::
vector
<
int
>&
indices
,
std
::
vector
<
DistanceType
>&
dists
,
DistanceType
radius
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
::
cvflann
::
Matrix
<
ElementType
>
m_query
((
ElementType
*
)
&
query
[
0
],
1
,
query
.
size
());
::
cvflann
::
Matrix
<
int
>
m_indices
(
&
indices
[
0
],
1
,
indices
.
size
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
(
&
dists
[
0
],
1
,
dists
.
size
());
if
(
nnIndex_L1
)
return
nnIndex_L1
->
radiusSearch
(
m_query
,
m_indices
,
m_dists
,
radius
,
searchParams
);
if
(
nnIndex_L2
)
return
nnIndex_L2
->
radiusSearch
(
m_query
,
m_indices
,
m_dists
,
radius
,
searchParams
);
}
CV_DEPRECATED
int
radiusSearch
(
const
Mat
&
query
,
Mat
&
indices
,
Mat
&
dists
,
DistanceType
radius
,
const
::
cvflann
::
SearchParams
&
searchParams
)
{
CV_Assert
(
query
.
type
()
==
CvType
<
ElementType
>::
type
());
CV_Assert
(
query
.
isContinuous
());
::
cvflann
::
Matrix
<
ElementType
>
m_query
((
ElementType
*
)
query
.
ptr
<
ElementType
>
(
0
),
query
.
rows
,
query
.
cols
);
CV_Assert
(
indices
.
type
()
==
CV_32S
);
CV_Assert
(
indices
.
isContinuous
());
::
cvflann
::
Matrix
<
int
>
m_indices
((
int
*
)
indices
.
ptr
<
int
>
(
0
),
indices
.
rows
,
indices
.
cols
);
CV_Assert
(
dists
.
type
()
==
CvType
<
DistanceType
>::
type
());
CV_Assert
(
dists
.
isContinuous
());
::
cvflann
::
Matrix
<
DistanceType
>
m_dists
((
DistanceType
*
)
dists
.
ptr
<
DistanceType
>
(
0
),
dists
.
rows
,
dists
.
cols
);
if
(
nnIndex_L1
)
return
nnIndex_L1
->
radiusSearch
(
m_query
,
m_indices
,
m_dists
,
radius
,
searchParams
);
if
(
nnIndex_L2
)
return
nnIndex_L2
->
radiusSearch
(
m_query
,
m_indices
,
m_dists
,
radius
,
searchParams
);
}
CV_DEPRECATED
void
save
(
String
filename
)
{
if
(
nnIndex_L1
)
nnIndex_L1
->
save
(
filename
);
if
(
nnIndex_L2
)
nnIndex_L2
->
save
(
filename
);
}
CV_DEPRECATED
int
veclen
()
const
{
if
(
nnIndex_L1
)
return
nnIndex_L1
->
veclen
();
if
(
nnIndex_L2
)
return
nnIndex_L2
->
veclen
();
}
CV_DEPRECATED
int
size
()
const
{
if
(
nnIndex_L1
)
return
nnIndex_L1
->
size
();
if
(
nnIndex_L2
)
return
nnIndex_L2
->
size
();
}
CV_DEPRECATED
::
cvflann
::
IndexParams
getParameters
()
{
if
(
nnIndex_L1
)
return
nnIndex_L1
->
getParameters
();
if
(
nnIndex_L2
)
return
nnIndex_L2
->
getParameters
();
}
CV_DEPRECATED
const
::
cvflann
::
IndexParams
*
getIndexParameters
()
{
if
(
nnIndex_L1
)
return
nnIndex_L1
->
getIndexParameters
();
if
(
nnIndex_L2
)
return
nnIndex_L2
->
getIndexParameters
();
}
private
:
// providing backwards compatibility for L2 and L1 distances (most common)
::
cvflann
::
Index
<
L2
<
ElementType
>
>*
nnIndex_L2
;
::
cvflann
::
Index
<
L1
<
ElementType
>
>*
nnIndex_L1
;
};
//! @endcond
/** @brief Clusters features using hierarchical k-means algorithm.
@param features The points to be clustered. The matrix must have elements of type
Distance::ElementType.
@param centers The centers of the clusters obtained. The matrix must have type
Distance::CentersType. The number of rows in this matrix represents the number of clusters desired,
however, because of the way the cut in the hierarchical tree is chosen, the number of clusters
computed will be the highest number of the form (branching-1)\*k+1 that's lower than the number of
clusters desired, where branching is the tree's branching factor (see description of the
KMeansIndexParams).
@param params Parameters used in the construction of the hierarchical k-means tree.
@param d Distance to be used for clustering.
The method clusters the given feature vectors by constructing a hierarchical k-means tree and
choosing a cut in the tree that minimizes the cluster's variance. It returns the number of clusters
found.
*/
template
<
typename
Distance
>
int
hierarchicalClustering
(
const
Mat
&
features
,
Mat
&
centers
,
const
::
cvflann
::
KMeansIndexParams
&
params
,
Distance
d
=
Distance
())
{
typedef
typename
Distance
::
ElementType
ElementType
;
typedef
typename
Distance
::
CentersType
CentersType
;
CV_Assert
(
features
.
type
()
==
CvType
<
ElementType
>::
type
());
CV_Assert
(
features
.
isContinuous
());
::
cvflann
::
Matrix
<
ElementType
>
m_features
((
ElementType
*
)
features
.
ptr
<
ElementType
>
(
0
),
features
.
rows
,
features
.
cols
);
CV_Assert
(
centers
.
type
()
==
CvType
<
CentersType
>::
type
());
CV_Assert
(
centers
.
isContinuous
());
::
cvflann
::
Matrix
<
CentersType
>
m_centers
((
CentersType
*
)
centers
.
ptr
<
CentersType
>
(
0
),
centers
.
rows
,
centers
.
cols
);
return
::
cvflann
::
hierarchicalClustering
<
Distance
>
(
m_features
,
m_centers
,
params
,
d
);
}
//! @cond IGNORED
template
<
typename
ELEM_TYPE
,
typename
DIST_TYPE
>
CV_DEPRECATED
int
hierarchicalClustering
(
const
Mat
&
features
,
Mat
&
centers
,
const
::
cvflann
::
KMeansIndexParams
&
params
)
{
printf
(
"[WARNING] cv::flann::hierarchicalClustering<ELEM_TYPE,DIST_TYPE> is deprecated, use "
"cv::flann::hierarchicalClustering<Distance> instead
\n
"
);
if
(
::
cvflann
::
flann_distance_type
()
==
cvflann
::
FLANN_DIST_L2
)
{
return
hierarchicalClustering
<
L2
<
ELEM_TYPE
>
>
(
features
,
centers
,
params
);
}
else
if
(
::
cvflann
::
flann_distance_type
()
==
cvflann
::
FLANN_DIST_L1
)
{
return
hierarchicalClustering
<
L1
<
ELEM_TYPE
>
>
(
features
,
centers
,
params
);
}
else
{
printf
(
"[ERROR] cv::flann::hierarchicalClustering<ELEM_TYPE,DIST_TYPE> only provides backwards "
"compatibility for the L1 and L2 distances. "
"For other distance types you must use cv::flann::hierarchicalClustering<Distance>
\n
"
);
CV_Assert
(
0
);
}
}
//! @endcond
//! @} flann
}
}
// namespace cv::flann
#endif
...
...
lite.ai.toolkit/include/opencv2/flann/all_indices.h
0 → 100644
查看文件 @
308185e
/***********************************************************************
* Software License Agreement (BSD License)
*
* Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
* Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************/
#ifndef OPENCV_FLANN_ALL_INDICES_H_
#define OPENCV_FLANN_ALL_INDICES_H_
//! @cond IGNORED
#include "general.h"
#include "nn_index.h"
#include "kdtree_index.h"
#include "kdtree_single_index.h"
#include "kmeans_index.h"
#include "composite_index.h"
#include "linear_index.h"
#include "hierarchical_clustering_index.h"
#include "lsh_index.h"
#include "autotuned_index.h"
namespace
cvflann
{
template
<
typename
KDTreeCapability
,
typename
VectorSpace
,
typename
Distance
>
struct
index_creator
{
static
NNIndex
<
Distance
>*
create
(
const
Matrix
<
typename
Distance
::
ElementType
>&
dataset
,
const
IndexParams
&
params
,
const
Distance
&
distance
)
{
flann_algorithm_t
index_type
=
get_param
<
flann_algorithm_t
>
(
params
,
"algorithm"
);
NNIndex
<
Distance
>*
nnIndex
;
switch
(
index_type
)
{
case
FLANN_INDEX_LINEAR
:
nnIndex
=
new
LinearIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_KDTREE_SINGLE
:
nnIndex
=
new
KDTreeSingleIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_KDTREE
:
nnIndex
=
new
KDTreeIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_KMEANS
:
nnIndex
=
new
KMeansIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_COMPOSITE
:
nnIndex
=
new
CompositeIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_AUTOTUNED
:
nnIndex
=
new
AutotunedIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_HIERARCHICAL
:
nnIndex
=
new
HierarchicalClusteringIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_LSH
:
nnIndex
=
new
LshIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
default
:
FLANN_THROW
(
cv
::
Error
::
StsBadArg
,
"Unknown index type"
);
}
return
nnIndex
;
}
};
template
<
typename
VectorSpace
,
typename
Distance
>
struct
index_creator
<
False
,
VectorSpace
,
Distance
>
{
static
NNIndex
<
Distance
>*
create
(
const
Matrix
<
typename
Distance
::
ElementType
>&
dataset
,
const
IndexParams
&
params
,
const
Distance
&
distance
)
{
flann_algorithm_t
index_type
=
get_param
<
flann_algorithm_t
>
(
params
,
"algorithm"
);
NNIndex
<
Distance
>*
nnIndex
;
switch
(
index_type
)
{
case
FLANN_INDEX_LINEAR
:
nnIndex
=
new
LinearIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_KMEANS
:
nnIndex
=
new
KMeansIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_HIERARCHICAL
:
nnIndex
=
new
HierarchicalClusteringIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_LSH
:
nnIndex
=
new
LshIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
default
:
FLANN_THROW
(
cv
::
Error
::
StsBadArg
,
"Unknown index type"
);
}
return
nnIndex
;
}
};
template
<
typename
Distance
>
struct
index_creator
<
False
,
False
,
Distance
>
{
static
NNIndex
<
Distance
>*
create
(
const
Matrix
<
typename
Distance
::
ElementType
>&
dataset
,
const
IndexParams
&
params
,
const
Distance
&
distance
)
{
flann_algorithm_t
index_type
=
get_param
<
flann_algorithm_t
>
(
params
,
"algorithm"
);
NNIndex
<
Distance
>*
nnIndex
;
switch
(
index_type
)
{
case
FLANN_INDEX_LINEAR
:
nnIndex
=
new
LinearIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_KMEANS
:
nnIndex
=
new
KMeansIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_HIERARCHICAL
:
nnIndex
=
new
HierarchicalClusteringIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
case
FLANN_INDEX_LSH
:
nnIndex
=
new
LshIndex
<
Distance
>
(
dataset
,
params
,
distance
);
break
;
default
:
FLANN_THROW
(
cv
::
Error
::
StsBadArg
,
"Unknown index type"
);
}
return
nnIndex
;
}
};
template
<
typename
Distance
>
NNIndex
<
Distance
>*
create_index_by_type
(
const
Matrix
<
typename
Distance
::
ElementType
>&
dataset
,
const
IndexParams
&
params
,
const
Distance
&
distance
)
{
return
index_creator
<
typename
Distance
::
is_kdtree_distance
,
typename
Distance
::
is_vector_space_distance
,
Distance
>::
create
(
dataset
,
params
,
distance
);
}
}
//! @endcond
#endif
/* OPENCV_FLANN_ALL_INDICES_H_ */
...
...
lite.ai.toolkit/include/opencv2/flann/allocator.h
0 → 100644
查看文件 @
308185e
/***********************************************************************
* Software License Agreement (BSD License)
*
* Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
* Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
*
* THE BSD LICENSE
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************/
#ifndef OPENCV_FLANN_ALLOCATOR_H_
#define OPENCV_FLANN_ALLOCATOR_H_
//! @cond IGNORED
#include <stdlib.h>
#include <stdio.h>
namespace
cvflann
{
/**
* Allocates (using C's malloc) a generic type T.
*
* Params:
* count = number of instances to allocate.
* Returns: pointer (of type T*) to memory buffer
*/
template
<
typename
T
>
T
*
allocate
(
size_t
count
=
1
)
{
T
*
mem
=
(
T
*
)
::
malloc
(
sizeof
(
T
)
*
count
);
return
mem
;
}
/**
* Pooled storage allocator
*
* The following routines allow for the efficient allocation of storage in
* small chunks from a specified pool. Rather than allowing each structure
* to be freed individually, an entire pool of storage is freed at once.
* This method has two advantages over just using malloc() and free(). First,
* it is far more efficient for allocating small objects, as there is
* no overhead for remembering all the information needed to free each
* object or consolidating fragmented memory. Second, the decision about
* how long to keep an object is made at the time of allocation, and there
* is no need to track down all the objects to free them.
*
*/
const
size_t
WORDSIZE
=
16
;
const
size_t
BLOCKSIZE
=
8192
;
class
PooledAllocator
{
/* We maintain memory alignment to word boundaries by requiring that all
allocations be in multiples of the machine wordsize. */
/* Size of machine word in bytes. Must be power of 2. */
/* Minimum number of bytes requested at a time from the system. Must be multiple of WORDSIZE. */
int
remaining
;
/* Number of bytes left in current block of storage. */
void
*
base
;
/* Pointer to base of current block of storage. */
void
*
loc
;
/* Current location in block to next allocate memory. */
int
blocksize
;
public
:
int
usedMemory
;
int
wastedMemory
;
/**
Default constructor. Initializes a new pool.
*/
PooledAllocator
(
int
blockSize
=
BLOCKSIZE
)
{
blocksize
=
blockSize
;
remaining
=
0
;
base
=
NULL
;
loc
=
NULL
;
usedMemory
=
0
;
wastedMemory
=
0
;
}
/**
* Destructor. Frees all the memory allocated in this pool.
*/
~
PooledAllocator
()
{
void
*
prev
;
while
(
base
!=
NULL
)
{
prev
=
*
((
void
**
)
base
);
/* Get pointer to prev block. */
::
free
(
base
);
base
=
prev
;
}
}
/**
* Returns a pointer to a piece of new memory of the given size in bytes
* allocated from the pool.
*/
void
*
allocateMemory
(
int
size
)
{
int
blockSize
;
/* Round size up to a multiple of wordsize. The following expression
only works for WORDSIZE that is a power of 2, by masking last bits of
incremented size to zero.
*/
size
=
(
size
+
(
WORDSIZE
-
1
))
&
~
(
WORDSIZE
-
1
);
/* Check whether a new block must be allocated. Note that the first word
of a block is reserved for a pointer to the previous block.
*/
if
(
size
>
remaining
)
{
wastedMemory
+=
remaining
;
/* Allocate new storage. */
blockSize
=
(
size
+
sizeof
(
void
*
)
+
(
WORDSIZE
-
1
)
>
BLOCKSIZE
)
?
size
+
sizeof
(
void
*
)
+
(
WORDSIZE
-
1
)
:
BLOCKSIZE
;
// use the standard C malloc to allocate memory
void
*
m
=
::
malloc
(
blockSize
);
if
(
!
m
)
{
fprintf
(
stderr
,
"Failed to allocate memory.
\n
"
);
return
NULL
;
}
/* Fill first word of new block with pointer to previous block. */
((
void
**
)
m
)[
0
]
=
base
;
base
=
m
;
int
shift
=
0
;
//int shift = (WORDSIZE - ( (((size_t)m) + sizeof(void*)) & (WORDSIZE-1))) & (WORDSIZE-1);
remaining
=
blockSize
-
sizeof
(
void
*
)
-
shift
;
loc
=
((
char
*
)
m
+
sizeof
(
void
*
)
+
shift
);
}
void
*
rloc
=
loc
;
loc
=
(
char
*
)
loc
+
size
;
remaining
-=
size
;
usedMemory
+=
size
;
return
rloc
;
}
/**
* Allocates (using this pool) a generic type T.
*
* Params:
* count = number of instances to allocate.
* Returns: pointer (of type T*) to memory buffer
*/
template
<
typename
T
>
T
*
allocate
(
size_t
count
=
1
)
{
T
*
mem
=
(
T
*
)
this
->
allocateMemory
((
int
)(
sizeof
(
T
)
*
count
));
return
mem
;
}
private
:
PooledAllocator
(
const
PooledAllocator
&
);
// copy disabled
PooledAllocator
&
operator
=
(
const
PooledAllocator
&
);
// assign disabled
};
}
//! @endcond
#endif //OPENCV_FLANN_ALLOCATOR_H_
...
...
lite.ai.toolkit/include/opencv2/flann/any.h
0 → 100644
查看文件 @
308185e
#ifndef OPENCV_FLANN_ANY_H_
#define OPENCV_FLANN_ANY_H_
/*
* (C) Copyright Christopher Diggins 2005-2011
* (C) Copyright Pablo Aguilar 2005
* (C) Copyright Kevlin Henney 2001
*
* Distributed under the Boost Software License, Version 1.0. (See
* accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt
*
* Adapted for FLANN by Marius Muja
*/
//! @cond IGNORED
#include "defines.h"
#include <stdexcept>
#include <ostream>
#include <typeinfo>
namespace
cvflann
{
namespace
anyimpl
{
struct
bad_any_cast
{
};
struct
empty_any
{
};
inline
std
::
ostream
&
operator
<<
(
std
::
ostream
&
out
,
const
empty_any
&
)
{
out
<<
"[empty_any]"
;
return
out
;
}
struct
base_any_policy
{
virtual
void
static_delete
(
void
**
x
)
=
0
;
virtual
void
copy_from_value
(
void
const
*
src
,
void
**
dest
)
=
0
;
virtual
void
clone
(
void
*
const
*
src
,
void
**
dest
)
=
0
;
virtual
void
move
(
void
*
const
*
src
,
void
**
dest
)
=
0
;
virtual
void
*
get_value
(
void
**
src
)
=
0
;
virtual
const
void
*
get_value
(
void
*
const
*
src
)
=
0
;
virtual
::
size_t
get_size
()
=
0
;
virtual
const
std
::
type_info
&
type
()
=
0
;
virtual
void
print
(
std
::
ostream
&
out
,
void
*
const
*
src
)
=
0
;
virtual
~
base_any_policy
()
{}
};
template
<
typename
T
>
struct
typed_base_any_policy
:
base_any_policy
{
virtual
::
size_t
get_size
()
CV_OVERRIDE
{
return
sizeof
(
T
);
}
virtual
const
std
::
type_info
&
type
()
CV_OVERRIDE
{
return
typeid
(
T
);
}
};
template
<
typename
T
>
struct
small_any_policy
CV_FINAL
:
typed_base_any_policy
<
T
>
{
virtual
void
static_delete
(
void
**
)
CV_OVERRIDE
{
}
virtual
void
copy_from_value
(
void
const
*
src
,
void
**
dest
)
CV_OVERRIDE
{
new
(
dest
)
T
(
*
reinterpret_cast
<
T
const
*>
(
src
));
}
virtual
void
clone
(
void
*
const
*
src
,
void
**
dest
)
CV_OVERRIDE
{
*
dest
=
*
src
;
}
virtual
void
move
(
void
*
const
*
src
,
void
**
dest
)
CV_OVERRIDE
{
*
dest
=
*
src
;
}
virtual
void
*
get_value
(
void
**
src
)
CV_OVERRIDE
{
return
reinterpret_cast
<
void
*>
(
src
);
}
virtual
const
void
*
get_value
(
void
*
const
*
src
)
CV_OVERRIDE
{
return
reinterpret_cast
<
const
void
*>
(
src
);
}
virtual
void
print
(
std
::
ostream
&
out
,
void
*
const
*
src
)
CV_OVERRIDE
{
out
<<
*
reinterpret_cast
<
T
const
*>
(
src
);
}
};
template
<
typename
T
>
struct
big_any_policy
CV_FINAL
:
typed_base_any_policy
<
T
>
{
virtual
void
static_delete
(
void
**
x
)
CV_OVERRIDE
{
if
(
*
x
)
delete
(
*
reinterpret_cast
<
T
**>
(
x
));
*
x
=
NULL
;
}
virtual
void
copy_from_value
(
void
const
*
src
,
void
**
dest
)
CV_OVERRIDE
{
*
dest
=
new
T
(
*
reinterpret_cast
<
T
const
*>
(
src
));
}
virtual
void
clone
(
void
*
const
*
src
,
void
**
dest
)
CV_OVERRIDE
{
*
dest
=
new
T
(
**
reinterpret_cast
<
T
*
const
*>
(
src
));
}
virtual
void
move
(
void
*
const
*
src
,
void
**
dest
)
CV_OVERRIDE
{
(
*
reinterpret_cast
<
T
**>
(
dest
))
->~
T
();
**
reinterpret_cast
<
T
**>
(
dest
)
=
**
reinterpret_cast
<
T
*
const
*>
(
src
);
}
virtual
void
*
get_value
(
void
**
src
)
CV_OVERRIDE
{
return
*
src
;
}
virtual
const
void
*
get_value
(
void
*
const
*
src
)
CV_OVERRIDE
{
return
*
src
;
}
virtual
void
print
(
std
::
ostream
&
out
,
void
*
const
*
src
)
CV_OVERRIDE
{
out
<<
*
reinterpret_cast
<
T
const
*>
(
*
src
);
}
};
template
<>
inline
void
big_any_policy
<
flann_centers_init_t
>::
print
(
std
::
ostream
&
out
,
void
*
const
*
src
)
{
out
<<
int
(
*
reinterpret_cast
<
flann_centers_init_t
const
*>
(
*
src
));
}
template
<>
inline
void
big_any_policy
<
flann_algorithm_t
>::
print
(
std
::
ostream
&
out
,
void
*
const
*
src
)
{
out
<<
int
(
*
reinterpret_cast
<
flann_algorithm_t
const
*>
(
*
src
));
}
template
<>
inline
void
big_any_policy
<
cv
::
String
>::
print
(
std
::
ostream
&
out
,
void
*
const
*
src
)
{
out
<<
(
*
reinterpret_cast
<
cv
::
String
const
*>
(
*
src
)).
c_str
();
}
template
<
typename
T
>
struct
choose_policy
{
typedef
big_any_policy
<
T
>
type
;
};
template
<
typename
T
>
struct
choose_policy
<
T
*>
{
typedef
small_any_policy
<
T
*>
type
;
};
struct
any
;
/// Choosing the policy for an any type is illegal, but should never happen.
/// This is designed to throw a compiler error.
template
<>
struct
choose_policy
<
any
>
{
typedef
void
type
;
};
/// Specializations for small types.
#define SMALL_POLICY(TYPE) \
template<> \
struct choose_policy<TYPE> { typedef small_any_policy<TYPE> type; \
}
SMALL_POLICY
(
signed
char
);
SMALL_POLICY
(
unsigned
char
);
SMALL_POLICY
(
signed
short
);
SMALL_POLICY
(
unsigned
short
);
SMALL_POLICY
(
signed
int
);
SMALL_POLICY
(
unsigned
int
);
SMALL_POLICY
(
signed
long
);
SMALL_POLICY
(
unsigned
long
);
SMALL_POLICY
(
float
);
SMALL_POLICY
(
bool
);
#undef SMALL_POLICY
template
<
typename
T
>
class
SinglePolicy
{
SinglePolicy
();
SinglePolicy
(
const
SinglePolicy
&
other
);
SinglePolicy
&
operator
=
(
const
SinglePolicy
&
other
);
public
:
static
base_any_policy
*
get_policy
();
private
:
static
typename
choose_policy
<
T
>::
type
policy
;
};
template
<
typename
T
>
typename
choose_policy
<
T
>::
type
SinglePolicy
<
T
>::
policy
;
/// This function will return a different policy for each type.
template
<
typename
T
>
inline
base_any_policy
*
SinglePolicy
<
T
>::
get_policy
()
{
return
&
policy
;
}
}
// namespace anyimpl
struct
any
{
private
:
// fields
anyimpl
::
base_any_policy
*
policy
;
void
*
object
;
public
:
/// Initializing constructor.
template
<
typename
T
>
any
(
const
T
&
x
)
:
policy
(
anyimpl
::
SinglePolicy
<
anyimpl
::
empty_any
>::
get_policy
()),
object
(
NULL
)
{
assign
(
x
);
}
/// Empty constructor.
any
()
:
policy
(
anyimpl
::
SinglePolicy
<
anyimpl
::
empty_any
>::
get_policy
()),
object
(
NULL
)
{
}
/// Special initializing constructor for string literals.
any
(
const
char
*
x
)
:
policy
(
anyimpl
::
SinglePolicy
<
anyimpl
::
empty_any
>::
get_policy
()),
object
(
NULL
)
{
assign
(
x
);
}
/// Copy constructor.
any
(
const
any
&
x
)
:
policy
(
anyimpl
::
SinglePolicy
<
anyimpl
::
empty_any
>::
get_policy
()),
object
(
NULL
)
{
assign
(
x
);
}
/// Destructor.
~
any
()
{
policy
->
static_delete
(
&
object
);
}
/// Assignment function from another any.
any
&
assign
(
const
any
&
x
)
{
reset
();
policy
=
x
.
policy
;
policy
->
clone
(
&
x
.
object
,
&
object
);
return
*
this
;
}
/// Assignment function.
template
<
typename
T
>
any
&
assign
(
const
T
&
x
)
{
reset
();
policy
=
anyimpl
::
SinglePolicy
<
T
>::
get_policy
();
policy
->
copy_from_value
(
&
x
,
&
object
);
return
*
this
;
}
/// Assignment operator.
template
<
typename
T
>
any
&
operator
=
(
const
T
&
x
)
{
return
assign
(
x
);
}
/// Assignment operator. Template-based version above doesn't work as expected. We need regular assignment operator here.
any
&
operator
=
(
const
any
&
x
)
{
return
assign
(
x
);
}
/// Assignment operator, specialed for literal strings.
/// They have types like const char [6] which don't work as expected.
any
&
operator
=
(
const
char
*
x
)
{
return
assign
(
x
);
}
/// Utility functions
any
&
swap
(
any
&
x
)
{
std
::
swap
(
policy
,
x
.
policy
);
std
::
swap
(
object
,
x
.
object
);
return
*
this
;
}
/// Cast operator. You can only cast to the original type.
template
<
typename
T
>
T
&
cast
()
{
if
(
policy
->
type
()
!=
typeid
(
T
))
throw
anyimpl
::
bad_any_cast
();
T
*
r
=
reinterpret_cast
<
T
*>
(
policy
->
get_value
(
&
object
));
return
*
r
;
}
/// Cast operator. You can only cast to the original type.
template
<
typename
T
>
const
T
&
cast
()
const
{
if
(
policy
->
type
()
!=
typeid
(
T
))
throw
anyimpl
::
bad_any_cast
();
const
T
*
r
=
reinterpret_cast
<
const
T
*>
(
policy
->
get_value
(
&
object
));
return
*
r
;
}
/// Returns true if the any contains no value.
bool
empty
()
const
{
return
policy
->
type
()
==
typeid
(
anyimpl
::
empty_any
);
}
/// Frees any allocated memory, and sets the value to NULL.
void
reset
()
{
policy
->
static_delete
(
&
object
);
policy
=
anyimpl
::
SinglePolicy
<
anyimpl
::
empty_any
>::
get_policy
();
}
/// Returns true if the two types are the same.
bool
compatible
(
const
any
&
x
)
const
{
return
policy
->
type
()
==
x
.
policy
->
type
();
}
/// Returns if the type is compatible with the policy
template
<
typename
T
>
bool
has_type
()
{
return
policy
->
type
()
==
typeid
(
T
);
}
const
std
::
type_info
&
type
()
const
{
return
policy
->
type
();
}
friend
std
::
ostream
&
operator
<<
(
std
::
ostream
&
out
,
const
any
&
any_val
);
};
inline
std
::
ostream
&
operator
<<
(
std
::
ostream
&
out
,
const
any
&
any_val
)
{
any_val
.
policy
->
print
(
out
,
&
any_val
.
object
);
return
out
;
}
}
//! @endcond
#endif // OPENCV_FLANN_ANY_H_
...
...
lite.ai.toolkit/include/opencv2/flann/autotuned_index.h
0 → 100644
查看文件 @
308185e
/***********************************************************************
* Software License Agreement (BSD License)
*
* Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
* Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
*
* THE BSD LICENSE
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************/
#ifndef OPENCV_FLANN_AUTOTUNED_INDEX_H_
#define OPENCV_FLANN_AUTOTUNED_INDEX_H_
//! @cond IGNORED
#include <sstream>
#include "nn_index.h"
#include "ground_truth.h"
#include "index_testing.h"
#include "sampling.h"
#include "kdtree_index.h"
#include "kdtree_single_index.h"
#include "kmeans_index.h"
#include "composite_index.h"
#include "linear_index.h"
#include "logger.h"
namespace
cvflann
{
template
<
typename
Distance
>
NNIndex
<
Distance
>*
create_index_by_type
(
const
Matrix
<
typename
Distance
::
ElementType
>&
dataset
,
const
IndexParams
&
params
,
const
Distance
&
distance
);
struct
AutotunedIndexParams
:
public
IndexParams
{
AutotunedIndexParams
(
float
target_precision
=
0
.
8
,
float
build_weight
=
0
.
01
,
float
memory_weight
=
0
,
float
sample_fraction
=
0
.
1
)
{
(
*
this
)[
"algorithm"
]
=
FLANN_INDEX_AUTOTUNED
;
// precision desired (used for autotuning, -1 otherwise)
(
*
this
)[
"target_precision"
]
=
target_precision
;
// build tree time weighting factor
(
*
this
)[
"build_weight"
]
=
build_weight
;
// index memory weighting factor
(
*
this
)[
"memory_weight"
]
=
memory_weight
;
// what fraction of the dataset to use for autotuning
(
*
this
)[
"sample_fraction"
]
=
sample_fraction
;
}
};
template
<
typename
Distance
>
class
AutotunedIndex
:
public
NNIndex
<
Distance
>
{
public
:
typedef
typename
Distance
::
ElementType
ElementType
;
typedef
typename
Distance
::
ResultType
DistanceType
;
AutotunedIndex
(
const
Matrix
<
ElementType
>&
inputData
,
const
IndexParams
&
params
=
AutotunedIndexParams
(),
Distance
d
=
Distance
())
:
dataset_
(
inputData
),
distance_
(
d
)
{
target_precision_
=
get_param
(
params
,
"target_precision"
,
0
.
8
f
);
build_weight_
=
get_param
(
params
,
"build_weight"
,
0
.
01
f
);
memory_weight_
=
get_param
(
params
,
"memory_weight"
,
0
.
0
f
);
sample_fraction_
=
get_param
(
params
,
"sample_fraction"
,
0
.
1
f
);
bestIndex_
=
NULL
;
speedup_
=
0
;
}
AutotunedIndex
(
const
AutotunedIndex
&
);
AutotunedIndex
&
operator
=
(
const
AutotunedIndex
&
);
virtual
~
AutotunedIndex
()
{
if
(
bestIndex_
!=
NULL
)
{
delete
bestIndex_
;
bestIndex_
=
NULL
;
}
}
/**
* Method responsible with building the index.
*/
virtual
void
buildIndex
()
CV_OVERRIDE
{
std
::
ostringstream
stream
;
bestParams_
=
estimateBuildParams
();
print_params
(
bestParams_
,
stream
);
Logger
::
info
(
"----------------------------------------------------
\n
"
);
Logger
::
info
(
"Autotuned parameters:
\n
"
);
Logger
::
info
(
"%s"
,
stream
.
str
().
c_str
());
Logger
::
info
(
"----------------------------------------------------
\n
"
);
bestIndex_
=
create_index_by_type
(
dataset_
,
bestParams_
,
distance_
);
bestIndex_
->
buildIndex
();
speedup_
=
estimateSearchParams
(
bestSearchParams_
);
stream
.
str
(
std
::
string
());
print_params
(
bestSearchParams_
,
stream
);
Logger
::
info
(
"----------------------------------------------------
\n
"
);
Logger
::
info
(
"Search parameters:
\n
"
);
Logger
::
info
(
"%s"
,
stream
.
str
().
c_str
());
Logger
::
info
(
"----------------------------------------------------
\n
"
);
}
/**
* Saves the index to a stream
*/
virtual
void
saveIndex
(
FILE
*
stream
)
CV_OVERRIDE
{
save_value
(
stream
,
(
int
)
bestIndex_
->
getType
());
bestIndex_
->
saveIndex
(
stream
);
save_value
(
stream
,
get_param
<
int
>
(
bestSearchParams_
,
"checks"
));
}
/**
* Loads the index from a stream
*/
virtual
void
loadIndex
(
FILE
*
stream
)
CV_OVERRIDE
{
int
index_type
;
load_value
(
stream
,
index_type
);
IndexParams
params
;
params
[
"algorithm"
]
=
(
flann_algorithm_t
)
index_type
;
bestIndex_
=
create_index_by_type
<
Distance
>
(
dataset_
,
params
,
distance_
);
bestIndex_
->
loadIndex
(
stream
);
int
checks
;
load_value
(
stream
,
checks
);
bestSearchParams_
[
"checks"
]
=
checks
;
}
/**
* Method that searches for nearest-neighbors
*/
virtual
void
findNeighbors
(
ResultSet
<
DistanceType
>&
result
,
const
ElementType
*
vec
,
const
SearchParams
&
searchParams
)
CV_OVERRIDE
{
int
checks
=
get_param
<
int
>
(
searchParams
,
"checks"
,
FLANN_CHECKS_AUTOTUNED
);
if
(
checks
==
FLANN_CHECKS_AUTOTUNED
)
{
bestIndex_
->
findNeighbors
(
result
,
vec
,
bestSearchParams_
);
}
else
{
bestIndex_
->
findNeighbors
(
result
,
vec
,
searchParams
);
}
}
IndexParams
getParameters
()
const
CV_OVERRIDE
{
return
bestIndex_
->
getParameters
();
}
SearchParams
getSearchParameters
()
const
{
return
bestSearchParams_
;
}
float
getSpeedup
()
const
{
return
speedup_
;
}
/**
* Number of features in this index.
*/
virtual
size_t
size
()
const
CV_OVERRIDE
{
return
bestIndex_
->
size
();
}
/**
* The length of each vector in this index.
*/
virtual
size_t
veclen
()
const
CV_OVERRIDE
{
return
bestIndex_
->
veclen
();
}
/**
* The amount of memory (in bytes) this index uses.
*/
virtual
int
usedMemory
()
const
CV_OVERRIDE
{
return
bestIndex_
->
usedMemory
();
}
/**
* Algorithm name
*/
virtual
flann_algorithm_t
getType
()
const
CV_OVERRIDE
{
return
FLANN_INDEX_AUTOTUNED
;
}
private
:
struct
CostData
{
float
searchTimeCost
;
float
buildTimeCost
;
float
memoryCost
;
float
totalCost
;
IndexParams
params
;
};
void
evaluate_kmeans
(
CostData
&
cost
)
{
StartStopTimer
t
;
int
checks
;
const
int
nn
=
1
;
Logger
::
info
(
"KMeansTree using params: max_iterations=%d, branching=%d
\n
"
,
get_param
<
int
>
(
cost
.
params
,
"iterations"
),
get_param
<
int
>
(
cost
.
params
,
"branching"
));
KMeansIndex
<
Distance
>
kmeans
(
sampledDataset_
,
cost
.
params
,
distance_
);
// measure index build time
t
.
start
();
kmeans
.
buildIndex
();
t
.
stop
();
float
buildTime
=
(
float
)
t
.
value
;
// measure search time
float
searchTime
=
test_index_precision
(
kmeans
,
sampledDataset_
,
testDataset_
,
gt_matches_
,
target_precision_
,
checks
,
distance_
,
nn
);
float
datasetMemory
=
float
(
sampledDataset_
.
rows
*
sampledDataset_
.
cols
*
sizeof
(
float
));
cost
.
memoryCost
=
(
kmeans
.
usedMemory
()
+
datasetMemory
)
/
datasetMemory
;
cost
.
searchTimeCost
=
searchTime
;
cost
.
buildTimeCost
=
buildTime
;
Logger
::
info
(
"KMeansTree buildTime=%g, searchTime=%g, build_weight=%g
\n
"
,
buildTime
,
searchTime
,
build_weight_
);
}
void
evaluate_kdtree
(
CostData
&
cost
)
{
StartStopTimer
t
;
int
checks
;
const
int
nn
=
1
;
Logger
::
info
(
"KDTree using params: trees=%d
\n
"
,
get_param
<
int
>
(
cost
.
params
,
"trees"
));
KDTreeIndex
<
Distance
>
kdtree
(
sampledDataset_
,
cost
.
params
,
distance_
);
t
.
start
();
kdtree
.
buildIndex
();
t
.
stop
();
float
buildTime
=
(
float
)
t
.
value
;
//measure search time
float
searchTime
=
test_index_precision
(
kdtree
,
sampledDataset_
,
testDataset_
,
gt_matches_
,
target_precision_
,
checks
,
distance_
,
nn
);
float
datasetMemory
=
float
(
sampledDataset_
.
rows
*
sampledDataset_
.
cols
*
sizeof
(
float
));
cost
.
memoryCost
=
(
kdtree
.
usedMemory
()
+
datasetMemory
)
/
datasetMemory
;
cost
.
searchTimeCost
=
searchTime
;
cost
.
buildTimeCost
=
buildTime
;
Logger
::
info
(
"KDTree buildTime=%g, searchTime=%g
\n
"
,
buildTime
,
searchTime
);
}
// struct KMeansSimpleDownhillFunctor {
//
// Autotune& autotuner;
// KMeansSimpleDownhillFunctor(Autotune& autotuner_) : autotuner(autotuner_) {}
//
// float operator()(int* params) {
//
// float maxFloat = numeric_limits<float>::max();
//
// if (params[0]<2) return maxFloat;
// if (params[1]<0) return maxFloat;
//
// CostData c;
// c.params["algorithm"] = KMEANS;
// c.params["centers-init"] = CENTERS_RANDOM;
// c.params["branching"] = params[0];
// c.params["max-iterations"] = params[1];
//
// autotuner.evaluate_kmeans(c);
//
// return c.timeCost;
//
// }
// };
//
// struct KDTreeSimpleDownhillFunctor {
//
// Autotune& autotuner;
// KDTreeSimpleDownhillFunctor(Autotune& autotuner_) : autotuner(autotuner_) {}
//
// float operator()(int* params) {
// float maxFloat = numeric_limits<float>::max();
//
// if (params[0]<1) return maxFloat;
//
// CostData c;
// c.params["algorithm"] = KDTREE;
// c.params["trees"] = params[0];
//
// autotuner.evaluate_kdtree(c);
//
// return c.timeCost;
//
// }
// };
void
optimizeKMeans
(
std
::
vector
<
CostData
>&
costs
)
{
Logger
::
info
(
"KMEANS, Step 1: Exploring parameter space
\n
"
);
// explore kmeans parameters space using combinations of the parameters below
int
maxIterations
[]
=
{
1
,
5
,
10
,
15
};
int
branchingFactors
[]
=
{
16
,
32
,
64
,
128
,
256
};
int
kmeansParamSpaceSize
=
FLANN_ARRAY_LEN
(
maxIterations
)
*
FLANN_ARRAY_LEN
(
branchingFactors
);
costs
.
reserve
(
costs
.
size
()
+
kmeansParamSpaceSize
);
// evaluate kmeans for all parameter combinations
for
(
size_t
i
=
0
;
i
<
FLANN_ARRAY_LEN
(
maxIterations
);
++
i
)
{
for
(
size_t
j
=
0
;
j
<
FLANN_ARRAY_LEN
(
branchingFactors
);
++
j
)
{
CostData
cost
;
cost
.
params
[
"algorithm"
]
=
FLANN_INDEX_KMEANS
;
cost
.
params
[
"centers_init"
]
=
FLANN_CENTERS_RANDOM
;
cost
.
params
[
"iterations"
]
=
maxIterations
[
i
];
cost
.
params
[
"branching"
]
=
branchingFactors
[
j
];
evaluate_kmeans
(
cost
);
costs
.
push_back
(
cost
);
}
}
// Logger::info("KMEANS, Step 2: simplex-downhill optimization\n");
//
// const int n = 2;
// // choose initial simplex points as the best parameters so far
// int kmeansNMPoints[n*(n+1)];
// float kmeansVals[n+1];
// for (int i=0;i<n+1;++i) {
// kmeansNMPoints[i*n] = (int)kmeansCosts[i].params["branching"];
// kmeansNMPoints[i*n+1] = (int)kmeansCosts[i].params["max-iterations"];
// kmeansVals[i] = kmeansCosts[i].timeCost;
// }
// KMeansSimpleDownhillFunctor kmeans_cost_func(*this);
// // run optimization
// optimizeSimplexDownhill(kmeansNMPoints,n,kmeans_cost_func,kmeansVals);
// // store results
// for (int i=0;i<n+1;++i) {
// kmeansCosts[i].params["branching"] = kmeansNMPoints[i*2];
// kmeansCosts[i].params["max-iterations"] = kmeansNMPoints[i*2+1];
// kmeansCosts[i].timeCost = kmeansVals[i];
// }
}
void
optimizeKDTree
(
std
::
vector
<
CostData
>&
costs
)
{
Logger
::
info
(
"KD-TREE, Step 1: Exploring parameter space
\n
"
);
// explore kd-tree parameters space using the parameters below
int
testTrees
[]
=
{
1
,
4
,
8
,
16
,
32
};
// evaluate kdtree for all parameter combinations
for
(
size_t
i
=
0
;
i
<
FLANN_ARRAY_LEN
(
testTrees
);
++
i
)
{
CostData
cost
;
cost
.
params
[
"algorithm"
]
=
FLANN_INDEX_KDTREE
;
cost
.
params
[
"trees"
]
=
testTrees
[
i
];
evaluate_kdtree
(
cost
);
costs
.
push_back
(
cost
);
}
// Logger::info("KD-TREE, Step 2: simplex-downhill optimization\n");
//
// const int n = 1;
// // choose initial simplex points as the best parameters so far
// int kdtreeNMPoints[n*(n+1)];
// float kdtreeVals[n+1];
// for (int i=0;i<n+1;++i) {
// kdtreeNMPoints[i] = (int)kdtreeCosts[i].params["trees"];
// kdtreeVals[i] = kdtreeCosts[i].timeCost;
// }
// KDTreeSimpleDownhillFunctor kdtree_cost_func(*this);
// // run optimization
// optimizeSimplexDownhill(kdtreeNMPoints,n,kdtree_cost_func,kdtreeVals);
// // store results
// for (int i=0;i<n+1;++i) {
// kdtreeCosts[i].params["trees"] = kdtreeNMPoints[i];
// kdtreeCosts[i].timeCost = kdtreeVals[i];
// }
}
/**
* Chooses the best nearest-neighbor algorithm and estimates the optimal
* parameters to use when building the index (for a given precision).
* Returns a dictionary with the optimal parameters.
*/
IndexParams
estimateBuildParams
()
{
std
::
vector
<
CostData
>
costs
;
int
sampleSize
=
int
(
sample_fraction_
*
dataset_
.
rows
);
int
testSampleSize
=
std
::
min
(
sampleSize
/
10
,
1000
);
Logger
::
info
(
"Entering autotuning, dataset size: %d, sampleSize: %d, testSampleSize: %d, target precision: %g
\n
"
,
dataset_
.
rows
,
sampleSize
,
testSampleSize
,
target_precision_
);
// For a very small dataset, it makes no sense to build any fancy index, just
// use linear search
if
(
testSampleSize
<
10
)
{
Logger
::
info
(
"Choosing linear, dataset too small
\n
"
);
return
LinearIndexParams
();
}
// We use a fraction of the original dataset to speedup the autotune algorithm
sampledDataset_
=
random_sample
(
dataset_
,
sampleSize
);
// We use a cross-validation approach, first we sample a testset from the dataset
testDataset_
=
random_sample
(
sampledDataset_
,
testSampleSize
,
true
);
// We compute the ground truth using linear search
Logger
::
info
(
"Computing ground truth...
\n
"
);
gt_matches_
=
Matrix
<
int
>
(
new
int
[
testDataset_
.
rows
],
testDataset_
.
rows
,
1
);
StartStopTimer
t
;
t
.
start
();
compute_ground_truth
<
Distance
>
(
sampledDataset_
,
testDataset_
,
gt_matches_
,
0
,
distance_
);
t
.
stop
();
CostData
linear_cost
;
linear_cost
.
searchTimeCost
=
(
float
)
t
.
value
;
linear_cost
.
buildTimeCost
=
0
;
linear_cost
.
memoryCost
=
0
;
linear_cost
.
params
[
"algorithm"
]
=
FLANN_INDEX_LINEAR
;
costs
.
push_back
(
linear_cost
);
// Start parameter autotune process
Logger
::
info
(
"Autotuning parameters...
\n
"
);
optimizeKMeans
(
costs
);
optimizeKDTree
(
costs
);
float
bestTimeCost
=
costs
[
0
].
searchTimeCost
;
for
(
size_t
i
=
0
;
i
<
costs
.
size
();
++
i
)
{
float
timeCost
=
costs
[
i
].
buildTimeCost
*
build_weight_
+
costs
[
i
].
searchTimeCost
;
if
(
timeCost
<
bestTimeCost
)
{
bestTimeCost
=
timeCost
;
}
}
float
bestCost
=
costs
[
0
].
searchTimeCost
/
bestTimeCost
;
IndexParams
bestParams
=
costs
[
0
].
params
;
if
(
bestTimeCost
>
0
)
{
for
(
size_t
i
=
0
;
i
<
costs
.
size
();
++
i
)
{
float
crtCost
=
(
costs
[
i
].
buildTimeCost
*
build_weight_
+
costs
[
i
].
searchTimeCost
)
/
bestTimeCost
+
memory_weight_
*
costs
[
i
].
memoryCost
;
if
(
crtCost
<
bestCost
)
{
bestCost
=
crtCost
;
bestParams
=
costs
[
i
].
params
;
}
}
}
delete
[]
gt_matches_
.
data
;
delete
[]
testDataset_
.
data
;
delete
[]
sampledDataset_
.
data
;
return
bestParams
;
}
/**
* Estimates the search time parameters needed to get the desired precision.
* Precondition: the index is built
* Postcondition: the searchParams will have the optimum params set, also the speedup obtained over linear search.
*/
float
estimateSearchParams
(
SearchParams
&
searchParams
)
{
const
int
nn
=
1
;
const
size_t
SAMPLE_COUNT
=
1000
;
CV_Assert
(
bestIndex_
!=
NULL
&&
"Requires a valid index"
);
// must have a valid index
float
speedup
=
0
;
int
samples
=
(
int
)
std
::
min
(
dataset_
.
rows
/
10
,
SAMPLE_COUNT
);
if
(
samples
>
0
)
{
Matrix
<
ElementType
>
testDataset
=
random_sample
(
dataset_
,
samples
);
Logger
::
info
(
"Computing ground truth
\n
"
);
// we need to compute the ground truth first
Matrix
<
int
>
gt_matches
(
new
int
[
testDataset
.
rows
],
testDataset
.
rows
,
1
);
StartStopTimer
t
;
t
.
start
();
compute_ground_truth
<
Distance
>
(
dataset_
,
testDataset
,
gt_matches
,
1
,
distance_
);
t
.
stop
();
float
linear
=
(
float
)
t
.
value
;
int
checks
;
Logger
::
info
(
"Estimating number of checks
\n
"
);
float
searchTime
;
float
cb_index
;
if
(
bestIndex_
->
getType
()
==
FLANN_INDEX_KMEANS
)
{
Logger
::
info
(
"KMeans algorithm, estimating cluster border factor
\n
"
);
KMeansIndex
<
Distance
>*
kmeans
=
(
KMeansIndex
<
Distance
>*
)
bestIndex_
;
float
bestSearchTime
=
-
1
;
float
best_cb_index
=
-
1
;
int
best_checks
=
-
1
;
for
(
cb_index
=
0
;
cb_index
<
1
.
1
f
;
cb_index
+=
0
.
2
f
)
{
kmeans
->
set_cb_index
(
cb_index
);
searchTime
=
test_index_precision
(
*
kmeans
,
dataset_
,
testDataset
,
gt_matches
,
target_precision_
,
checks
,
distance_
,
nn
,
1
);
if
((
searchTime
<
bestSearchTime
)
||
(
bestSearchTime
==
-
1
))
{
bestSearchTime
=
searchTime
;
best_cb_index
=
cb_index
;
best_checks
=
checks
;
}
}
searchTime
=
bestSearchTime
;
cb_index
=
best_cb_index
;
checks
=
best_checks
;
kmeans
->
set_cb_index
(
best_cb_index
);
Logger
::
info
(
"Optimum cb_index: %g
\n
"
,
cb_index
);
bestParams_
[
"cb_index"
]
=
cb_index
;
}
else
{
searchTime
=
test_index_precision
(
*
bestIndex_
,
dataset_
,
testDataset
,
gt_matches
,
target_precision_
,
checks
,
distance_
,
nn
,
1
);
}
Logger
::
info
(
"Required number of checks: %d
\n
"
,
checks
);
searchParams
[
"checks"
]
=
checks
;
speedup
=
linear
/
searchTime
;
delete
[]
gt_matches
.
data
;
delete
[]
testDataset
.
data
;
}
return
speedup
;
}
private
:
NNIndex
<
Distance
>*
bestIndex_
;
IndexParams
bestParams_
;
SearchParams
bestSearchParams_
;
Matrix
<
ElementType
>
sampledDataset_
;
Matrix
<
ElementType
>
testDataset_
;
Matrix
<
int
>
gt_matches_
;
float
speedup_
;
/**
* The dataset used by this index
*/
const
Matrix
<
ElementType
>
dataset_
;
/**
* Index parameters
*/
float
target_precision_
;
float
build_weight_
;
float
memory_weight_
;
float
sample_fraction_
;
Distance
distance_
;
};
}
//! @endcond
#endif
/* OPENCV_FLANN_AUTOTUNED_INDEX_H_ */
...
...
lite.ai.toolkit/include/opencv2/flann/composite_index.h
0 → 100644
查看文件 @
308185e
/***********************************************************************
* Software License Agreement (BSD License)
*
* Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
* Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
*
* THE BSD LICENSE
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************/
#ifndef OPENCV_FLANN_COMPOSITE_INDEX_H_
#define OPENCV_FLANN_COMPOSITE_INDEX_H_
//! @cond IGNORED
#include "nn_index.h"
#include "kdtree_index.h"
#include "kmeans_index.h"
namespace
cvflann
{
/**
* Index parameters for the CompositeIndex.
*/
struct
CompositeIndexParams
:
public
IndexParams
{
CompositeIndexParams
(
int
trees
=
4
,
int
branching
=
32
,
int
iterations
=
11
,
flann_centers_init_t
centers_init
=
FLANN_CENTERS_RANDOM
,
float
cb_index
=
0
.
2
)
{
(
*
this
)[
"algorithm"
]
=
FLANN_INDEX_KMEANS
;
// number of randomized trees to use (for kdtree)
(
*
this
)[
"trees"
]
=
trees
;
// branching factor
(
*
this
)[
"branching"
]
=
branching
;
// max iterations to perform in one kmeans clustering (kmeans tree)
(
*
this
)[
"iterations"
]
=
iterations
;
// algorithm used for picking the initial cluster centers for kmeans tree
(
*
this
)[
"centers_init"
]
=
centers_init
;
// cluster boundary index. Used when searching the kmeans tree
(
*
this
)[
"cb_index"
]
=
cb_index
;
}
};
/**
* This index builds a kd-tree index and a k-means index and performs nearest
* neighbour search both indexes. This gives a slight boost in search performance
* as some of the neighbours that are missed by one index are found by the other.
*/
template
<
typename
Distance
>
class
CompositeIndex
:
public
NNIndex
<
Distance
>
{
public
:
typedef
typename
Distance
::
ElementType
ElementType
;
typedef
typename
Distance
::
ResultType
DistanceType
;
/**
* Index constructor
* @param inputData dataset containing the points to index
* @param params Index parameters
* @param d Distance functor
* @return
*/
CompositeIndex
(
const
Matrix
<
ElementType
>&
inputData
,
const
IndexParams
&
params
=
CompositeIndexParams
(),
Distance
d
=
Distance
())
:
index_params_
(
params
)
{
kdtree_index_
=
new
KDTreeIndex
<
Distance
>
(
inputData
,
params
,
d
);
kmeans_index_
=
new
KMeansIndex
<
Distance
>
(
inputData
,
params
,
d
);
}
CompositeIndex
(
const
CompositeIndex
&
);
CompositeIndex
&
operator
=
(
const
CompositeIndex
&
);
virtual
~
CompositeIndex
()
{
delete
kdtree_index_
;
delete
kmeans_index_
;
}
/**
* @return The index type
*/
flann_algorithm_t
getType
()
const
CV_OVERRIDE
{
return
FLANN_INDEX_COMPOSITE
;
}
/**
* @return Size of the index
*/
size_t
size
()
const
CV_OVERRIDE
{
return
kdtree_index_
->
size
();
}
/**
* \returns The dimensionality of the features in this index.
*/
size_t
veclen
()
const
CV_OVERRIDE
{
return
kdtree_index_
->
veclen
();
}
/**
* \returns The amount of memory (in bytes) used by the index.
*/
int
usedMemory
()
const
CV_OVERRIDE
{
return
kmeans_index_
->
usedMemory
()
+
kdtree_index_
->
usedMemory
();
}
/**
* \brief Builds the index
*/
void
buildIndex
()
CV_OVERRIDE
{
Logger
::
info
(
"Building kmeans tree...
\n
"
);
kmeans_index_
->
buildIndex
();
Logger
::
info
(
"Building kdtree tree...
\n
"
);
kdtree_index_
->
buildIndex
();
}
/**
* \brief Saves the index to a stream
* \param stream The stream to save the index to
*/
void
saveIndex
(
FILE
*
stream
)
CV_OVERRIDE
{
kmeans_index_
->
saveIndex
(
stream
);
kdtree_index_
->
saveIndex
(
stream
);
}
/**
* \brief Loads the index from a stream
* \param stream The stream from which the index is loaded
*/
void
loadIndex
(
FILE
*
stream
)
CV_OVERRIDE
{
kmeans_index_
->
loadIndex
(
stream
);
kdtree_index_
->
loadIndex
(
stream
);
}
/**
* \returns The index parameters
*/
IndexParams
getParameters
()
const
CV_OVERRIDE
{
return
index_params_
;
}
/**
* \brief Method that searches for nearest-neighbours
*/
void
findNeighbors
(
ResultSet
<
DistanceType
>&
result
,
const
ElementType
*
vec
,
const
SearchParams
&
searchParams
)
CV_OVERRIDE
{
kmeans_index_
->
findNeighbors
(
result
,
vec
,
searchParams
);
kdtree_index_
->
findNeighbors
(
result
,
vec
,
searchParams
);
}
private
:
/** The k-means index */
KMeansIndex
<
Distance
>*
kmeans_index_
;
/** The kd-tree index */
KDTreeIndex
<
Distance
>*
kdtree_index_
;
/** The index parameters */
const
IndexParams
index_params_
;
};
}
//! @endcond
#endif //OPENCV_FLANN_COMPOSITE_INDEX_H_
...
...
lite.ai.toolkit/include/opencv2/flann/config.h
0 → 100644
查看文件 @
308185e
/***********************************************************************
* Software License Agreement (BSD License)
*
* Copyright 2008-2011 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
* Copyright 2008-2011 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************/
#ifndef OPENCV_FLANN_CONFIG_H_
#define OPENCV_FLANN_CONFIG_H_
//! @cond IGNORED
#ifdef FLANN_VERSION_
#undef FLANN_VERSION_
#endif
#define FLANN_VERSION_ "1.6.10"
//! @endcond
#endif
/* OPENCV_FLANN_CONFIG_H_ */
...
...
lite.ai.toolkit/include/opencv2/flann/defines.h
0 → 100644
查看文件 @
308185e
/***********************************************************************
* Software License Agreement (BSD License)
*
* Copyright 2008-2011 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
* Copyright 2008-2011 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************/
#ifndef OPENCV_FLANN_DEFINES_H_
#define OPENCV_FLANN_DEFINES_H_
//! @cond IGNORED
#include "config.h"
#ifdef FLANN_EXPORT
#undef FLANN_EXPORT
#endif
#ifdef _WIN32
/* win32 dll export/import directives */
#ifdef FLANN_EXPORTS
#define FLANN_EXPORT __declspec(dllexport)
#elif defined(FLANN_STATIC)
#define FLANN_EXPORT
#else
#define FLANN_EXPORT __declspec(dllimport)
#endif
#else
/* unix needs nothing */
#define FLANN_EXPORT
#endif
#undef FLANN_PLATFORM_32_BIT
#undef FLANN_PLATFORM_64_BIT
#if defined __amd64__ || defined __x86_64__ || defined _WIN64 || defined _M_X64
#define FLANN_PLATFORM_64_BIT
#else
#define FLANN_PLATFORM_32_BIT
#endif
#undef FLANN_ARRAY_LEN
#define FLANN_ARRAY_LEN(a) (sizeof(a)/sizeof(a[0]))
namespace
cvflann
{
/* Nearest neighbour index algorithms */
enum
flann_algorithm_t
{
FLANN_INDEX_LINEAR
=
0
,
FLANN_INDEX_KDTREE
=
1
,
FLANN_INDEX_KMEANS
=
2
,
FLANN_INDEX_COMPOSITE
=
3
,
FLANN_INDEX_KDTREE_SINGLE
=
4
,
FLANN_INDEX_HIERARCHICAL
=
5
,
FLANN_INDEX_LSH
=
6
,
FLANN_INDEX_SAVED
=
254
,
FLANN_INDEX_AUTOTUNED
=
255
,
// deprecated constants, should use the FLANN_INDEX_* ones instead
LINEAR
=
0
,
KDTREE
=
1
,
KMEANS
=
2
,
COMPOSITE
=
3
,
KDTREE_SINGLE
=
4
,
SAVED
=
254
,
AUTOTUNED
=
255
};
enum
flann_centers_init_t
{
FLANN_CENTERS_RANDOM
=
0
,
FLANN_CENTERS_GONZALES
=
1
,
FLANN_CENTERS_KMEANSPP
=
2
,
FLANN_CENTERS_GROUPWISE
=
3
,
// deprecated constants, should use the FLANN_CENTERS_* ones instead
CENTERS_RANDOM
=
0
,
CENTERS_GONZALES
=
1
,
CENTERS_KMEANSPP
=
2
};
enum
flann_log_level_t
{
FLANN_LOG_NONE
=
0
,
FLANN_LOG_FATAL
=
1
,
FLANN_LOG_ERROR
=
2
,
FLANN_LOG_WARN
=
3
,
FLANN_LOG_INFO
=
4
};
enum
flann_distance_t
{
FLANN_DIST_EUCLIDEAN
=
1
,
FLANN_DIST_L2
=
1
,
FLANN_DIST_MANHATTAN
=
2
,
FLANN_DIST_L1
=
2
,
FLANN_DIST_MINKOWSKI
=
3
,
FLANN_DIST_MAX
=
4
,
FLANN_DIST_HIST_INTERSECT
=
5
,
FLANN_DIST_HELLINGER
=
6
,
FLANN_DIST_CHI_SQUARE
=
7
,
FLANN_DIST_CS
=
7
,
FLANN_DIST_KULLBACK_LEIBLER
=
8
,
FLANN_DIST_KL
=
8
,
FLANN_DIST_HAMMING
=
9
,
FLANN_DIST_DNAMMING
=
10
,
// deprecated constants, should use the FLANN_DIST_* ones instead
EUCLIDEAN
=
1
,
MANHATTAN
=
2
,
MINKOWSKI
=
3
,
MAX_DIST
=
4
,
HIST_INTERSECT
=
5
,
HELLINGER
=
6
,
CS
=
7
,
KL
=
8
,
KULLBACK_LEIBLER
=
8
};
enum
flann_datatype_t
{
FLANN_INT8
=
0
,
FLANN_INT16
=
1
,
FLANN_INT32
=
2
,
FLANN_INT64
=
3
,
FLANN_UINT8
=
4
,
FLANN_UINT16
=
5
,
FLANN_UINT32
=
6
,
FLANN_UINT64
=
7
,
FLANN_FLOAT32
=
8
,
FLANN_FLOAT64
=
9
};
enum
{
FLANN_CHECKS_UNLIMITED
=
-
1
,
FLANN_CHECKS_AUTOTUNED
=
-
2
};
}
//! @endcond
#endif
/* OPENCV_FLANN_DEFINES_H_ */
...
...
请
注册
或
登录
后发表评论