parent
e39065bf77
commit
9a52f4626b
19 changed files with 2802 additions and 3254 deletions
@ -1,101 +0,0 @@ |
||||
/*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) 2014, Mohammad Norouzi, Ali Punjani, David J. Fleet,
|
||||
// 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_ARRAY32_HPP |
||||
#define __OPENCV_ARRAY32_HPP |
||||
|
||||
#ifdef _WIN32 |
||||
#pragma warning( disable : 4267 ) |
||||
#endif |
||||
|
||||
#include "types.hpp" |
||||
|
||||
class Array32 |
||||
{ |
||||
|
||||
private: |
||||
static double ARRAY_RESIZE_FACTOR; |
||||
static double ARRAY_RESIZE_ADD_FACTOR; |
||||
|
||||
public: |
||||
/* set ARRAY_RESIZE_FACTOR */ |
||||
static void setArrayResizeFactor( double arf ); |
||||
|
||||
/* constructor */ |
||||
Array32(); |
||||
|
||||
/* destructor */ |
||||
~Array32(); |
||||
|
||||
/* cleaning function used in destructor */ |
||||
void cleanup(); |
||||
|
||||
/* push data */ |
||||
void push( UINT32 data ); |
||||
|
||||
/* insert data at given index */ |
||||
void insert( UINT32 index, UINT32 data ); |
||||
|
||||
/* return data */ |
||||
UINT32* data(); |
||||
|
||||
/* return data size */ |
||||
UINT32 size(); |
||||
|
||||
/* return capacity */ |
||||
UINT32 capacity(); |
||||
|
||||
/* definition of operator = */ |
||||
void operator=( const Array32& ); |
||||
|
||||
/* print data */ |
||||
void print(); |
||||
|
||||
/* initializer */ |
||||
void init( int size ); |
||||
|
||||
/* data */ |
||||
UINT32 *arr; |
||||
|
||||
}; |
||||
|
||||
#endif |
@ -1,76 +0,0 @@ |
||||
/*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) 2014, Mohammad Norouzi, Ali Punjani, David J. Fleet,
|
||||
// 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_BUCKET_GROUP_HPP |
||||
#define __OPENCV_BUCKET_GROUP_HPP |
||||
|
||||
#ifdef _WIN32 |
||||
#pragma warning( disable : 4267 ) |
||||
#endif |
||||
|
||||
#include "types.hpp" |
||||
#include "array32.hpp" |
||||
#include "bitarray.hpp" |
||||
|
||||
class BucketGroup |
||||
{ |
||||
|
||||
public: |
||||
/* constructor */ |
||||
BucketGroup(); |
||||
|
||||
/* destructor */ |
||||
~BucketGroup(); |
||||
|
||||
/* insert data into the bucket */ |
||||
void insert( int subindex, UINT32 data ); |
||||
|
||||
/* perform a query to the bucket */ |
||||
UINT32* query( int subindex, int *size ); |
||||
|
||||
/* data fields */ |
||||
UINT32 empty; |
||||
Array32 *group; |
||||
|
||||
}; |
||||
|
||||
#endif |
File diff suppressed because it is too large
Load Diff
@ -1,476 +0,0 @@ |
||||
/*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) 2011-2012, Lilian Zhang, all rights reserved. |
||||
Copyright (C) 2013, Manuele Tamburrano, Stefano Fabri, all rights reserved. |
||||
Copyright (C) 2014, Biagio Montesano, 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: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* 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. |
||||
|
||||
* 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. |
||||
*/ |
||||
|
||||
#ifndef __OPENCV_ED_LINE_DETECTOR_HH_ |
||||
#define __OPENCV_ED_LINE_DETECTOR_HH_ |
||||
|
||||
#ifdef _WIN32 |
||||
#pragma warning( disable : 4267 ) |
||||
#endif |
||||
|
||||
#include <vector> |
||||
#include <iostream> |
||||
#include <list> |
||||
#include <opencv2/core.hpp> |
||||
#include <opencv2/features2d.hpp> |
||||
#include <opencv2/imgproc.hpp> |
||||
#include <opencv2/highgui.hpp> |
||||
#include <opencv2/core/utility.hpp> |
||||
|
||||
struct Pixel |
||||
{ |
||||
unsigned int x; //X coordinate
|
||||
unsigned int y; //Y coordinate
|
||||
}; |
||||
struct EdgeChains |
||||
{ |
||||
std::vector<unsigned int> xCors; //all the x coordinates of edge points
|
||||
std::vector<unsigned int> yCors; //all the y coordinates of edge points
|
||||
std::vector<unsigned int> sId; //the start index of each edge in the coordinate arrays
|
||||
unsigned int numOfEdges; //the number of edges whose length are larger than minLineLen; numOfEdges < sId.size;
|
||||
}; |
||||
|
||||
struct LineChains |
||||
{ |
||||
std::vector<unsigned int> xCors; //all the x coordinates of line points
|
||||
std::vector<unsigned int> yCors; //all the y coordinates of line points
|
||||
std::vector<unsigned int> sId; //the start index of each line in the coordinate arrays
|
||||
unsigned int numOfLines; //the number of lines whose length are larger than minLineLen; numOfLines < sId.size;
|
||||
}; |
||||
|
||||
typedef std::list<Pixel> PixelChain; //each edge is a pixel chain
|
||||
|
||||
struct EDLineParam |
||||
{ |
||||
int ksize; |
||||
float sigma; |
||||
float gradientThreshold; |
||||
float anchorThreshold; |
||||
int scanIntervals; |
||||
int minLineLen; |
||||
double lineFitErrThreshold; |
||||
}; |
||||
|
||||
#define RELATIVE_ERROR_FACTOR 100.0 |
||||
#define MLN10 2.30258509299404568402 |
||||
#define log_gamma(x) ((x)>15.0?log_gamma_windschitl(x):log_gamma_lanczos(x)) |
||||
|
||||
/* This class is used to detect lines from input image.
|
||||
* First, edges are extracted from input image following the method presented in Cihan Topal and |
||||
* Cuneyt Akinlar's paper:"Edge Drawing: A Heuristic Approach to Robust Real-Time Edge Detection", 2010. |
||||
* Then, lines are extracted from the edge image following the method presented in Cuneyt Akinlar and |
||||
* Cihan Topal's paper:"EDLines: A real-time line segment detector with a false detection control", 2011 |
||||
* PS: The linking step of edge detection has a little bit difference with the Edge drawing algorithm |
||||
* described in the paper. The edge chain doesn't stop when the pixel direction is changed. |
||||
*/ |
||||
class EDLineDetector |
||||
{ |
||||
public: |
||||
EDLineDetector(); |
||||
EDLineDetector( EDLineParam param ); |
||||
~EDLineDetector(); |
||||
|
||||
/*extract edges from image
|
||||
*image: In, gray image; |
||||
*edges: Out, store the edges, each edge is a pixel chain |
||||
*return -1: error happen |
||||
*/ |
||||
int EdgeDrawing( cv::Mat &image, EdgeChains &edgeChains ); |
||||
|
||||
/*extract lines from image
|
||||
*image: In, gray image; |
||||
*lines: Out, store the extracted lines, |
||||
*return -1: error happen |
||||
*/ |
||||
int EDline( cv::Mat &image, LineChains &lines ); |
||||
|
||||
/* extract line from image, and store them */ |
||||
int EDline( cv::Mat &image ); |
||||
|
||||
cv::Mat dxImg_; //store the dxImg;
|
||||
|
||||
cv::Mat dyImg_; //store the dyImg;
|
||||
|
||||
cv::Mat gImgWO_; //store the gradient image without threshold;
|
||||
|
||||
LineChains lines_; //store the detected line chains;
|
||||
|
||||
//store the line Equation coefficients, vec3=[w1,w2,w3] for line w1*x + w2*y + w3=0;
|
||||
std::vector<std::vector<double> > lineEquations_; |
||||
|
||||
//store the line endpoints, [x1,y1,x2,y3]
|
||||
std::vector<std::vector<float> > lineEndpoints_; |
||||
|
||||
//store the line direction
|
||||
std::vector<float> lineDirection_; |
||||
|
||||
//store the line salience, which is the summation of gradients of pixels on line
|
||||
std::vector<float> lineSalience_; |
||||
|
||||
// image sizes
|
||||
unsigned int imageWidth; |
||||
unsigned int imageHeight; |
||||
|
||||
/*The threshold of line fit error;
|
||||
*If lineFitErr is large than this threshold, then |
||||
*the pixel chain is not accepted as a single line segment.*/ |
||||
double lineFitErrThreshold_; |
||||
|
||||
/*the threshold of pixel gradient magnitude.
|
||||
*Only those pixel whose gradient magnitude are larger than this threshold will be |
||||
*taken as possible edge points. Default value is 36*/ |
||||
short gradienThreshold_; |
||||
|
||||
/*If the pixel's gradient value is bigger than both of its neighbors by a
|
||||
*certain threshold (ANCHOR_THRESHOLD), the pixel is marked to be an anchor. |
||||
*Default value is 8*/ |
||||
unsigned char anchorThreshold_; |
||||
|
||||
/*anchor testing can be performed at different scan intervals, i.e.,
|
||||
*every row/column, every second row/column etc. |
||||
*Default value is 2*/ |
||||
unsigned int scanIntervals_; |
||||
|
||||
int minLineLen_; //minimal acceptable line length
|
||||
|
||||
private: |
||||
void InitEDLine_(); |
||||
|
||||
/*For an input edge chain, find the best fit line, the default chain length is minLineLen_
|
||||
*xCors: In, pointer to the X coordinates of pixel chain; |
||||
*yCors: In, pointer to the Y coordinates of pixel chain; |
||||
*offsetS:In, start index of this chain in vector; |
||||
*lineEquation: Out, [a,b] which are the coefficient of lines y=ax+b(horizontal) or x=ay+b(vertical); |
||||
*return: line fit error; -1:error happens; |
||||
*/ |
||||
double LeastSquaresLineFit_( unsigned int *xCors, unsigned int *yCors, unsigned int offsetS, std::vector<double> &lineEquation ); |
||||
|
||||
/*For an input pixel chain, find the best fit line. Only do the update based on new points.
|
||||
*For A*x=v, Least square estimation of x = Inv(A^T * A) * (A^T * v); |
||||
*If some new observations are added, i.e, [A; A'] * x = [v; v'], |
||||
*then x' = Inv(A^T * A + (A')^T * A') * (A^T * v + (A')^T * v'); |
||||
*xCors: In, pointer to the X coordinates of pixel chain; |
||||
*yCors: In, pointer to the Y coordinates of pixel chain; |
||||
*offsetS:In, start index of this chain in vector; |
||||
*newOffsetS: In, start index of extended part; |
||||
*offsetE:In, end index of this chain in vector; |
||||
*lineEquation: Out, [a,b] which are the coefficient of lines y=ax+b(horizontal) or x=ay+b(vertical); |
||||
*return: line fit error; -1:error happens; |
||||
*/ |
||||
double LeastSquaresLineFit_( unsigned int *xCors, unsigned int *yCors, unsigned int offsetS, unsigned int newOffsetS, unsigned int offsetE, |
||||
std::vector<double> &lineEquation ); |
||||
|
||||
/* Validate line based on the Helmholtz principle, which basically states that
|
||||
* for a structure to be perceptually meaningful, the expectation of this structure |
||||
* by chance must be very low. |
||||
*/ |
||||
bool LineValidation_( unsigned int *xCors, unsigned int *yCors, unsigned int offsetS, unsigned int offsetE, std::vector<double> &lineEquation, |
||||
float &direction ); |
||||
|
||||
bool bValidate_; //flag to decide whether line will be validated
|
||||
|
||||
int ksize_; //the size of Gaussian kernel: ksize X ksize, default value is 5.
|
||||
|
||||
float sigma_; //the sigma of Gaussian kernal, default value is 1.0.
|
||||
|
||||
/*For example, there two edges in the image:
|
||||
*edge1 = [(7,4), (8,5), (9,6),| (10,7)|, (11, 8), (12,9)] and |
||||
*edge2 = [(14,9), (15,10), (16,11), (17,12),| (18, 13)|, (19,14)] ; then we store them as following: |
||||
*pFirstPartEdgeX_ = [10, 11, 12, 18, 19];//store the first part of each edge[from middle to end]
|
||||
*pFirstPartEdgeY_ = [7, 8, 9, 13, 14]; |
||||
*pFirstPartEdgeS_ = [0,3,5];// the index of start point of first part of each edge
|
||||
*pSecondPartEdgeX_ = [10, 9, 8, 7, 18, 17, 16, 15, 14];//store the second part of each edge[from middle to front]
|
||||
*pSecondPartEdgeY_ = [7, 6, 5, 4, 13, 12, 11, 10, 9];//anchor points(10, 7) and (18, 13) are stored again
|
||||
*pSecondPartEdgeS_ = [0, 4, 9];// the index of start point of second part of each edge
|
||||
*This type of storage order is because of the order of edge detection process. |
||||
*For each edge, start from one anchor point, first go right, then go left or first go down, then go up*/ |
||||
|
||||
//store the X coordinates of the first part of the pixels for chains
|
||||
unsigned int *pFirstPartEdgeX_; |
||||
|
||||
//store the Y coordinates of the first part of the pixels for chains
|
||||
unsigned int *pFirstPartEdgeY_; |
||||
|
||||
//store the start index of every edge chain in the first part arrays
|
||||
unsigned int *pFirstPartEdgeS_; |
||||
|
||||
//store the X coordinates of the second part of the pixels for chains
|
||||
unsigned int *pSecondPartEdgeX_; |
||||
|
||||
//store the Y coordinates of the second part of the pixels for chains
|
||||
unsigned int *pSecondPartEdgeY_; |
||||
|
||||
//store the start index of every edge chain in the second part arrays
|
||||
unsigned int *pSecondPartEdgeS_; |
||||
|
||||
//store the X coordinates of anchors
|
||||
unsigned int *pAnchorX_; |
||||
|
||||
//store the Y coordinates of anchors
|
||||
unsigned int *pAnchorY_; |
||||
|
||||
//edges
|
||||
cv::Mat edgeImage_; |
||||
|
||||
cv::Mat gImg_; //store the gradient image;
|
||||
|
||||
cv::Mat dirImg_; //store the direction image
|
||||
|
||||
double logNT_; |
||||
|
||||
cv::Mat_<float> ATA; //the previous matrix of A^T * A;
|
||||
|
||||
cv::Mat_<float> ATV; //the previous vector of A^T * V;
|
||||
|
||||
cv::Mat_<float> fitMatT; //the matrix used in line fit function;
|
||||
|
||||
cv::Mat_<float> fitVec; //the vector used in line fit function;
|
||||
|
||||
cv::Mat_<float> tempMatLineFit; //the matrix used in line fit function;
|
||||
|
||||
cv::Mat_<float> tempVecLineFit; //the vector used in line fit function;
|
||||
|
||||
/** Compare doubles by relative error.
|
||||
The resulting rounding error after floating point computations |
||||
depend on the specific operations done. The same number computed by |
||||
different algorithms could present different rounding errors. For a |
||||
useful comparison, an estimation of the relative rounding error |
||||
should be considered and compared to a factor times EPS. The factor |
||||
should be related to the accumulated rounding error in the chain of |
||||
computation. Here, as a simplification, a fixed factor is used. |
||||
*/ |
||||
static int double_equal( double a, double b ) |
||||
{ |
||||
double abs_diff, aa, bb, abs_max; |
||||
/* trivial case */ |
||||
if( a == b ) |
||||
return true; |
||||
abs_diff = fabs( a - b ); |
||||
aa = fabs( a ); |
||||
bb = fabs( b ); |
||||
abs_max = aa > bb ? aa : bb; |
||||
|
||||
/* DBL_MIN is the smallest normalized number, thus, the smallest
|
||||
number whose relative error is bounded by DBL_EPSILON. For |
||||
smaller numbers, the same quantization steps as for DBL_MIN |
||||
are used. Then, for smaller numbers, a meaningful "relative" |
||||
error should be computed by dividing the difference by DBL_MIN. */ |
||||
if( abs_max < DBL_MIN ) |
||||
abs_max = DBL_MIN; |
||||
|
||||
/* equal if relative error <= factor x eps */ |
||||
return ( abs_diff / abs_max ) <= ( RELATIVE_ERROR_FACTOR * DBL_EPSILON ); |
||||
} |
||||
|
||||
/** Computes the natural logarithm of the absolute value of
|
||||
the gamma function of x using the Lanczos approximation. |
||||
See http://www.rskey.org/gamma.htm
|
||||
The formula used is |
||||
@f[ |
||||
\Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) } |
||||
(x+5.5)^{x+0.5} e^{-(x+5.5)} |
||||
@f] |
||||
so |
||||
@f[ |
||||
\log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right) |
||||
+ (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n) |
||||
@f] |
||||
and |
||||
q0 = 75122.6331530, |
||||
q1 = 80916.6278952, |
||||
q2 = 36308.2951477, |
||||
q3 = 8687.24529705, |
||||
q4 = 1168.92649479, |
||||
q5 = 83.8676043424, |
||||
q6 = 2.50662827511. |
||||
*/ |
||||
static double log_gamma_lanczos( double x ) |
||||
{ |
||||
static double q[7] = |
||||
{ 75122.6331530, 80916.6278952, 36308.2951477, 8687.24529705, 1168.92649479, 83.8676043424, 2.50662827511 }; |
||||
double a = ( x + 0.5 ) * log( x + 5.5 ) - ( x + 5.5 ); |
||||
double b = 0.0; |
||||
int n; |
||||
for ( n = 0; n < 7; n++ ) |
||||
{ |
||||
a -= log( x + (double) n ); |
||||
b += q[n] * pow( x, (double) n ); |
||||
} |
||||
return a + log( b ); |
||||
} |
||||
|
||||
/** Computes the natural logarithm of the absolute value of
|
||||
the gamma function of x using Windschitl method. |
||||
See http://www.rskey.org/gamma.htm
|
||||
The formula used is |
||||
@f[ |
||||
\Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e} |
||||
\sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x |
||||
@f] |
||||
so |
||||
@f[ |
||||
\log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x |
||||
+ 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right). |
||||
@f] |
||||
This formula is a good approximation when x > 15. |
||||
*/ |
||||
static double log_gamma_windschitl( double x ) |
||||
{ |
||||
return 0.918938533204673 + ( x - 0.5 ) * log( x ) - x + 0.5 * x * log( x * sinh( 1 / x ) + 1 / ( 810.0 * pow( x, 6.0 ) ) ); |
||||
} |
||||
|
||||
/** Computes -log10(NFA).
|
||||
NFA stands for Number of False Alarms: |
||||
@f[ |
||||
\mathrm{NFA} = NT \cdot B(n,k,p) |
||||
@f] |
||||
- NT - number of tests |
||||
- B(n,k,p) - tail of binomial distribution with parameters n,k and p: |
||||
@f[ |
||||
B(n,k,p) = \sum_{j=k}^n |
||||
\left(\begin{array}{c}n\\j\end{array}\right) |
||||
p^{j} (1-p)^{n-j} |
||||
@f] |
||||
The value -log10(NFA) is equivalent but more intuitive than NFA: |
||||
- -1 corresponds to 10 mean false alarms |
||||
- 0 corresponds to 1 mean false alarm |
||||
- 1 corresponds to 0.1 mean false alarms |
||||
- 2 corresponds to 0.01 mean false alarms |
||||
- ... |
||||
Used this way, the bigger the value, better the detection, |
||||
and a logarithmic scale is used. |
||||
@param n,k,p binomial parameters. |
||||
@param logNT logarithm of Number of Tests |
||||
The computation is based in the gamma function by the following |
||||
relation: |
||||
@f[ |
||||
\left(\begin{array}{c}n\\k\end{array}\right) |
||||
= \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }. |
||||
@f] |
||||
We use efficient algorithms to compute the logarithm of |
||||
the gamma function. |
||||
To make the computation faster, not all the sum is computed, part |
||||
of the terms are neglected based on a bound to the error obtained |
||||
(an error of 10% in the result is accepted). |
||||
*/ |
||||
static double nfa( int n, int k, double p, double logNT ) |
||||
{ |
||||
double tolerance = 0.1; /* an error of 10% in the result is accepted */ |
||||
double log1term, term, bin_term, mult_term, bin_tail, err, p_term; |
||||
int i; |
||||
|
||||
/* check parameters */ |
||||
if( n < 0 || k < 0 || k > n || p <= 0.0 || p >= 1.0 ) |
||||
{ |
||||
std::cout << "nfa: wrong n, k or p values." << std::endl; |
||||
exit( 0 ); |
||||
} |
||||
/* trivial cases */ |
||||
if( n == 0 || k == 0 ) |
||||
return -logNT; |
||||
if( n == k ) |
||||
return -logNT - (double) n * log10( p ); |
||||
|
||||
/* probability term */ |
||||
p_term = p / ( 1.0 - p ); |
||||
|
||||
/* compute the first term of the series */ |
||||
/*
|
||||
binomial_tail(n,k,p) = sum_{i=k}^n bincoef(n,i) * p^i * (1-p)^{n-i} |
||||
where bincoef(n,i) are the binomial coefficients. |
||||
But |
||||
bincoef(n,k) = gamma(n+1) / ( gamma(k+1) * gamma(n-k+1) ). |
||||
We use this to compute the first term. Actually the log of it. |
||||
*/ |
||||
log1term = log_gamma( (double) n + 1.0 ) - log_gamma( (double ) k + 1.0 ) - log_gamma( (double ) ( n - k ) + 1.0 ) + (double) k * log( p ) |
||||
+ (double) ( n - k ) * log( 1.0 - p ); |
||||
term = exp( log1term ); |
||||
|
||||
/* in some cases no more computations are needed */ |
||||
if( double_equal( term, 0.0 ) ) |
||||
{ /* the first term is almost zero */ |
||||
if( (double) k > (double) n * p ) /* at begin or end of the tail? */ |
||||
return -log1term / MLN10 - logNT; /* end: use just the first term */ |
||||
else |
||||
return -logNT; /* begin: the tail is roughly 1 */ |
||||
} |
||||
|
||||
/* compute more terms if needed */ |
||||
bin_tail = term; |
||||
for ( i = k + 1; i <= n; i++ ) |
||||
{ |
||||
/* As
|
||||
term_i = bincoef(n,i) * p^i * (1-p)^(n-i) |
||||
and |
||||
bincoef(n,i)/bincoef(n,i-1) = n-i+1 / i, |
||||
then, |
||||
term_i / term_i-1 = (n-i+1)/i * p/(1-p) |
||||
and |
||||
term_i = term_i-1 * (n-i+1)/i * p/(1-p). |
||||
p/(1-p) is computed only once and stored in 'p_term'. |
||||
*/ |
||||
bin_term = (double) ( n - i + 1 ) / (double) i; |
||||
mult_term = bin_term * p_term; |
||||
term *= mult_term; |
||||
bin_tail += term; |
||||
if( bin_term < 1.0 ) |
||||
{ |
||||
/* When bin_term<1 then mult_term_j<mult_term_i for j>i.
|
||||
Then, the error on the binomial tail when truncated at |
||||
the i term can be bounded by a geometric series of form |
||||
term_i * sum mult_term_i^j. */ |
||||
err = term * ( ( 1.0 - pow( mult_term, (double) ( n - i + 1 ) ) ) / ( 1.0 - mult_term ) - 1.0 ); |
||||
/* One wants an error at most of tolerance*final_result, or:
|
||||
tolerance * abs(-log10(bin_tail)-logNT). |
||||
Now, the error that can be accepted on bin_tail is |
||||
given by tolerance*final_result divided by the derivative |
||||
of -log10(x) when x=bin_tail. that is: |
||||
tolerance * abs(-log10(bin_tail)-logNT) / (1/bin_tail) |
||||
Finally, we truncate the tail if the error is less than: |
||||
tolerance * abs(-log10(bin_tail)-logNT) * bin_tail */ |
||||
if( err < tolerance * fabs( -log10( bin_tail ) - logNT ) * bin_tail ) |
||||
break; |
||||
} |
||||
} |
||||
return -log10( bin_tail ) - logNT; |
||||
} |
||||
}; |
||||
|
||||
#endif /* EDLINEDETECTOR_HH_ */ |
@ -1,123 +0,0 @@ |
||||
/*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) 2011-2012, Lilian Zhang, all rights reserved. |
||||
Copyright (C) 2013, Manuele Tamburrano, Stefano Fabri, all rights reserved. |
||||
Copyright (C) 2014, Biagio Montesano, 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: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* 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. |
||||
|
||||
* 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. |
||||
*/ |
||||
|
||||
#ifndef __OPENCV_LINE_STRUCTURE_HH_ |
||||
#define __OPENCV_LINE_STRUCTURE_HH_ |
||||
|
||||
#include <vector> |
||||
|
||||
/* struct to represent lines extracted from an octave */ |
||||
struct OctaveLine |
||||
{ |
||||
unsigned int octaveCount; //the octave which this line is detected
|
||||
unsigned int lineIDInOctave; //the line ID in that octave image
|
||||
unsigned int lineIDInScaleLineVec; //the line ID in Scale line vector
|
||||
float lineLength; //the length of line in original image scale
|
||||
}; |
||||
|
||||
// A 2D line (normal equation parameters).
|
||||
struct SingleLine |
||||
{ |
||||
//note: rho and theta are based on coordinate origin, i.e. the top-left corner of image
|
||||
double rho; //unit: pixel length
|
||||
double theta; //unit: rad
|
||||
double linePointX; // = rho * cos(theta);
|
||||
double linePointY; // = rho * sin(theta);
|
||||
//for EndPoints, the coordinate origin is the top-left corner of image.
|
||||
double startPointX; |
||||
double startPointY; |
||||
double endPointX; |
||||
double endPointY; |
||||
//direction of a line, the angle between positive line direction (dark side is in the left) and positive X axis.
|
||||
double direction; |
||||
//mean gradient magnitude
|
||||
double gradientMagnitude; |
||||
//mean gray value of pixels in dark side of line
|
||||
double darkSideGrayValue; |
||||
//mean gray value of pixels in light side of line
|
||||
double lightSideGrayValue; |
||||
//the length of line
|
||||
double lineLength; |
||||
//the width of line;
|
||||
double width; |
||||
//number of pixels
|
||||
int numOfPixels; |
||||
//the decriptor of line
|
||||
std::vector<double> descriptor; |
||||
}; |
||||
|
||||
// Specifies a vector of lines.
|
||||
typedef std::vector<SingleLine> Lines_list; |
||||
|
||||
struct OctaveSingleLine |
||||
{ |
||||
/*endPoints, the coordinate origin is the top-left corner of the original image.
|
||||
*startPointX = sPointInOctaveX * (factor)^octaveCount; */ |
||||
float startPointX; |
||||
float startPointY; |
||||
float endPointX; |
||||
float endPointY; |
||||
//endPoints, the coordinate origin is the top-left corner of the octave image.
|
||||
float sPointInOctaveX; |
||||
float sPointInOctaveY; |
||||
float ePointInOctaveX; |
||||
float ePointInOctaveY; |
||||
//direction of a line, the angle between positive line direction (dark side is in the left) and positive X axis.
|
||||
float direction; |
||||
//the summation of gradient magnitudes of pixels on lines
|
||||
float salience; |
||||
//the length of line
|
||||
float lineLength; |
||||
//number of pixels
|
||||
unsigned int numOfPixels; |
||||
//the octave which this line is detected
|
||||
unsigned int octaveCount; |
||||
//the decriptor of line
|
||||
std::vector<float> descriptor; |
||||
}; |
||||
|
||||
// Specifies a vector of lines.
|
||||
typedef std::vector<OctaveSingleLine> LinesVec; |
||||
|
||||
// each element in ScaleLines is a vector of lines
|
||||
// which corresponds the same line detected in different octave images.
|
||||
typedef std::vector<LinesVec> ScaleLines; |
||||
|
||||
#endif |
@ -1,130 +0,0 @@ |
||||
/*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) 2014, Mohammad Norouzi, Ali Punjani, David J. Fleet,
|
||||
// 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_MIHASHER_HPP |
||||
#define __OPENCV_MIHASHER_HPP |
||||
|
||||
#ifdef _WIN32 |
||||
#pragma warning( disable : 4267 ) |
||||
#endif |
||||
|
||||
#include "types.hpp" |
||||
#include "bitops.hpp" |
||||
#include "sparse_hashtable.hpp" |
||||
#include "bitarray.hpp" |
||||
|
||||
#include <opencv2/core.hpp> |
||||
#include <opencv2/imgproc.hpp> |
||||
|
||||
class Mihasher |
||||
{ |
||||
private: |
||||
|
||||
/* Bits per code */ |
||||
int B; |
||||
|
||||
/* B/8 */ |
||||
int B_over_8; |
||||
|
||||
/* Bits per chunk (must be less than 64) */ |
||||
int b; |
||||
|
||||
/* Number of chunks */ |
||||
int m; |
||||
|
||||
/* Number of chunks with b bits (have 1 bit more than others) */ |
||||
int mplus; |
||||
|
||||
/* Maximum hamming search radius (we use B/2 by default) */ |
||||
int D; |
||||
|
||||
/* Maximum hamming search radius per substring */ |
||||
int d; |
||||
|
||||
/* Maximum results to return */ |
||||
int K; |
||||
|
||||
/* Number of codes */ |
||||
UINT64 N; |
||||
|
||||
/* Table of original full-length codes */ |
||||
cv::Mat codes; |
||||
|
||||
/* Counter for eliminating duplicate results (it is not thread safe) */ |
||||
bitarray *counter; |
||||
|
||||
/* Array of m hashtables */ |
||||
SparseHashtable *H; |
||||
|
||||
/* Volume of a b-bit Hamming ball with radius s (for s = 0 to d) */ |
||||
UINT32 *xornum; |
||||
|
||||
/* Used within generation of binary codes at a certain Hamming distance */ |
||||
int power[100]; |
||||
|
||||
public: |
||||
|
||||
/* constructor */ |
||||
Mihasher(); |
||||
|
||||
/* desctructor */ |
||||
~Mihasher(); |
||||
|
||||
/* constructor 2 */ |
||||
Mihasher( int B, int m ); |
||||
|
||||
/* K setter */ |
||||
void setK( int K ); |
||||
|
||||
/* populate tables */ |
||||
void populate( cv::Mat & codes, UINT32 N, int dim1codes ); |
||||
|
||||
/* execute a batch query */ |
||||
void batchquery( UINT32 * results, UINT32 *numres/*, qstat *stats*/, const cv::Mat & q, UINT32 numq, int dim1queries ); |
||||
|
||||
private: |
||||
|
||||
/* execute a single query */ |
||||
void query( UINT32 * results, UINT32* numres/*, qstat *stats*/, UINT8 *q, UINT64 * chunks, UINT32 * res ); |
||||
}; |
||||
|
||||
#endif |
@ -1,89 +0,0 @@ |
||||
/*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) 2014, Mohammad Norouzi, Ali Punjani, David J. Fleet,
|
||||
// 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_SPARSE_HASHTABLE_HPP |
||||
#define __OPENCV_SPARSE_HASHTABLE_HPP |
||||
|
||||
#ifdef _WIN32 |
||||
#pragma warning( disable : 4267 ) |
||||
#endif |
||||
|
||||
#include "types.hpp" |
||||
#include "bucket_group.hpp" |
||||
|
||||
class SparseHashtable |
||||
{ |
||||
|
||||
private: |
||||
|
||||
/* Maximum bits per key before folding the table */ |
||||
static const int MAX_B; |
||||
|
||||
/* Bins (each bin is an Array object for duplicates of the same key) */ |
||||
BucketGroup *table; |
||||
|
||||
public: |
||||
|
||||
/* constructor */ |
||||
SparseHashtable(); |
||||
|
||||
/* destructor */ |
||||
~SparseHashtable(); |
||||
|
||||
/* initializer */ |
||||
int init( int _b ); |
||||
|
||||
/* insert data */ |
||||
void insert( UINT64 index, UINT32 data ); |
||||
|
||||
/* query data */ |
||||
UINT32* query( UINT64 index, int* size ); |
||||
|
||||
/* Bits per index */ |
||||
int b; |
||||
|
||||
/* Number of bins */ |
||||
UINT64 size; |
||||
|
||||
}; |
||||
|
||||
#endif |
@ -1,189 +0,0 @@ |
||||
/*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) 2014, Mohammad Norouzi, Ali Punjani, David J. Fleet,
|
||||
// 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*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
/* no need for the static keyword in the definition */ |
||||
double Array32::ARRAY_RESIZE_FACTOR = 1.1; // minimum is 1.0
|
||||
double Array32::ARRAY_RESIZE_ADD_FACTOR = 4; // minimum is 1
|
||||
|
||||
/* set ARRAY_RESIZE_FACTOR */ |
||||
void Array32::setArrayResizeFactor( double arf ) |
||||
{ |
||||
ARRAY_RESIZE_FACTOR = arf; |
||||
} |
||||
|
||||
/* constructor */ |
||||
Array32::Array32() |
||||
{ |
||||
arr = NULL; |
||||
} |
||||
|
||||
/* definition of operator =
|
||||
Array32& Array32::operator = (const Array32 &rhs) */ |
||||
void Array32::operator =( const Array32 &rhs ) |
||||
{ |
||||
if( &rhs != this ) |
||||
this->arr = rhs.arr; |
||||
} |
||||
|
||||
/* destructor */ |
||||
Array32::~Array32() |
||||
{ |
||||
cleanup(); |
||||
} |
||||
|
||||
/* cleaning function used in destructor */ |
||||
void Array32::cleanup() |
||||
{ |
||||
free( arr ); |
||||
} |
||||
|
||||
/* push data */ |
||||
void Array32::push( UINT32 Data ) |
||||
{ |
||||
if( arr ) |
||||
{ |
||||
if( arr[0] == arr[1] ) |
||||
{ |
||||
arr[1] = (UINT32) std::max( ceil( arr[1] * ARRAY_RESIZE_FACTOR ), arr[1] + ARRAY_RESIZE_ADD_FACTOR ); |
||||
UINT32* new_Data = static_cast<UINT32*>( realloc( arr, sizeof(UINT32) * ( 2 + arr[1] ) ) ); |
||||
if( new_Data == NULL ) |
||||
{ |
||||
/* could not realloc, but orig still valid */ |
||||
std::cout << "ALERT!!!! Not enough memory, operation aborted!" << std::endl; |
||||
exit( 0 ); |
||||
} |
||||
else |
||||
{ |
||||
arr = new_Data; |
||||
} |
||||
|
||||
} |
||||
|
||||
arr[2 + arr[0]] = Data; |
||||
arr[0]++; |
||||
|
||||
} |
||||
|
||||
else |
||||
{ |
||||
arr = (UINT32*) malloc( (size_t) ( 2 + ARRAY_RESIZE_ADD_FACTOR ) * sizeof(UINT32) ); |
||||
arr[0] = 1; |
||||
arr[1] = 1; |
||||
arr[2] = Data; |
||||
} |
||||
} |
||||
|
||||
/* insert data at given index */ |
||||
void Array32::insert( UINT32 index, UINT32 Data ) |
||||
{ |
||||
if( arr ) |
||||
{ |
||||
if( arr[0] == arr[1] ) |
||||
{ |
||||
arr[1] = (UINT32) ceil( arr[0] * 1.1 ); |
||||
UINT32* new_data = static_cast<UINT32*>( realloc( arr, sizeof(UINT32) * ( 2 + arr[1] ) ) ); |
||||
if( new_data == NULL ) |
||||
{ |
||||
// could not realloc, but orig still valid
|
||||
std::cout << "ALERT!!!! Not enough memory, operation aborted!" << std::endl; |
||||
exit( 0 ); |
||||
} |
||||
else |
||||
{ |
||||
arr = new_data; |
||||
} |
||||
} |
||||
|
||||
memmove( arr + ( 2 + index ) + 1, arr + ( 2 + index ), ( arr[0] - index ) * sizeof ( *arr ) ); |
||||
|
||||
arr[2 + index] = Data; |
||||
arr[0]++; |
||||
} |
||||
|
||||
else |
||||
{ |
||||
arr = (UINT32*) malloc( 3 * sizeof(UINT32) ); |
||||
arr[0] = 1; |
||||
arr[1] = 1; |
||||
arr[2] = Data; |
||||
} |
||||
} |
||||
|
||||
/* return data */ |
||||
UINT32* Array32::data() |
||||
{ |
||||
return arr ? arr + 2 : NULL; |
||||
} |
||||
|
||||
/* return data size */ |
||||
UINT32 Array32::size() |
||||
{ |
||||
return arr ? arr[0] : 0; |
||||
} |
||||
|
||||
/* return capacity */ |
||||
UINT32 Array32::capacity() |
||||
{ |
||||
return arr ? arr[1] : 0; |
||||
} |
||||
|
||||
/* print data */ |
||||
void Array32::print() |
||||
{ |
||||
for ( int i = 0; i < (int) size(); i++ ) |
||||
printf( "%d, ", arr[i + 2] ); |
||||
|
||||
printf( "\n" ); |
||||
} |
||||
|
||||
/* initializer */ |
||||
void Array32::init( int Size ) |
||||
{ |
||||
if( arr == NULL ) |
||||
{ |
||||
arr = (UINT32*) malloc( ( 2 + Size ) * sizeof(UINT32) ); |
||||
arr[0] = 0; |
||||
arr[1] = Size; |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -1,100 +0,0 @@ |
||||
/*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) 2014, Mohammad Norouzi, Ali Punjani, David J. Fleet,
|
||||
// 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*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
/* constructor */ |
||||
BucketGroup::BucketGroup() |
||||
{ |
||||
empty = 0; |
||||
group = NULL; |
||||
} |
||||
|
||||
/* destructor */ |
||||
BucketGroup::~BucketGroup() |
||||
{ |
||||
if( group != NULL ) |
||||
delete group; |
||||
} |
||||
|
||||
/* insert data into the bucket */ |
||||
void BucketGroup::insert( int subindex, UINT32 data ) |
||||
{ |
||||
if( group == NULL ) |
||||
{ |
||||
group = new Array32(); |
||||
group->push( 0 ); |
||||
} |
||||
|
||||
UINT32 lowerbits = ( (UINT32) 1 << subindex ) - 1; |
||||
int end = popcnt( empty & lowerbits ); |
||||
|
||||
if( ! ( empty & ( (UINT32) 1 << subindex ) ) ) |
||||
{ |
||||
group->insert( end, group->arr[end + 2] ); |
||||
empty |= (UINT32) 1 << subindex; |
||||
} |
||||
|
||||
int totones = popcnt( empty ); |
||||
group->insert( totones + 1 + group->arr[2 + end + 1], data ); |
||||
for ( int i = end + 1; i < totones + 1; i++ ) |
||||
group->arr[2 + i]++; |
||||
} |
||||
|
||||
/* perform a query to the bucket */ |
||||
UINT32* BucketGroup::query( int subindex, int *size ) |
||||
{ |
||||
if( empty & ( (UINT32) 1 << subindex ) ) |
||||
{ |
||||
UINT32 lowerbits = ( (UINT32) 1 << subindex ) - 1; |
||||
int end = popcnt( empty & lowerbits ); |
||||
int totones = popcnt( empty ); |
||||
*size = group->arr[2 + end + 1] - group->arr[2 + end]; |
||||
return group->arr + 2 + totones + 1 + group->arr[2 + end]; |
||||
} |
||||
|
||||
else |
||||
{ |
||||
*size = 0; |
||||
return NULL; |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -1,270 +0,0 @@ |
||||
/*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) 2014, Mohammad Norouzi, Ali Punjani, David J. Fleet,
|
||||
// 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*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
/* execute a batch query */ |
||||
void Mihasher::batchquery( UINT32 * results, UINT32 *numres, const cv::Mat & queries, UINT32 numq, int dim1queries ) |
||||
{ |
||||
/* create and initialize a bitarray */ |
||||
counter = new bitarray; |
||||
counter->init( N ); |
||||
|
||||
UINT32 *res = new UINT32[K * ( D + 1 )]; |
||||
UINT64 *chunks = new UINT64[m]; |
||||
UINT32 * presults = results; |
||||
UINT32 *pnumres = numres; |
||||
|
||||
/* make a copy of input queries */ |
||||
cv::Mat queries_clone = queries.clone(); |
||||
|
||||
/* set a pointer to first query (row) */ |
||||
UINT8 *pq = queries_clone.ptr(); |
||||
|
||||
/* loop over number of descriptors */ |
||||
for ( size_t i = 0; i < numq; i++ ) |
||||
{ |
||||
/* for every descriptor, query database */ |
||||
query( presults, pnumres, pq, chunks, res ); |
||||
|
||||
/* move pointer to write next K indeces */ |
||||
presults += K; |
||||
pnumres += B + 1; |
||||
|
||||
/* move forward pointer to current row in descriptors matrix */ |
||||
pq += dim1queries; |
||||
|
||||
} |
||||
|
||||
delete[] res; |
||||
delete[] chunks; |
||||
|
||||
delete counter; |
||||
} |
||||
|
||||
/* execute a single query */ |
||||
void Mihasher::query( UINT32* results, UINT32* numres, UINT8 * Query, UINT64 *chunks, UINT32 *res ) |
||||
{ |
||||
/* if K == 0 that means we want everything to be processed.
|
||||
So maxres = N in that case. Otherwise K limits the results processed */ |
||||
UINT32 maxres = K ? K : (UINT32) N; |
||||
|
||||
/* number of results so far obtained (up to a distance of s per chunk) */ |
||||
UINT32 n = 0; |
||||
|
||||
/* number of candidates tested with full codes (not counting duplicates) */ |
||||
UINT32 nc = 0; |
||||
|
||||
/* counting everything retrieved (duplicates are counted multiple times)
|
||||
number of lookups (and xors) */ |
||||
UINT32 nl = 0; |
||||
|
||||
UINT32 nd = 0; |
||||
UINT32 *arr; |
||||
int size = 0; |
||||
UINT32 index; |
||||
int hammd; |
||||
|
||||
counter->erase(); |
||||
memset( numres, 0, ( B + 1 ) * sizeof ( *numres ) ); |
||||
|
||||
split( chunks, Query, m, mplus, b ); |
||||
|
||||
/* the growing search radius per substring */ |
||||
int s; |
||||
|
||||
/* current b: for the first mplus substrings it is b, for the rest it is (b-1) */ |
||||
int curb = b; |
||||
|
||||
for ( s = 0; s <= d && n < maxres; s++ ) |
||||
{ |
||||
for ( int k = 0; k < m; k++ ) |
||||
{ |
||||
if( k < mplus ) |
||||
curb = b; |
||||
else |
||||
curb = b - 1; |
||||
UINT64 chunksk = chunks[k]; |
||||
/* number of bit-strings with s number of 1s */ |
||||
nl += xornum[s + 1] - xornum[s]; |
||||
|
||||
/* the bit-string with s number of 1s */ |
||||
UINT64 bitstr = 0; |
||||
for ( int i = 0; i < s; i++ ) |
||||
/* power[i] stores the location of the i'th 1 */ |
||||
power[i] = i; |
||||
/* used for stopping criterion (location of (s+1)th 1) */ |
||||
power[s] = curb + 1; |
||||
|
||||
/* bit determines the 1 that should be moving to the left */ |
||||
int bit = s - 1; |
||||
|
||||
/* start from the left-most 1, and move it to the left until
|
||||
it touches another one */ |
||||
|
||||
/* the loop for changing bitstr */ |
||||
bool infiniteWhile = true; |
||||
while ( infiniteWhile ) |
||||
{ |
||||
if( bit != -1 ) |
||||
{ |
||||
bitstr ^= ( power[bit] == bit ) ? (UINT64) 1 << power[bit] : (UINT64) 3 << ( power[bit] - 1 ); |
||||
power[bit]++; |
||||
bit--; |
||||
} |
||||
|
||||
else |
||||
{ /* bit == -1 */ |
||||
/* the binary code bitstr is available for processing */ |
||||
arr = H[k].query( chunksk ^ bitstr, &size ); // lookup
|
||||
if( size ) |
||||
{ /* the corresponding bucket is not empty */ |
||||
nd += size; |
||||
for ( int c = 0; c < size; c++ ) |
||||
{ |
||||
index = arr[c]; |
||||
if( !counter->get( index ) ) |
||||
{ /* if it is not a duplicate */ |
||||
counter->set( index ); |
||||
hammd = match( codes.ptr() + (UINT64) index * ( B_over_8 ), Query, B_over_8 ); |
||||
|
||||
nc++; |
||||
if( hammd <= D && numres[hammd] < maxres ) |
||||
res[hammd * K + numres[hammd]] = index + 1; |
||||
|
||||
numres[hammd]++; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* end of processing */ |
||||
while ( ++bit < s && power[bit] == power[bit + 1] - 1 ) |
||||
{ |
||||
bitstr ^= (UINT64) 1 << ( power[bit] - 1 ); |
||||
power[bit] = bit; |
||||
} |
||||
if( bit == s ) |
||||
break; |
||||
} |
||||
} |
||||
|
||||
n = n + numres[s * m + k]; |
||||
if( n >= maxres ) |
||||
break; |
||||
} |
||||
} |
||||
|
||||
n = 0; |
||||
for ( s = 0; s <= D && (int) n < K; s++ ) |
||||
{ |
||||
for ( int c = 0; c < (int) numres[s] && (int) n < K; c++ ) |
||||
results[n++] = res[s * K + c]; |
||||
} |
||||
|
||||
} |
||||
|
||||
/* constructor 2 */ |
||||
Mihasher::Mihasher( int _B, int _m ) |
||||
{ |
||||
B = _B; |
||||
B_over_8 = B / 8; |
||||
m = _m; |
||||
b = (int) ceil( (double) B / m ); |
||||
|
||||
/* assuming that B/2 is large enough radius to include
|
||||
all of the k nearest neighbors */ |
||||
D = (int) ceil( B / 2.0 ); |
||||
d = (int) ceil( (double) D / m ); |
||||
|
||||
/* mplus is the number of chunks with b bits
|
||||
(m-mplus) is the number of chunks with (b-1) bits */ |
||||
mplus = B - m * ( b - 1 ); |
||||
|
||||
xornum = new UINT32[d + 2]; |
||||
xornum[0] = 0; |
||||
for ( int i = 0; i <= d; i++ ) |
||||
xornum[i + 1] = xornum[i] + (UINT32) choose( b, i ); |
||||
|
||||
H = new SparseHashtable[m]; |
||||
|
||||
/* H[i].init might fail */ |
||||
for ( int i = 0; i < mplus; i++ ) |
||||
H[i].init( b ); |
||||
for ( int i = mplus; i < m; i++ ) |
||||
H[i].init( b - 1 ); |
||||
} |
||||
|
||||
/* K setter */ |
||||
void Mihasher::setK( int _K ) |
||||
{ |
||||
K = _K; |
||||
} |
||||
|
||||
/* desctructor */ |
||||
Mihasher::~Mihasher() |
||||
{ |
||||
delete[] xornum; |
||||
delete[] H; |
||||
} |
||||
|
||||
/* populate tables */ |
||||
void Mihasher::populate( cv::Mat & _codes, UINT32 _N, int dim1codes ) |
||||
{ |
||||
N = _N; |
||||
codes = _codes; |
||||
UINT64 * chunks = new UINT64[m]; |
||||
|
||||
UINT8 * pcodes = codes.ptr(); |
||||
for ( UINT64 i = 0; i < N; i++, pcodes += dim1codes ) |
||||
{ |
||||
split( chunks, pcodes, m, mplus, b ); |
||||
|
||||
for ( int k = 0; k < m; k++ ) |
||||
H[k].insert( chunks[k], (UINT32) i ); |
||||
|
||||
if( i % (int) ceil( N / 1000.0 ) == 0 ) |
||||
fflush( stdout ); |
||||
} |
||||
|
||||
delete[] chunks; |
||||
} |
||||
|
@ -1,85 +0,0 @@ |
||||
/*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) 2014, Biagio Montesano, 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*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
const int SparseHashtable::MAX_B = 37; |
||||
|
||||
/* constructor */ |
||||
SparseHashtable::SparseHashtable() |
||||
{ |
||||
table = NULL; |
||||
size = 0; |
||||
b = 0; |
||||
} |
||||
|
||||
/* initializer */ |
||||
int SparseHashtable::init( int _b ) |
||||
{ |
||||
b = _b; |
||||
|
||||
if( b < 5 || b > MAX_B || b > (int) ( sizeof(UINT64) * 8 ) ) |
||||
return 1; |
||||
|
||||
size = UINT64_1 << ( b - 5 ); // size = 2 ^ b
|
||||
table = (BucketGroup*) calloc( size, sizeof(BucketGroup) ); |
||||
|
||||
return 0; |
||||
|
||||
} |
||||
|
||||
/* destructor */ |
||||
SparseHashtable::~SparseHashtable() |
||||
{ |
||||
free( table ); |
||||
} |
||||
|
||||
/* insert data */ |
||||
void SparseHashtable::insert( UINT64 index, UINT32 data ) |
||||
{ |
||||
table[index >> 5].insert( (int) ( index % 32 ), data ); |
||||
} |
||||
|
||||
/* query data */ |
||||
UINT32* SparseHashtable::query( UINT64 index, int *Size ) |
||||
{ |
||||
return table[index >> 5].query( (int) ( index % 32 ), Size ); |
||||
} |
Loading…
Reference in new issue