Open Source Computer Vision Library
https://opencv.org/
222 lines
5.6 KiB
222 lines
5.6 KiB
/*********************************************************************** |
|
* 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. |
|
*************************************************************************/ |
|
|
|
#include <cstdio> |
|
#include <cstdarg> |
|
#include <sstream> |
|
|
|
#include "opencv2/flann/dist.h" |
|
#include "opencv2/flann/index_testing.h" |
|
#include "opencv2/flann/logger.h" |
|
#include "opencv2/flann/logger.h" |
|
#include "opencv2/flann/saving.h" |
|
#include "opencv2/flann/general.h" |
|
|
|
// index types |
|
#include "opencv2/flann/all_indices.h" |
|
|
|
namespace cvflann |
|
{ |
|
// ----------------------- dist.cpp --------------------------- |
|
|
|
/** Global variable indicating the distance metric |
|
* to be used. |
|
*/ |
|
flann_distance_t flann_distance_type = EUCLIDEAN; |
|
|
|
/** |
|
* Zero iterator that emulates a zero feature. |
|
*/ |
|
ZeroIterator<float> zero; |
|
|
|
/** |
|
* Order of Minkowski distance to use. |
|
*/ |
|
int flann_minkowski_order; |
|
|
|
|
|
double euclidean_dist(const unsigned char* first1, const unsigned char* last1, unsigned char* first2, double acc) |
|
{ |
|
double distsq = acc; |
|
double diff0, diff1, diff2, diff3; |
|
const unsigned char* lastgroup = last1 - 3; |
|
|
|
while (first1 < lastgroup) { |
|
diff0 = first1[0] - first2[0]; |
|
diff1 = first1[1] - first2[1]; |
|
diff2 = first1[2] - first2[2]; |
|
diff3 = first1[3] - first2[3]; |
|
distsq += diff0 * diff0 + diff1 * diff1 + diff2 * diff2 + diff3 * diff3; |
|
first1 += 4; |
|
first2 += 4; |
|
} |
|
while (first1 < last1) { |
|
diff0 = *first1++ - *first2++; |
|
distsq += diff0 * diff0; |
|
} |
|
return distsq; |
|
} |
|
|
|
// ----------------------- index_testing.cpp --------------------------- |
|
|
|
int countCorrectMatches(int* neighbors, int* groundTruth, int n) |
|
{ |
|
int count = 0; |
|
for (int i=0;i<n;++i) { |
|
for (int k=0;k<n;++k) { |
|
if (neighbors[i]==groundTruth[k]) { |
|
count++; |
|
break; |
|
} |
|
} |
|
} |
|
return count; |
|
} |
|
|
|
// ----------------------- logger.cpp --------------------------- |
|
|
|
Logger logger; |
|
|
|
int Logger::log(int level, const char* fmt, ...) |
|
{ |
|
if (level > logLevel ) return -1; |
|
|
|
int ret; |
|
va_list arglist; |
|
va_start(arglist, fmt); |
|
ret = vfprintf(stream, fmt, arglist); |
|
va_end(arglist); |
|
|
|
return ret; |
|
} |
|
|
|
int Logger::log(int level, const char* fmt, va_list arglist) |
|
{ |
|
if (level > logLevel ) return -1; |
|
|
|
int ret; |
|
ret = vfprintf(stream, fmt, arglist); |
|
|
|
return ret; |
|
} |
|
|
|
|
|
#define LOG_METHOD(NAME,LEVEL) \ |
|
int Logger::NAME(const char* fmt, ...) \ |
|
{ \ |
|
int ret; \ |
|
va_list ap; \ |
|
va_start(ap, fmt); \ |
|
ret = log(LEVEL, fmt, ap); \ |
|
va_end(ap); \ |
|
return ret; \ |
|
} |
|
|
|
|
|
LOG_METHOD(fatal, LOG_FATAL) |
|
LOG_METHOD(error, LOG_ERROR) |
|
LOG_METHOD(warn, LOG_WARN) |
|
LOG_METHOD(info, LOG_INFO) |
|
|
|
// ----------------------- random.cpp --------------------------- |
|
|
|
void seed_random(unsigned int seed) |
|
{ |
|
srand(seed); |
|
} |
|
|
|
double rand_double(double high, double low) |
|
{ |
|
return low + ((high-low) * (std::rand() / (RAND_MAX + 1.0))); |
|
} |
|
|
|
|
|
int rand_int(int high, int low) |
|
{ |
|
return low + (int) ( double(high-low) * (std::rand() / (RAND_MAX + 1.0))); |
|
} |
|
|
|
// ----------------------- saving.cpp --------------------------- |
|
|
|
const char FLANN_SIGNATURE[] = "FLANN_INDEX"; |
|
const char FLANN_VERSION[] = "1.5.0"; |
|
|
|
|
|
IndexHeader load_header(FILE* stream) |
|
{ |
|
IndexHeader header; |
|
int read_size = fread(&header,sizeof(header),1,stream); |
|
|
|
if (read_size!=1) { |
|
throw FLANNException("Invalid index file, cannot read"); |
|
} |
|
|
|
if (strcmp(header.signature,FLANN_SIGNATURE)!=0) { |
|
throw FLANNException("Invalid index file, wrong signature"); |
|
} |
|
|
|
return header; |
|
|
|
} |
|
|
|
// ----------------------- flann.cpp --------------------------- |
|
|
|
|
|
void log_verbosity(int level) |
|
{ |
|
if (level>=0) { |
|
logger.setLevel(level); |
|
} |
|
} |
|
|
|
void set_distance_type(flann_distance_t distance_type, int order) |
|
{ |
|
flann_distance_type = distance_type; |
|
flann_minkowski_order = order; |
|
} |
|
|
|
class StaticInit |
|
{ |
|
public: |
|
StaticInit() |
|
{ |
|
ParamsFactory::instance().register_<LinearIndexParams>(LINEAR); |
|
ParamsFactory::instance().register_<KDTreeIndexParams>(KDTREE); |
|
ParamsFactory::instance().register_<KMeansIndexParams>(KMEANS); |
|
ParamsFactory::instance().register_<CompositeIndexParams>(COMPOSITE); |
|
ParamsFactory::instance().register_<AutotunedIndexParams>(AUTOTUNED); |
|
// ParamsFactory::instance().register_<SavedIndexParams>(SAVED); |
|
} |
|
}; |
|
StaticInit __init; |
|
|
|
|
|
} // namespace cvflann |
|
|
|
|
|
|
|
|