mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
440 lines
17 KiB
440 lines
17 KiB
/*****************************************************************************/ |
|
/* Matching procedure API */ |
|
/*****************************************************************************/ |
|
// |
|
#ifndef _LSVM_MATCHING_H_ |
|
#define _LSVM_MATCHING_H_ |
|
|
|
#include "_latentsvm.h" |
|
#include "_lsvm_error.h" |
|
#include "_lsvm_distancetransform.h" |
|
#include "_lsvm_fft.h" |
|
#include "_lsvm_routine.h" |
|
|
|
#ifdef HAVE_TBB |
|
#include "_lsvm_tbbversion.h" |
|
#endif |
|
|
|
//extern "C" { |
|
/* |
|
// Function for convolution computation |
|
// |
|
// API |
|
// int convolution(const filterObject *Fi, const featureMap *map, float *f); |
|
// INPUT |
|
// Fi - filter object |
|
// map - feature map |
|
// OUTPUT |
|
// f - the convolution |
|
// RESULT |
|
// Error status |
|
*/ |
|
int convolution(const CvLSVMFilterObject *Fi, const CvLSVMFeatureMap *map, float *f); |
|
|
|
/* |
|
// Computation multiplication of FFT images |
|
// |
|
// API |
|
// int fftImagesMulti(float *fftImage1, float *fftImage2, int numRows, int numColls, |
|
float *multi); |
|
// INPUT |
|
// fftImage1 - first fft image |
|
// fftImage2 - second fft image |
|
// (numRows, numColls) - image dimesions |
|
// OUTPUT |
|
// multi - multiplication |
|
// RESULT |
|
// Error status |
|
*/ |
|
int fftImagesMulti(float *fftImage1, float *fftImage2, int numRows, int numColls, |
|
float *multi); |
|
|
|
/* |
|
// Turnover filter matrix for the single feature |
|
// |
|
// API |
|
// int rot2PI(float *filter, int dimX, int dimY, float *rot2PIFilter, |
|
int p, int shift); |
|
// INPUT |
|
// filter - filter weight matrix |
|
// (dimX, dimY) - dimension of filter matrix |
|
// p - number of features |
|
// shift - number of feature (or channel) |
|
// OUTPUT |
|
// rot2PIFilter - rotated matrix |
|
// RESULT |
|
// Error status |
|
*/ |
|
int rot2PI(float *filter, int dimX, int dimY, float *rot2PIFilter, |
|
int p, int shift); |
|
|
|
/* |
|
// Addition nullable bars to the dimension of feature map (single feature) |
|
// |
|
// API |
|
// int addNullableBars(float *rot2PIFilter, int dimX, int dimY, |
|
float *newFilter, int newDimX, int newDimY); |
|
// INPUT |
|
// rot2PIFilter - filter matrix for the single feature that was rotated |
|
// (dimX, dimY) - dimension rot2PIFilter |
|
// (newDimX, newDimY)- dimension of feature map for the single feature |
|
// OUTPUT |
|
// newFilter - filter matrix with nullable bars |
|
// RESULT |
|
// Error status |
|
*/ |
|
int addNullableBars(float *rot2PIFilter, int dimX, int dimY, |
|
float *newFilter, int newDimX, int newDimY); |
|
|
|
/* |
|
// Computation FFT image for filter object |
|
// |
|
// API |
|
// int getFFTImageFilterObject(const filterObject *filter, |
|
int mapDimX, int mapDimY, |
|
fftImage **image); |
|
// INPUT |
|
// filter - filter object |
|
// (mapDimX, mapDimY)- dimension of feature map |
|
// OUTPUT |
|
// image - fft image |
|
// RESULT |
|
// Error status |
|
*/ |
|
int getFFTImageFilterObject(const CvLSVMFilterObject *filter, |
|
int mapDimX, int mapDimY, |
|
CvLSVMFftImage **image); |
|
|
|
/* |
|
// Computation FFT image for feature map |
|
// |
|
// API |
|
// int getFFTImageFeatureMap(const featureMap *map, fftImage **image); |
|
// INPUT |
|
// OUTPUT |
|
// RESULT |
|
// Error status |
|
*/ |
|
int getFFTImageFeatureMap(const CvLSVMFeatureMap *map, CvLSVMFftImage **image); |
|
|
|
/* |
|
// Function for convolution computation using FFT |
|
// |
|
// API |
|
// int convFFTConv2d(const fftImage *featMapImage, const fftImage *filterImage, |
|
int filterDimX, int filterDimY, float **conv); |
|
// INPUT |
|
// featMapImage - feature map image |
|
// filterImage - filter image |
|
// (filterDimX,filterDimY) - filter dimension |
|
// OUTPUT |
|
// conv - the convolution |
|
// RESULT |
|
// Error status |
|
*/ |
|
int convFFTConv2d(const CvLSVMFftImage *featMapImage, const CvLSVMFftImage *filterImage, |
|
int filterDimX, int filterDimY, float **conv); |
|
|
|
/* |
|
// Computation objective function D according the original paper |
|
// |
|
// API |
|
// int filterDispositionLevel(const filterObject *Fi, const featureMap *pyramid, |
|
float **scoreFi, |
|
int **pointsX, int **pointsY); |
|
// INPUT |
|
// Fi - filter object (weights and coefficients of penalty |
|
function that are used in this routine) |
|
// pyramid - feature map |
|
// OUTPUT |
|
// scoreFi - values of distance transform on the level at all positions |
|
// (pointsX, pointsY)- positions that correspond to the maximum value |
|
of distance transform at all grid nodes |
|
// RESULT |
|
// Error status |
|
*/ |
|
int filterDispositionLevel(const CvLSVMFilterObject *Fi, const CvLSVMFeatureMap *pyramid, |
|
float **scoreFi, |
|
int **pointsX, int **pointsY); |
|
|
|
/* |
|
// Computation objective function D according the original paper using FFT |
|
// |
|
// API |
|
// int filterDispositionLevelFFT(const filterObject *Fi, const fftImage *featMapImage, |
|
float **scoreFi, |
|
int **pointsX, int **pointsY); |
|
// INPUT |
|
// Fi - filter object (weights and coefficients of penalty |
|
function that are used in this routine) |
|
// featMapImage - FFT image of feature map |
|
// OUTPUT |
|
// scoreFi - values of distance transform on the level at all positions |
|
// (pointsX, pointsY)- positions that correspond to the maximum value |
|
of distance transform at all grid nodes |
|
// RESULT |
|
// Error status |
|
*/ |
|
int filterDispositionLevelFFT(const CvLSVMFilterObject *Fi, const CvLSVMFftImage *featMapImage, |
|
float **scoreFi, |
|
int **pointsX, int **pointsY); |
|
|
|
/* |
|
// Computation border size for feature map |
|
// |
|
// API |
|
// int computeBorderSize(int maxXBorder, int maxYBorder, int *bx, int *by); |
|
// INPUT |
|
// maxXBorder - the largest root filter size (X-direction) |
|
// maxYBorder - the largest root filter size (Y-direction) |
|
// OUTPUT |
|
// bx - border size (X-direction) |
|
// by - border size (Y-direction) |
|
// RESULT |
|
// Error status |
|
*/ |
|
int computeBorderSize(int maxXBorder, int maxYBorder, int *bx, int *by); |
|
|
|
/* |
|
// Addition nullable border to the feature map |
|
// |
|
// API |
|
// int addNullableBorder(featureMap *map, int bx, int by); |
|
// INPUT |
|
// map - feature map |
|
// bx - border size (X-direction) |
|
// by - border size (Y-direction) |
|
// OUTPUT |
|
// RESULT |
|
// Error status |
|
*/ |
|
int addNullableBorder(CvLSVMFeatureMap *map, int bx, int by); |
|
|
|
/* |
|
// Computation the maximum of the score function at the level |
|
// |
|
// API |
|
// int maxFunctionalScoreFixedLevel(const filterObject **all_F, int n, |
|
const featurePyramid *H, |
|
int level, float b, |
|
int maxXBorder, int maxYBorder, |
|
float *score, CvPoint **points, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
// INPUT |
|
// all_F - the set of filters (the first element is root filter, |
|
the other - part filters) |
|
// n - the number of part filters |
|
// H - feature pyramid |
|
// level - feature pyramid level for computation maximum score |
|
// b - linear term of the score function |
|
// maxXBorder - the largest root filter size (X-direction) |
|
// maxYBorder - the largest root filter size (Y-direction) |
|
// OUTPUT |
|
// score - the maximum of the score function at the level |
|
// points - the set of root filter positions (in the block space) |
|
// levels - the set of levels |
|
// kPoints - number of root filter positions |
|
// partsDisplacement - displacement of part filters (in the block space) |
|
// RESULT |
|
// Error status |
|
*/ |
|
int maxFunctionalScoreFixedLevel(const CvLSVMFilterObject **all_F, int n, |
|
const CvLSVMFeaturePyramid *H, |
|
int level, float b, |
|
int maxXBorder, int maxYBorder, |
|
float *score, CvPoint **points, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
|
|
/* |
|
// Computation score function at the level that exceed threshold |
|
// |
|
// API |
|
// int thresholdFunctionalScoreFixedLevel(const filterObject **all_F, int n, |
|
const featurePyramid *H, |
|
int level, float b, |
|
int maxXBorder, int maxYBorder, |
|
float scoreThreshold, |
|
float **score, CvPoint **points, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
// INPUT |
|
// all_F - the set of filters (the first element is root filter, |
|
the other - part filters) |
|
// n - the number of part filters |
|
// H - feature pyramid |
|
// level - feature pyramid level for computation maximum score |
|
// b - linear term of the score function |
|
// maxXBorder - the largest root filter size (X-direction) |
|
// maxYBorder - the largest root filter size (Y-direction) |
|
// scoreThreshold - score threshold |
|
// OUTPUT |
|
// score - score function at the level that exceed threshold |
|
// points - the set of root filter positions (in the block space) |
|
// levels - the set of levels |
|
// kPoints - number of root filter positions |
|
// partsDisplacement - displacement of part filters (in the block space) |
|
// RESULT |
|
// Error status |
|
*/ |
|
int thresholdFunctionalScoreFixedLevel(const CvLSVMFilterObject **all_F, int n, |
|
const CvLSVMFeaturePyramid *H, |
|
int level, float b, |
|
int maxXBorder, int maxYBorder, |
|
float scoreThreshold, |
|
float **score, CvPoint **points, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
|
|
/* |
|
// Computation the maximum of the score function |
|
// |
|
// API |
|
// int maxFunctionalScore(const filterObject **all_F, int n, |
|
const featurePyramid *H, float b, |
|
int maxXBorder, int maxYBorder, |
|
float *score, |
|
CvPoint **points, int **levels, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
// INPUT |
|
// all_F - the set of filters (the first element is root filter, |
|
the other - part filters) |
|
// n - the number of part filters |
|
// H - feature pyramid |
|
// b - linear term of the score function |
|
// maxXBorder - the largest root filter size (X-direction) |
|
// maxYBorder - the largest root filter size (Y-direction) |
|
// OUTPUT |
|
// score - the maximum of the score function |
|
// points - the set of root filter positions (in the block space) |
|
// levels - the set of levels |
|
// kPoints - number of root filter positions |
|
// partsDisplacement - displacement of part filters (in the block space) |
|
// RESULT |
|
// Error status |
|
*/ |
|
int maxFunctionalScore(const CvLSVMFilterObject **all_F, int n, |
|
const CvLSVMFeaturePyramid *H, float b, |
|
int maxXBorder, int maxYBorder, |
|
float *score, |
|
CvPoint **points, int **levels, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
|
|
/* |
|
// Computation score function that exceed threshold |
|
// |
|
// API |
|
// int thresholdFunctionalScore(const filterObject **all_F, int n, |
|
const featurePyramid *H, |
|
float b, |
|
int maxXBorder, int maxYBorder, |
|
float scoreThreshold, |
|
float **score, |
|
CvPoint **points, int **levels, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
// INPUT |
|
// all_F - the set of filters (the first element is root filter, |
|
the other - part filters) |
|
// n - the number of part filters |
|
// H - feature pyramid |
|
// b - linear term of the score function |
|
// maxXBorder - the largest root filter size (X-direction) |
|
// maxYBorder - the largest root filter size (Y-direction) |
|
// scoreThreshold - score threshold |
|
// OUTPUT |
|
// score - score function values that exceed threshold |
|
// points - the set of root filter positions (in the block space) |
|
// levels - the set of levels |
|
// kPoints - number of root filter positions |
|
// partsDisplacement - displacement of part filters (in the block space) |
|
// RESULT |
|
// Error status |
|
*/ |
|
int thresholdFunctionalScore(const CvLSVMFilterObject **all_F, int n, |
|
const CvLSVMFeaturePyramid *H, |
|
float b, |
|
int maxXBorder, int maxYBorder, |
|
float scoreThreshold, |
|
float **score, |
|
CvPoint **points, int **levels, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
|
|
#ifdef HAVE_TBB |
|
/* |
|
// int tbbThresholdFunctionalScore(const CvLSVMFilterObject **all_F, int n, |
|
const CvLSVMFeaturePyramid *H, |
|
const float b, |
|
const int maxXBorder, const int maxYBorder, |
|
const float scoreThreshold, |
|
const int threadsNum, |
|
float **score, |
|
CvPoint **points, int **levels, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
// INPUT |
|
// all_F - the set of filters (the first element is root filter, |
|
the other - part filters) |
|
// n - the number of part filters |
|
// H - feature pyramid |
|
// b - linear term of the score function |
|
// maxXBorder - the largest root filter size (X-direction) |
|
// maxYBorder - the largest root filter size (Y-direction) |
|
// scoreThreshold - score threshold |
|
// threadsNum - number of threads that will be created using TBB version |
|
// OUTPUT |
|
// score - score function values that exceed threshold |
|
// points - the set of root filter positions (in the block space) |
|
// levels - the set of levels |
|
// kPoints - number of root filter positions |
|
// partsDisplacement - displacement of part filters (in the block space) |
|
// RESULT |
|
// Error status |
|
*/ |
|
int tbbThresholdFunctionalScore(const CvLSVMFilterObject **all_F, int n, |
|
const CvLSVMFeaturePyramid *H, |
|
const float b, |
|
const int maxXBorder, const int maxYBorder, |
|
const float scoreThreshold, |
|
const int threadsNum, |
|
float **score, |
|
CvPoint **points, int **levels, int *kPoints, |
|
CvPoint ***partsDisplacement); |
|
#endif |
|
|
|
/* |
|
// Perform non-maximum suppression algorithm (described in original paper) |
|
// to remove "similar" bounding boxes |
|
// |
|
// API |
|
// int nonMaximumSuppression(int numBoxes, const CvPoint *points, |
|
const CvPoint *oppositePoints, const float *score, |
|
float overlapThreshold, |
|
int *numBoxesout, CvPoint **pointsOut, |
|
CvPoint **oppositePointsOut, float **scoreOut); |
|
// INPUT |
|
// numBoxes - number of bounding boxes |
|
// points - array of left top corner coordinates |
|
// oppositePoints - array of right bottom corner coordinates |
|
// score - array of detection scores |
|
// overlapThreshold - threshold: bounding box is removed if overlap part |
|
is greater than passed value |
|
// OUTPUT |
|
// numBoxesOut - the number of bounding boxes algorithm returns |
|
// pointsOut - array of left top corner coordinates |
|
// oppositePointsOut - array of right bottom corner coordinates |
|
// scoreOut - array of detection scores |
|
// RESULT |
|
// Error status |
|
*/ |
|
#ifdef __cplusplus |
|
extern "C" |
|
#endif |
|
int nonMaximumSuppression(int numBoxes, const CvPoint *points, |
|
const CvPoint *oppositePoints, const float *score, |
|
float overlapThreshold, |
|
int *numBoxesOut, CvPoint **pointsOut, |
|
CvPoint **oppositePointsOut, float **scoreOut); |
|
#ifdef __cplusplus |
|
extern "C" |
|
#endif |
|
int getMaxFilterDims(const CvLSVMFilterObject **filters, int kComponents, |
|
const int *kPartFilters, |
|
unsigned int *maxXBorder, unsigned int *maxYBorder); |
|
//} |
|
#endif
|
|
|