cvaux.hpp
上传用户:soukeisyuu
上传日期:2022-07-03
资源大小:5943k
文件大小:50k
源码类别:

波变换

开发平台:

Visual C++

  1. /*M///////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  4. //
  5. //  By downloading, copying, installing or using the software you agree to this license.
  6. //  If you do not agree to this license, do not download, install,
  7. //  copy or use the software.
  8. //
  9. //
  10. //                        Intel License Agreement
  11. //                For Open Source Computer Vision Library
  12. //
  13. // Copyright (C) 2000, Intel Corporation, all rights reserved.
  14. // Third party copyrights are property of their respective owners.
  15. //
  16. // Redistribution and use in source and binary forms, with or without modification,
  17. // are permitted provided that the following conditions are met:
  18. //
  19. //   * Redistribution's of source code must retain the above copyright notice,
  20. //     this list of conditions and the following disclaimer.
  21. //
  22. //   * Redistribution's in binary form must reproduce the above copyright notice,
  23. //     this list of conditions and the following disclaimer in the documentation
  24. //     and/or other materials provided with the distribution.
  25. //
  26. //   * The name of Intel Corporation may not be used to endorse or promote products
  27. //     derived from this software without specific prior written permission.
  28. //
  29. // This software is provided by the copyright holders and contributors "as is" and
  30. // any express or implied warranties, including, but not limited to, the implied
  31. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  32. // In no event shall the Intel Corporation or contributors be liable for any direct,
  33. // indirect, incidental, special, exemplary, or consequential damages
  34. // (including, but not limited to, procurement of substitute goods or services;
  35. // loss of use, data, or profits; or business interruption) however caused
  36. // and on any theory of liability, whether in contract, strict liability,
  37. // or tort (including negligence or otherwise) arising in any way out of
  38. // the use of this software, even if advised of the possibility of such damage.
  39. //
  40. //M*/
  41. #ifndef __CVAUX_HPP__
  42. #define __CVAUX_HPP__
  43. #ifdef __cplusplus
  44. #include <iosfwd>
  45. /****************************************************************************************
  46. *                                       CamShiftTracker                                  *
  47. ****************************************************************************************/
  48. class CV_EXPORTS CvCamShiftTracker
  49. {
  50. public:
  51.     CvCamShiftTracker();
  52.     virtual ~CvCamShiftTracker();
  53.     /**** Characteristics of the object that are calculated by track_object method *****/
  54.     float   get_orientation() const // orientation of the object in degrees
  55.     { return m_box.angle; }
  56.     float   get_length() const // the larger linear size of the object
  57.     { return m_box.size.height; }
  58.     float   get_width() const // the smaller linear size of the object
  59.     { return m_box.size.width; }
  60.     CvPoint2D32f get_center() const // center of the object
  61.     { return m_box.center; }
  62.     CvRect get_window() const // bounding rectangle for the object
  63.     { return m_comp.rect; }
  64.     /*********************** Tracking parameters ************************/
  65.     int     get_threshold() const // thresholding value that applied to back project
  66.     { return m_threshold; }
  67.     int     get_hist_dims( int* dims = 0 ) const // returns number of histogram dimensions and sets
  68.     { return m_hist ? cvGetDims( m_hist->bins, dims ) : 0; }
  69.     int     get_min_ch_val( int channel ) const // get the minimum allowed value of the specified channel
  70.     { return m_min_ch_val[channel]; }
  71.     int     get_max_ch_val( int channel ) const // get the maximum allowed value of the specified channel
  72.     { return m_max_ch_val[channel]; }
  73.     // set initial object rectangle (must be called before initial calculation of the histogram)
  74.     bool    set_window( CvRect window)
  75.     { m_comp.rect = window; return true; }
  76.     bool    set_threshold( int threshold ) // threshold applied to the histogram bins
  77.     { m_threshold = threshold; return true; }
  78.     bool    set_hist_bin_range( int dim, int min_val, int max_val );
  79.     bool    set_hist_dims( int c_dims, int* dims );// set the histogram parameters
  80.     bool    set_min_ch_val( int channel, int val ) // set the minimum allowed value of the specified channel
  81.     { m_min_ch_val[channel] = val; return true; }
  82.     bool    set_max_ch_val( int channel, int val ) // set the maximum allowed value of the specified channel
  83.     { m_max_ch_val[channel] = val; return true; }
  84.     /************************ The processing methods *********************************/
  85.     // update object position
  86.     virtual bool  track_object( const IplImage* cur_frame );
  87.     // update object histogram
  88.     virtual bool  update_histogram( const IplImage* cur_frame );
  89.     // reset histogram
  90.     virtual void  reset_histogram();
  91.     /************************ Retrieving internal data *******************************/
  92.     // get back project image
  93.     virtual IplImage* get_back_project()
  94.     { return m_back_project; }
  95.     float query( int* bin ) const
  96.     { return m_hist ? (float)cvGetRealND(m_hist->bins, bin) : 0.f; }
  97. protected:
  98.     // internal method for color conversion: fills m_color_planes group
  99.     virtual void color_transform( const IplImage* img );
  100.     CvHistogram* m_hist;
  101.     CvBox2D    m_box;
  102.     CvConnectedComp m_comp;
  103.     float      m_hist_ranges_data[CV_MAX_DIM][2];
  104.     float*     m_hist_ranges[CV_MAX_DIM];
  105.     int        m_min_ch_val[CV_MAX_DIM];
  106.     int        m_max_ch_val[CV_MAX_DIM];
  107.     int        m_threshold;
  108.     IplImage*  m_color_planes[CV_MAX_DIM];
  109.     IplImage*  m_back_project;
  110.     IplImage*  m_temp;
  111.     IplImage*  m_mask;
  112. };
  113. /****************************************************************************************
  114. *                                   Adaptive Skin Detector                               *
  115. ****************************************************************************************/
  116. class CV_EXPORTS CvAdaptiveSkinDetector
  117. {
  118. private:
  119. enum {
  120. GSD_HUE_LT = 3,
  121. GSD_HUE_UT = 33,
  122. GSD_INTENSITY_LT = 15,
  123. GSD_INTENSITY_UT = 250
  124. };
  125. class CV_EXPORTS Histogram
  126. {
  127. private:
  128. enum {
  129. HistogramSize = (GSD_HUE_UT - GSD_HUE_LT + 1)
  130. };
  131. protected:
  132. int findCoverageIndex(double surfaceToCover, int defaultValue = 0);
  133. public:
  134. CvHistogram *fHistogram;
  135. Histogram();
  136. virtual ~Histogram();
  137. void findCurveThresholds(int &x1, int &x2, double percent = 0.05);
  138. void mergeWith(Histogram *source, double weight);
  139. };
  140. int nStartCounter, nFrameCount, nSkinHueLowerBound, nSkinHueUpperBound, nMorphingMethod, nSamplingDivider;
  141. double fHistogramMergeFactor, fHuePercentCovered;
  142. Histogram histogramHueMotion, skinHueHistogram;
  143. IplImage *imgHueFrame, *imgSaturationFrame, *imgLastGrayFrame, *imgMotionFrame, *imgFilteredFrame;
  144. IplImage *imgShrinked, *imgTemp, *imgGrayFrame, *imgHSVFrame;
  145. protected:
  146. void initData(IplImage *src, int widthDivider, int heightDivider);
  147. void adaptiveFilter();
  148. public:
  149. enum {
  150. MORPHING_METHOD_NONE = 0,
  151. MORPHING_METHOD_ERODE = 1,
  152. MORPHING_METHOD_ERODE_ERODE = 2,
  153. MORPHING_METHOD_ERODE_DILATE = 3
  154. };
  155. CvAdaptiveSkinDetector(int samplingDivider = 1, int morphingMethod = MORPHING_METHOD_NONE);
  156. virtual ~CvAdaptiveSkinDetector();
  157. virtual void process(IplImage *inputBGRImage, IplImage *outputHueMask);
  158. };
  159. /****************************************************************************************
  160. *                                  Fuzzy MeanShift Tracker                               *
  161. ****************************************************************************************/
  162. class CV_EXPORTS CvFuzzyPoint {
  163. public:
  164. double x, y, value;
  165. CvFuzzyPoint(double _x, double _y);
  166. };
  167. class CV_EXPORTS CvFuzzyCurve {
  168. private:
  169.     std::vector<CvFuzzyPoint> points;
  170. double value, centre;
  171. bool between(double x, double x1, double x2);
  172. public:
  173. CvFuzzyCurve();
  174. ~CvFuzzyCurve();
  175. void setCentre(double _centre);
  176. double getCentre();
  177. void clear();
  178. void addPoint(double x, double y);
  179. double calcValue(double param);
  180. double getValue();
  181. void setValue(double _value);
  182. };
  183. class CV_EXPORTS CvFuzzyFunction {
  184. public:
  185.     std::vector<CvFuzzyCurve> curves;
  186. CvFuzzyFunction();
  187. ~CvFuzzyFunction();
  188. void addCurve(CvFuzzyCurve *curve, double value = 0);
  189. void resetValues();
  190. double calcValue();
  191. CvFuzzyCurve *newCurve();
  192. };
  193. class CV_EXPORTS CvFuzzyRule {
  194. private:
  195. CvFuzzyCurve *fuzzyInput1, *fuzzyInput2;
  196. CvFuzzyCurve *fuzzyOutput;
  197. public:
  198. CvFuzzyRule();
  199. ~CvFuzzyRule();
  200. void setRule(CvFuzzyCurve *c1, CvFuzzyCurve *c2, CvFuzzyCurve *o1);
  201. double calcValue(double param1, double param2);
  202. CvFuzzyCurve *getOutputCurve();
  203. };
  204. class CV_EXPORTS CvFuzzyController {
  205. private:
  206.     std::vector<CvFuzzyRule*> rules;
  207. public:
  208. CvFuzzyController();
  209. ~CvFuzzyController();
  210. void addRule(CvFuzzyCurve *c1, CvFuzzyCurve *c2, CvFuzzyCurve *o1);
  211. double calcOutput(double param1, double param2);
  212. };
  213. class CV_EXPORTS CvFuzzyMeanShiftTracker
  214. {
  215. private:
  216. class FuzzyResizer
  217. {
  218. private:
  219. CvFuzzyFunction iInput, iOutput;
  220. CvFuzzyController fuzzyController;
  221. public:
  222. FuzzyResizer();
  223. int calcOutput(double edgeDensity, double density);
  224. };
  225. class SearchWindow
  226. {
  227. public:
  228. FuzzyResizer *fuzzyResizer;
  229. int x, y;
  230. int width, height, maxWidth, maxHeight, ellipseHeight, ellipseWidth;
  231. int ldx, ldy, ldw, ldh, numShifts, numIters;
  232. int xGc, yGc;
  233. long m00, m01, m10, m11, m02, m20;
  234. double ellipseAngle;
  235. double density;
  236. unsigned int depthLow, depthHigh;
  237. int verticalEdgeLeft, verticalEdgeRight, horizontalEdgeTop, horizontalEdgeBottom;
  238. SearchWindow();
  239. ~SearchWindow();
  240. void setSize(int _x, int _y, int _width, int _height);
  241. void initDepthValues(IplImage *maskImage, IplImage *depthMap);
  242. bool shift();
  243. void extractInfo(IplImage *maskImage, IplImage *depthMap, bool initDepth);
  244. void getResizeAttribsEdgeDensityLinear(int &resizeDx, int &resizeDy, int &resizeDw, int &resizeDh);
  245. void getResizeAttribsInnerDensity(int &resizeDx, int &resizeDy, int &resizeDw, int &resizeDh);
  246. void getResizeAttribsEdgeDensityFuzzy(int &resizeDx, int &resizeDy, int &resizeDw, int &resizeDh);
  247. bool meanShift(IplImage *maskImage, IplImage *depthMap, int maxIteration, bool initDepth);
  248. };
  249. public:
  250. enum TrackingState
  251. {
  252. tsNone  = 0,
  253. tsSearching  = 1,
  254. tsTracking  = 2,
  255. tsSetWindow  = 3,
  256. tsDisabled = 10
  257. };
  258. enum ResizeMethod {
  259. rmEdgeDensityLinear = 0,
  260. rmEdgeDensityFuzzy = 1,
  261. rmInnerDensity = 2
  262. };
  263. enum {
  264. MinKernelMass = 1000
  265. };
  266. SearchWindow kernel;
  267. int searchMode;
  268. private:
  269. enum
  270. {
  271. MaxMeanShiftIteration  = 5,
  272. MaxSetSizeIteration  = 5
  273. };
  274. void findOptimumSearchWindow(SearchWindow &searchWindow, IplImage *maskImage, IplImage *depthMap, int maxIteration, int resizeMethod, bool initDepth);
  275. public:
  276. CvFuzzyMeanShiftTracker();
  277. ~CvFuzzyMeanShiftTracker();
  278. void track(IplImage *maskImage, IplImage *depthMap, int resizeMethod, bool resetSearch, int minKernelMass = MinKernelMass);
  279. };
  280. namespace cv
  281. {
  282. class CV_EXPORTS Octree
  283. {
  284. public:    
  285.     struct Node
  286.     {
  287.         Node() {}
  288.         int begin, end;
  289.         float x_min, x_max, y_min, y_max, z_min, z_max;
  290.         int maxLevels;
  291.         bool isLeaf;
  292.         int children[8];
  293.     };
  294.     Octree();
  295.     Octree( const vector<Point3f>& points, int maxLevels = 10, int minPoints = 20 );
  296.     virtual ~Octree();
  297.     virtual void buildTree( const vector<Point3f>& points, int maxLevels = 10, int minPoints = 20 );
  298.     virtual void getPointsWithinSphere( const Point3f& center, float radius,
  299.                                         vector<Point3f>& points ) const;
  300.     const vector<Node>& getNodes() const { return nodes; }
  301. private:
  302.     int minPoints;
  303.     vector<Point3f> points;
  304.     vector<Node> nodes;
  305. virtual void buildNext(size_t node_ind);
  306. };
  307. class CV_EXPORTS Mesh3D
  308. {
  309. public:
  310.     struct EmptyMeshException {};
  311.     Mesh3D();
  312.     Mesh3D(const vector<Point3f>& vtx);
  313.     ~Mesh3D();
  314.     void buildOctree();
  315.     void clearOctree();
  316.     float estimateResolution(float tryRatio = 0.1f);        
  317.     void computeNormals(float normalRadius, int minNeighbors = 20);
  318.     void computeNormals(const vector<int>& subset, float normalRadius, int minNeighbors = 20);
  319.     
  320.     void writeAsVrml(const String& file, const vector<Scalar>& colors = vector<Scalar>()) const;
  321.     
  322.     vector<Point3f> vtx;
  323.     vector<Point3f> normals;
  324.     float resolution;    
  325.     Octree octree;
  326.     const static Point3f allzero;
  327. };
  328. class CV_EXPORTS SpinImageModel
  329. {
  330. public:
  331.     
  332.     /* model parameters, leave unset for default or auto estimate */
  333.     float normalRadius;
  334.     int minNeighbors;
  335.     float binSize;
  336.     int imageWidth;
  337.     float lambda;                        
  338.     float gamma;
  339.     float T_GeometriccConsistency;
  340.     float T_GroupingCorespondances;
  341.     /* public interface */
  342.     SpinImageModel();
  343.     explicit SpinImageModel(const Mesh3D& mesh);
  344.     ~SpinImageModel();
  345.     void setLogger(std::ostream* log);
  346.     void selectRandomSubset(float ratio);         
  347.     void setSubset(const vector<int>& subset);         
  348.     void compute();
  349.     void match(const SpinImageModel& scene, vector< vector<Vec2i> >& result);    
  350.     Mat packRandomScaledSpins(bool separateScale = false, size_t xCount = 10, size_t yCount = 10) const;
  351.     
  352.     size_t getSpinCount() const { return spinImages.rows; }
  353.     Mat getSpinImage(size_t index) const { return spinImages.row(index); }
  354.     const Point3f& getSpinVertex(size_t index) const { return mesh.vtx[subset[index]]; }
  355.     const Point3f& getSpinNormal(size_t index) const { return mesh.normals[subset[index]]; }
  356.     const Mesh3D& getMesh() const { return mesh; }
  357.     Mesh3D& getMesh() { return mesh; }
  358.     /* static utility functions */
  359.     static bool spinCorrelation(const Mat& spin1, const Mat& spin2, float lambda, float& result);
  360.     static Point2f calcSpinMapCoo(const Point3f& point, const Point3f& vertex, const Point3f& normal);
  361.     static float geometricConsistency(const Point3f& pointScene1, const Point3f& normalScene1,
  362.                                       const Point3f& pointModel1, const Point3f& normalModel1,   
  363.                                       const Point3f& pointScene2, const Point3f& normalScene2,                               
  364.                                       const Point3f& pointModel2, const Point3f& normalModel2);
  365.     static float groupingCreteria(const Point3f& pointScene1, const Point3f& normalScene1,
  366.                                   const Point3f& pointModel1, const Point3f& normalModel1,
  367.                                   const Point3f& pointScene2, const Point3f& normalScene2,                               
  368.                                   const Point3f& pointModel2, const Point3f& normalModel2, 
  369.                                   float gamma);
  370. protected:       
  371.     void defaultParams();
  372.     void matchSpinToModel(const Mat& spin, vector<int>& indeces, 
  373.         vector<float>& corrCoeffs, bool useExtremeOutliers = true) const; 
  374.     void repackSpinImages(const vector<uchar>& mask, Mat& spinImages, bool reAlloc = true) const;
  375.              
  376.     vector<int> subset;
  377.     Mesh3D mesh;
  378.     Mat spinImages;
  379.     std::ostream* out;
  380. };
  381. class CV_EXPORTS TickMeter
  382. {
  383. public:
  384.     TickMeter();
  385.     void start();    
  386.     void stop();
  387.     int64 getTimeTicks() const;
  388.     double getTimeMicro() const;
  389.     double getTimeMilli() const;
  390.     double getTimeSec()   const;
  391.     int64 getCounter() const;
  392.     void reset();
  393. private:
  394.     int64 counter;
  395.     int64 sumTime;
  396.     int64 startTime;
  397. };
  398. CV_EXPORTS std::ostream& operator<<(std::ostream& out, const TickMeter& tm);
  399. /****************************************************************************************
  400. *            HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector        *
  401. ****************************************************************************************/
  402. struct CV_EXPORTS HOGDescriptor
  403. {
  404. public:
  405.     enum { L2Hys=0 };
  406.     HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),
  407.         cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
  408.         histogramNormType(L2Hys), L2HysThreshold(0.2), gammaCorrection(true)
  409.     {}
  410.     HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,
  411.         Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,
  412.         int _histogramNormType=L2Hys, double _L2HysThreshold=0.2, bool _gammaCorrection=false)
  413.         : winSize(_winSize), blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize),
  414.         nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma),
  415.         histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold),
  416.         gammaCorrection(_gammaCorrection)
  417.     {}
  418.     HOGDescriptor(const String& filename)
  419.     {
  420.         load(filename);
  421.     }
  422.     virtual ~HOGDescriptor() {}
  423.     size_t getDescriptorSize() const;
  424.     bool checkDetectorSize() const;
  425.     double getWinSigma() const;
  426.     virtual void setSVMDetector(const vector<float>& _svmdetector);
  427.     virtual bool load(const String& filename, const String& objname=String());
  428.     virtual void save(const String& filename, const String& objname=String()) const;
  429.     virtual void compute(const Mat& img,
  430.                          vector<float>& descriptors,
  431.                          Size winStride=Size(), Size padding=Size(),
  432.                          const vector<Point>& locations=vector<Point>()) const;
  433.     virtual void detect(const Mat& img, vector<Point>& foundLocations,
  434.                         double hitThreshold=0, Size winStride=Size(),
  435.                         Size padding=Size(),
  436.                         const vector<Point>& searchLocations=vector<Point>()) const;
  437.     virtual void detectMultiScale(const Mat& img, vector<Rect>& foundLocations,
  438.                                   double hitThreshold=0, Size winStride=Size(),
  439.                                   Size padding=Size(), double scale=1.05,
  440.                                   int groupThreshold=2) const;
  441.     virtual void computeGradient(const Mat& img, Mat& grad, Mat& angleOfs,
  442.                                  Size paddingTL=Size(), Size paddingBR=Size()) const;
  443.     static vector<float> getDefaultPeopleDetector();
  444.     Size winSize;
  445.     Size blockSize;
  446.     Size blockStride;
  447.     Size cellSize;
  448.     int nbins;
  449.     int derivAperture;
  450.     double winSigma;
  451.     int histogramNormType;
  452.     double L2HysThreshold;
  453.     bool gammaCorrection;
  454.     vector<float> svmDetector;
  455. };
  456. class CV_EXPORTS SelfSimDescriptor
  457. {
  458. public:
  459.     SelfSimDescriptor();
  460.     SelfSimDescriptor(int _ssize, int _lsize,
  461.         int _startDistanceBucket=DEFAULT_START_DISTANCE_BUCKET,
  462.         int _numberOfDistanceBuckets=DEFAULT_NUM_DISTANCE_BUCKETS,
  463.         int _nangles=DEFAULT_NUM_ANGLES);
  464. SelfSimDescriptor(const SelfSimDescriptor& ss);
  465. virtual ~SelfSimDescriptor();
  466.     SelfSimDescriptor& operator = (const SelfSimDescriptor& ss);
  467.     size_t getDescriptorSize() const;
  468.     Size getGridSize( Size imgsize, Size winStride ) const;
  469.     virtual void compute(const Mat& img, vector<float>& descriptors, Size winStride=Size(),
  470.                          const vector<Point>& locations=vector<Point>()) const;
  471.     virtual void computeLogPolarMapping(Mat& mappingMask) const;
  472.     virtual void SSD(const Mat& img, Point pt, Mat& ssd) const;
  473. int smallSize;
  474. int largeSize;
  475.     int startDistanceBucket;
  476.     int numberOfDistanceBuckets;
  477.     int numberOfAngles;
  478.     enum { DEFAULT_SMALL_SIZE = 5, DEFAULT_LARGE_SIZE = 41,
  479.         DEFAULT_NUM_ANGLES = 20, DEFAULT_START_DISTANCE_BUCKET = 3,
  480.         DEFAULT_NUM_DISTANCE_BUCKETS = 7 };
  481. };
  482.     
  483. class CV_EXPORTS PatchGenerator
  484. {
  485. public:
  486.     PatchGenerator();
  487.     PatchGenerator(double _backgroundMin, double _backgroundMax,
  488.                    double _noiseRange, bool _randomBlur=true,
  489.                    double _lambdaMin=0.6, double _lambdaMax=1.5,
  490.                    double _thetaMin=-CV_PI, double _thetaMax=CV_PI,
  491.                    double _phiMin=-CV_PI, double _phiMax=CV_PI );
  492.     void operator()(const Mat& image, Point2f pt, Mat& patch, Size patchSize, RNG& rng) const;
  493.     void operator()(const Mat& image, const Mat& transform, Mat& patch,
  494.                     Size patchSize, RNG& rng) const;
  495.     void warpWholeImage(const Mat& image, Mat& _T, Mat& buf,
  496.                         Mat& warped, int border, RNG& rng) const;
  497.     void generateRandomTransform(Point2f srcCenter, Point2f dstCenter,
  498.                                  Mat& transform, RNG& rng, bool inverse=false) const;
  499.     double backgroundMin, backgroundMax;
  500.     double noiseRange;
  501.     bool randomBlur;
  502.     double lambdaMin, lambdaMax;
  503.     double thetaMin, thetaMax;
  504.     double phiMin, phiMax;
  505. };
  506.     
  507. class CV_EXPORTS LDetector
  508. {
  509. public:    
  510.     LDetector();
  511.     LDetector(int _radius, int _threshold, int _nOctaves,
  512.               int _nViews, double _baseFeatureSize, double _clusteringDistance);
  513.     void operator()(const Mat& image, vector<KeyPoint>& keypoints, int maxCount=0, bool scaleCoords=true) const;
  514.     void operator()(const vector<Mat>& pyr, vector<KeyPoint>& keypoints, int maxCount=0, bool scaleCoords=true) const;
  515.     void getMostStable2D(const Mat& image, vector<KeyPoint>& keypoints,
  516.                          int maxCount, const PatchGenerator& patchGenerator) const;
  517.     void setVerbose(bool verbose);
  518.     
  519.     void read(const FileNode& node);
  520.     void write(FileStorage& fs, const String& name=String()) const;
  521.     
  522.     int radius;
  523.     int threshold;
  524.     int nOctaves;
  525.     int nViews;
  526.     bool verbose;
  527.     
  528.     double baseFeatureSize;
  529.     double clusteringDistance;
  530. };
  531. typedef LDetector YAPE;
  532. class CV_EXPORTS FernClassifier
  533. {
  534. public:
  535.     FernClassifier();
  536.     FernClassifier(const FileNode& node);
  537.     FernClassifier(const vector<Point2f>& points,
  538.                    const vector<Ptr<Mat> >& refimgs,
  539.                    const vector<int>& labels=vector<int>(),
  540.                    int _nclasses=0, int _patchSize=PATCH_SIZE,
  541.                    int _signatureSize=DEFAULT_SIGNATURE_SIZE,
  542.                    int _nstructs=DEFAULT_STRUCTS,
  543.                    int _structSize=DEFAULT_STRUCT_SIZE,
  544.                    int _nviews=DEFAULT_VIEWS,
  545.                    int _compressionMethod=COMPRESSION_NONE,
  546.                    const PatchGenerator& patchGenerator=PatchGenerator());
  547.     virtual ~FernClassifier();
  548.     virtual void read(const FileNode& n);
  549.     virtual void write(FileStorage& fs, const String& name=String()) const;
  550.     virtual void trainFromSingleView(const Mat& image,
  551.                                      const vector<KeyPoint>& keypoints,
  552.                                      int _patchSize=PATCH_SIZE,
  553.                                      int _signatureSize=DEFAULT_SIGNATURE_SIZE,
  554.                                      int _nstructs=DEFAULT_STRUCTS,
  555.                                      int _structSize=DEFAULT_STRUCT_SIZE,
  556.                                      int _nviews=DEFAULT_VIEWS,
  557.                                      int _compressionMethod=COMPRESSION_NONE,
  558.                                      const PatchGenerator& patchGenerator=PatchGenerator());
  559.     virtual void train(const vector<Point2f>& points,
  560.                        const vector<Ptr<Mat> >& refimgs,
  561.                        const vector<int>& labels=vector<int>(),
  562.                        int _nclasses=0, int _patchSize=PATCH_SIZE,
  563.                        int _signatureSize=DEFAULT_SIGNATURE_SIZE,
  564.                        int _nstructs=DEFAULT_STRUCTS,
  565.                        int _structSize=DEFAULT_STRUCT_SIZE,
  566.                        int _nviews=DEFAULT_VIEWS,
  567.                        int _compressionMethod=COMPRESSION_NONE,
  568.                        const PatchGenerator& patchGenerator=PatchGenerator());
  569.     virtual int operator()(const Mat& img, Point2f kpt, vector<float>& signature) const;
  570.     virtual int operator()(const Mat& patch, vector<float>& signature) const;
  571.     virtual void clear();
  572.     void setVerbose(bool verbose);
  573.     
  574.     int getClassCount() const;
  575.     int getStructCount() const;
  576.     int getStructSize() const;
  577.     int getSignatureSize() const;
  578.     int getCompressionMethod() const;
  579.     Size getPatchSize() const;    
  580.     
  581.     struct Feature
  582.     {
  583.         uchar x1, y1, x2, y2;
  584.         Feature() : x1(0), y1(0), x2(0), y2(0) {}
  585.         Feature(int _x1, int _y1, int _x2, int _y2)
  586.         : x1((uchar)_x1), y1((uchar)_y1), x2((uchar)_x2), y2((uchar)_y2)
  587.         {}
  588.         template<typename _Tp> bool operator ()(const Mat_<_Tp>& patch) const
  589.         { return patch(y1,x1) > patch(y2, x2); }
  590.     };
  591.     
  592.     enum
  593.     {
  594.         PATCH_SIZE = 31,
  595.         DEFAULT_STRUCTS = 50,
  596.         DEFAULT_STRUCT_SIZE = 9,
  597.         DEFAULT_VIEWS = 5000,
  598.         DEFAULT_SIGNATURE_SIZE = 176,
  599.         COMPRESSION_NONE = 0,
  600.         COMPRESSION_RANDOM_PROJ = 1,
  601.         COMPRESSION_PCA = 2,
  602.         DEFAULT_COMPRESSION_METHOD = COMPRESSION_NONE
  603.     };
  604.     
  605. protected:
  606.     virtual void prepare(int _nclasses, int _patchSize, int _signatureSize,
  607.                          int _nstructs, int _structSize,
  608.                          int _nviews, int _compressionMethod);
  609.     virtual void finalize(RNG& rng);
  610.     virtual int getLeaf(int fidx, const Mat& patch) const;
  611.     
  612.     bool verbose;
  613.     int nstructs;
  614.     int structSize;
  615.     int nclasses;
  616.     int signatureSize;
  617.     int compressionMethod;
  618.     int leavesPerStruct;
  619.     Size patchSize;
  620.     vector<Feature> features;
  621.     vector<int> classCounters;
  622.     vector<float> posteriors;
  623. };
  624. class CV_EXPORTS PlanarObjectDetector
  625. {
  626. public:
  627.     PlanarObjectDetector();
  628.     PlanarObjectDetector(const FileNode& node);
  629.     PlanarObjectDetector(const vector<Mat>& pyr, int _npoints=300,
  630.                          int _patchSize=FernClassifier::PATCH_SIZE,
  631.                          int _nstructs=FernClassifier::DEFAULT_STRUCTS,
  632.                          int _structSize=FernClassifier::DEFAULT_STRUCT_SIZE,
  633.                          int _nviews=FernClassifier::DEFAULT_VIEWS,
  634.                          const LDetector& detector=LDetector(),
  635.                          const PatchGenerator& patchGenerator=PatchGenerator()); 
  636.     virtual ~PlanarObjectDetector();
  637.     virtual void train(const vector<Mat>& pyr, int _npoints=300,
  638.                        int _patchSize=FernClassifier::PATCH_SIZE,
  639.                        int _nstructs=FernClassifier::DEFAULT_STRUCTS,
  640.                        int _structSize=FernClassifier::DEFAULT_STRUCT_SIZE,
  641.                        int _nviews=FernClassifier::DEFAULT_VIEWS,
  642.                        const LDetector& detector=LDetector(),
  643.                        const PatchGenerator& patchGenerator=PatchGenerator());
  644.     virtual void train(const vector<Mat>& pyr, const vector<KeyPoint>& keypoints,
  645.                        int _patchSize=FernClassifier::PATCH_SIZE,
  646.                        int _nstructs=FernClassifier::DEFAULT_STRUCTS,
  647.                        int _structSize=FernClassifier::DEFAULT_STRUCT_SIZE,
  648.                        int _nviews=FernClassifier::DEFAULT_VIEWS,
  649.                        const LDetector& detector=LDetector(),
  650.                        const PatchGenerator& patchGenerator=PatchGenerator());
  651.     Rect getModelROI() const;
  652.     vector<KeyPoint> getModelPoints() const;
  653.     const LDetector& getDetector() const;
  654.     const FernClassifier& getClassifier() const;
  655.     void setVerbose(bool verbose);
  656.     
  657.     void read(const FileNode& node);
  658.     void write(FileStorage& fs, const String& name=String()) const;
  659.     bool operator()(const Mat& image, Mat& H, vector<Point2f>& corners) const;
  660.     bool operator()(const vector<Mat>& pyr, const vector<KeyPoint>& keypoints,
  661.                     Mat& H, vector<Point2f>& corners, vector<int>* pairs=0) const;
  662.     
  663. protected:
  664.     bool verbose;
  665.     Rect modelROI;
  666.     vector<KeyPoint> modelPoints;
  667.     LDetector ldetector;
  668.     FernClassifier fernClassifier;
  669. };
  670. ////////////////////////////////////////////////////////////////////////////////////////////////////    
  671. //                                        One-Way Descriptor                                      //
  672. ////////////////////////////////////////////////////////////////////////////////////////////////////    
  673. class AffinePose;
  674.     
  675. // OneWayDescriptor: incapsulates a descriptor for a single point 
  676. class CV_EXPORTS OneWayDescriptor
  677. {
  678. public:
  679.     OneWayDescriptor();
  680.     ~OneWayDescriptor();
  681.     
  682.     // allocates memory for given descriptor parameters
  683.     void Allocate(int pose_count, Size size, int nChannels);
  684.     
  685.     // GenerateSamples: generates affine transformed patches with averaging them over small transformation variations.
  686.     // If external poses and transforms were specified, uses them instead of generating random ones
  687.     // - pose_count: the number of poses to be generated
  688.     // - frontal: the input patch (can be a roi in a larger image)
  689.     // - norm: if nonzero, normalizes the output patch so that the sum of pixel intensities is 1
  690.     void GenerateSamples(int pose_count, IplImage* frontal, int norm = 0);
  691.     
  692.     // GenerateSamplesFast: generates affine transformed patches with averaging them over small transformation variations.
  693.     // Uses precalculated transformed pca components.
  694.     // - frontal: the input patch (can be a roi in a larger image)
  695.     // - pca_hr_avg: pca average vector
  696.     // - pca_hr_eigenvectors: pca eigenvectors
  697.     // - pca_descriptors: an array of precomputed descriptors of pca components containing their affine transformations
  698.     //   pca_descriptors[0] corresponds to the average, pca_descriptors[1]-pca_descriptors[pca_dim] correspond to eigenvectors
  699.     void GenerateSamplesFast(IplImage* frontal, CvMat* pca_hr_avg, 
  700.                              CvMat* pca_hr_eigenvectors, OneWayDescriptor* pca_descriptors);
  701.     
  702.     // sets the poses and corresponding transforms
  703.     void SetTransforms(AffinePose* poses, CvMat** transforms);
  704.     
  705.     // Initialize: builds a descriptor. 
  706.     // - pose_count: the number of poses to build. If poses were set externally, uses them rather than generating random ones
  707.     // - frontal: input patch. Can be a roi in a larger image
  708.     // - feature_name: the feature name to be associated with the descriptor
  709.     // - norm: if 1, the affine transformed patches are normalized so that their sum is 1 
  710.     void Initialize(int pose_count, IplImage* frontal, const char* feature_name = 0, int norm = 0);
  711.     
  712.     // InitializeFast: builds a descriptor using precomputed descriptors of pca components
  713.     // - pose_count: the number of poses to build
  714.     // - frontal: input patch. Can be a roi in a larger image
  715.     // - feature_name: the feature name to be associated with the descriptor
  716.     // - pca_hr_avg: average vector for PCA
  717.     // - pca_hr_eigenvectors: PCA eigenvectors (one vector per row)
  718.     // - pca_descriptors: precomputed descriptors of PCA components, the first descriptor for the average vector
  719.     // followed by the descriptors for eigenvectors
  720.     void InitializeFast(int pose_count, IplImage* frontal, const char* feature_name, 
  721.                         CvMat* pca_hr_avg, CvMat* pca_hr_eigenvectors, OneWayDescriptor* pca_descriptors);
  722.     
  723.     // ProjectPCASample: unwarps an image patch into a vector and projects it into PCA space
  724.     // - patch: input image patch
  725.     // - avg: PCA average vector
  726.     // - eigenvectors: PCA eigenvectors, one per row
  727.     // - pca_coeffs: output PCA coefficients
  728.     void ProjectPCASample(IplImage* patch, CvMat* avg, CvMat* eigenvectors, CvMat* pca_coeffs) const;
  729.     
  730.     // InitializePCACoeffs: projects all warped patches into PCA space
  731.     // - avg: PCA average vector
  732.     // - eigenvectors: PCA eigenvectors, one per row    
  733.     void InitializePCACoeffs(CvMat* avg, CvMat* eigenvectors);
  734.     
  735.     // EstimatePose: finds the closest match between an input patch and a set of patches with different poses
  736.     // - patch: input image patch
  737.     // - pose_idx: the output index of the closest pose
  738.     // - distance: the distance to the closest pose (L2 distance)
  739.     void EstimatePose(IplImage* patch, int& pose_idx, float& distance) const;
  740.     
  741.     // EstimatePosePCA: finds the closest match between an input patch and a set of patches with different poses. 
  742.     // The distance between patches is computed in PCA space
  743.     // - patch: input image patch
  744.     // - pose_idx: the output index of the closest pose
  745.     // - distance: distance to the closest pose (L2 distance in PCA space)
  746.     // - avg: PCA average vector. If 0, matching without PCA is used
  747.     // - eigenvectors: PCA eigenvectors, one per row
  748.     void EstimatePosePCA(IplImage* patch, int& pose_idx, float& distance, CvMat* avg, CvMat* eigenvalues) const;
  749.     
  750.     // GetPatchSize: returns the size of each image patch after warping (2 times smaller than the input patch) 
  751.     Size GetPatchSize() const
  752.     {
  753.         return m_patch_size;
  754.     }
  755.     
  756.     // GetInputPatchSize: returns the required size of the patch that the descriptor is built from 
  757.     // (2 time larger than the patch after warping)
  758.     Size GetInputPatchSize() const
  759.     {
  760.         return cvSize(m_patch_size.width*2, m_patch_size.height*2);
  761.     }
  762.     
  763.     // GetPatch: returns a patch corresponding to specified pose index
  764.     // - index: pose index
  765.     // - return value: the patch corresponding to specified pose index
  766.     IplImage* GetPatch(int index);
  767.     
  768.     // GetPose: returns a pose corresponding to specified pose index
  769.     // - index: pose index
  770.     // - return value: the pose corresponding to specified pose index
  771.     AffinePose GetPose(int index) const;
  772.     
  773.     // Save: saves all patches with different poses to a specified path
  774.     void Save(const char* path);
  775.     
  776.     // ReadByName: reads a descriptor from a file storage
  777.     // - fs: file storage
  778.     // - parent: parent node
  779.     // - name: node name
  780.     // - return value: 1 if succeeded, 0 otherwise
  781.     int ReadByName(CvFileStorage* fs, CvFileNode* parent, const char* name);
  782.     
  783.     // Write: writes a descriptor into a file storage
  784.     // - fs: file storage
  785.     // - name: node name
  786.     void Write(CvFileStorage* fs, const char* name);
  787.     
  788.     // GetFeatureName: returns a name corresponding to a feature
  789.     const char* GetFeatureName() const;
  790.     
  791.     // GetCenter: returns the center of the feature
  792.     Point GetCenter() const;
  793.     
  794.     void SetPCADimHigh(int pca_dim_high) {m_pca_dim_high = pca_dim_high;};
  795.     void SetPCADimLow(int pca_dim_low) {m_pca_dim_low = pca_dim_low;};
  796.     
  797. protected:
  798.     int m_pose_count; // the number of poses
  799.     Size m_patch_size; // size of each image
  800.     IplImage** m_samples; // an array of length m_pose_count containing the patch in different poses 
  801.     CvMat** m_pca_coeffs; // an array of length m_pose_count containing pca decomposition of the patch in different poses
  802.     AffinePose* m_affine_poses; // an array of poses
  803.     CvMat** m_transforms; // an array of affine transforms corresponding to poses
  804.     
  805.     String m_feature_name; // the name of the feature associated with the descriptor
  806.     Point m_center; // the coordinates of the feature (the center of the input image ROI)
  807.     
  808.     int m_pca_dim_high; // the number of descriptor pca components to use for generating affine poses
  809.     int m_pca_dim_low; // the number of pca components to use for comparison
  810. };
  811. CV_EXPORTS void findOneWayDescriptor(int desc_count, const OneWayDescriptor* descriptors,
  812.                                      IplImage* patch, int& desc_idx, int& pose_idx, float& distance, 
  813.                                      CvMat* avg = 0, CvMat* eigenvalues = 0);
  814. CV_EXPORTS void findOneWayDescriptor(int desc_count, const OneWayDescriptor* descriptors, IplImage* patch, 
  815.                                      float scale_min, float scale_max, float scale_step,
  816.                                      int& desc_idx, int& pose_idx, float& distance, float& scale, 
  817.                                      CvMat* avg, CvMat* eigenvectors);
  818.     
  819.     
  820. // OneWayDescriptorBase: encapsulates functionality for training/loading a set of one way descriptors
  821. // and finding the nearest closest descriptor to an input feature
  822. class CV_EXPORTS OneWayDescriptorBase
  823. {
  824. public:
  825.     
  826.     // creates an instance of OneWayDescriptor from a set of training files
  827.     // - patch_size: size of the input (large) patch
  828.     // - pose_count: the number of poses to generate for each descriptor
  829.     // - train_path: path to training files
  830.     // - pca_config: the name of the file that contains PCA for small patches (2 times smaller
  831.     // than patch_size each dimension
  832.     // - pca_hr_config: the name of the file that contains PCA for large patches (of patch_size size)
  833.     // - pca_desc_config: the name of the file that contains descriptors of PCA components
  834.     OneWayDescriptorBase(Size patch_size, int pose_count, const char* train_path = 0, const char* pca_config = 0, 
  835.                          const char* pca_hr_config = 0, const char* pca_desc_config = 0, int pyr_levels = 2, 
  836.                          int pca_dim_high = 100, int pca_dim_low = 100);
  837.     
  838.     ~OneWayDescriptorBase();
  839.     
  840.     // Allocate: allocates memory for a given number of descriptors
  841.     void Allocate(int train_feature_count);
  842.     
  843.     // AllocatePCADescriptors: allocates memory for pca descriptors
  844.     void AllocatePCADescriptors();
  845.     
  846.     // returns patch size
  847.     Size GetPatchSize() const {return m_patch_size;};
  848.     // returns the number of poses for each descriptor
  849.     int GetPoseCount() const {return m_pose_count;};
  850.     
  851.     // returns the number of pyramid levels
  852.     int GetPyrLevels() const {return m_pyr_levels;};
  853.     
  854.     // CreateDescriptorsFromImage: creates descriptors for each of the input features
  855.     // - src: input image
  856.     // - features: input features
  857.     // - pyr_levels: the number of pyramid levels
  858.     void CreateDescriptorsFromImage(IplImage* src, const vector<KeyPoint>& features);
  859.     
  860.     // CreatePCADescriptors: generates descriptors for PCA components, needed for fast generation of feature descriptors
  861.     void CreatePCADescriptors();
  862.     
  863.     // returns a feature descriptor by feature index
  864.     const OneWayDescriptor* GetDescriptor(int desc_idx) const;
  865.     
  866.     // FindDescriptor: finds the closest descriptor
  867.     // - patch: input image patch
  868.     // - desc_idx: output index of the closest descriptor to the input patch
  869.     // - pose_idx: output index of the closest pose of the closest descriptor to the input patch
  870.     // - distance: distance from the input patch to the closest feature pose
  871.     void FindDescriptor(IplImage* patch, int& desc_idx, int& pose_idx, float& distance) const;
  872.     
  873.     // FindDescriptor: finds the closest descriptor
  874.     // - src: input image 
  875.     // - pt: center of the feature
  876.     // - desc_idx: output index of the closest descriptor to the input patch
  877.     // - pose_idx: output index of the closest pose of the closest descriptor to the input patch
  878.     // - distance: distance from the input patch to the closest feature pose
  879.     void FindDescriptor(IplImage* src, Point2f pt, int& desc_idx, int& pose_idx, float& distance) const;
  880.     
  881.     // InitializePoses: generates random poses
  882.     void InitializePoses();
  883.     
  884.     // InitializeTransformsFromPoses: generates 2x3 affine matrices from poses (initializes m_transforms)
  885.     void InitializeTransformsFromPoses();
  886.     
  887.     // InitializePoseTransforms: subsequently calls InitializePoses and InitializeTransformsFromPoses
  888.     void InitializePoseTransforms();
  889.     
  890.     // InitializeDescriptor: initializes a descriptor
  891.     // - desc_idx: descriptor index
  892.     // - train_image: image patch (ROI is supported)
  893.     // - feature_label: feature textual label
  894.     void InitializeDescriptor(int desc_idx, IplImage* train_image, const char* feature_label);
  895.     
  896.     // InitializeDescriptors: load features from an image and create descriptors for each of them 
  897.     void InitializeDescriptors(IplImage* train_image, const vector<KeyPoint>& features, 
  898.                                const char* feature_label = "", int desc_start_idx = 0);
  899.     
  900.     // LoadPCADescriptors: loads PCA descriptors from a file
  901.     // - filename: input filename
  902.     int LoadPCADescriptors(const char* filename);
  903.     
  904.     // SavePCADescriptors: saves PCA descriptors to a file
  905.     // - filename: output filename
  906.     void SavePCADescriptors(const char* filename);
  907.     
  908.     // SetPCAHigh: sets the high resolution pca matrices (copied to internal structures)
  909.     void SetPCAHigh(CvMat* avg, CvMat* eigenvectors);
  910.     
  911.     // SetPCALow: sets the low resolution pca matrices (copied to internal structures)
  912.     void SetPCALow(CvMat* avg, CvMat* eigenvectors);
  913.     
  914.     
  915. protected:
  916.     Size m_patch_size; // patch size
  917.     int m_pose_count; // the number of poses for each descriptor
  918.     int m_train_feature_count; // the number of the training features
  919.     OneWayDescriptor* m_descriptors; // array of train feature descriptors
  920.     CvMat* m_pca_avg; // PCA average vector for small patches
  921.     CvMat* m_pca_eigenvectors; // PCA eigenvectors for small patches
  922.     CvMat* m_pca_hr_avg; // PCA average vector for large patches
  923.     CvMat* m_pca_hr_eigenvectors; // PCA eigenvectors for large patches
  924.     OneWayDescriptor* m_pca_descriptors; // an array of PCA descriptors
  925.     
  926.     AffinePose* m_poses; // array of poses
  927.     CvMat** m_transforms; // array of affine transformations corresponding to poses
  928.     
  929.     int m_pca_dim_high;
  930.     int m_pca_dim_low;
  931.     
  932.     int m_pyr_levels;
  933. };
  934. class CV_EXPORTS OneWayDescriptorObject : public OneWayDescriptorBase
  935. {
  936. public:
  937.     // creates an instance of OneWayDescriptorObject from a set of training files
  938.     // - patch_size: size of the input (large) patch
  939.     // - pose_count: the number of poses to generate for each descriptor
  940.     // - train_path: path to training files
  941.     // - pca_config: the name of the file that contains PCA for small patches (2 times smaller
  942.     // than patch_size each dimension
  943.     // - pca_hr_config: the name of the file that contains PCA for large patches (of patch_size size)
  944.     // - pca_desc_config: the name of the file that contains descriptors of PCA components
  945.     OneWayDescriptorObject(Size patch_size, int pose_count, const char* train_path, const char* pca_config, 
  946.                            const char* pca_hr_config = 0, const char* pca_desc_config = 0, int pyr_levels = 2);
  947.     
  948.     ~OneWayDescriptorObject();
  949.     
  950.     // Allocate: allocates memory for a given number of features
  951.     // - train_feature_count: the total number of features
  952.     // - object_feature_count: the number of features extracted from the object 
  953.     void Allocate(int train_feature_count, int object_feature_count);
  954.     
  955.     
  956.     void SetLabeledFeatures(const vector<KeyPoint>& features) {m_train_features = features;};
  957.     vector<KeyPoint>& GetLabeledFeatures() {return m_train_features;};
  958.     const vector<KeyPoint>& GetLabeledFeatures() const {return m_train_features;};
  959.     
  960.     // IsDescriptorObject: returns 1 if descriptor with specified index is positive, otherwise 0
  961.     int IsDescriptorObject(int desc_idx) const;
  962.     
  963.     // MatchPointToPart: returns the part number of a feature if it matches one of the object parts, otherwise -1
  964.     int MatchPointToPart(Point pt) const;
  965.     
  966.     // GetDescriptorPart: returns the part number of the feature corresponding to a specified descriptor  
  967.     // - desc_idx: descriptor index
  968.     int GetDescriptorPart(int desc_idx) const;
  969.     
  970.     // GetTrainFeatures: returns a set of training features
  971.     const vector<KeyPoint>& GetTrainFeatures() const {return m_train_features;};
  972.     vector<KeyPoint> _GetTrainFeatures() const;
  973.     
  974.     void InitializeObjectDescriptors(IplImage* train_image, const vector<KeyPoint>& features, 
  975.                                      const char* feature_label, int desc_start_idx = 0, float scale = 1.0f);
  976.     
  977. protected:
  978.     int* m_part_id; // contains part id for each of object descriptors
  979.     vector<KeyPoint> m_train_features; // train features
  980.     int m_object_feature_count; // the number of the positive features
  981. };
  982. // detect corners using FAST algorithm
  983. CV_EXPORTS void FAST( const Mat& image, vector<KeyPoint>& keypoints, int threshold, bool nonmax_supression=true );
  984. class CV_EXPORTS LevMarqSparse
  985. {
  986. public:
  987.     LevMarqSparse();
  988.     LevMarqSparse(int npoints, // number of points
  989.             int ncameras, // number of cameras
  990.             int nPointParams, // number of params per one point  (3 in case of 3D points)
  991.             int nCameraParams, // number of parameters per one camera
  992.             int nErrParams, // number of parameters in measurement vector
  993.                             // for 1 point at one camera (2 in case of 2D projections)
  994.             Mat& visibility, // visibility matrix. rows correspond to points, columns correspond to cameras
  995.                              // 1 - point is visible for the camera, 0 - invisible
  996.             Mat& P0, // starting vector of parameters, first cameras then points
  997.             Mat& X, // measurements, in order of visibility. non visible cases are skipped 
  998.             TermCriteria criteria, // termination criteria
  999.             
  1000.             // callback for estimation of Jacobian matrices
  1001.             void (CV_CDECL * fjac)(int i, int j, Mat& point_params,
  1002.                                    Mat& cam_params, Mat& A, Mat& B, void* data),
  1003.             // callback for estimation of backprojection errors
  1004.             void (CV_CDECL * func)(int i, int j, Mat& point_params,
  1005.                                    Mat& cam_params, Mat& estim, void* data),
  1006.             void* data // user-specific data passed to the callbacks
  1007.             );
  1008.     virtual ~LevMarqSparse();
  1009.     
  1010.     virtual void run( int npoints, // number of points
  1011.             int ncameras, // number of cameras
  1012.             int nPointParams, // number of params per one point  (3 in case of 3D points)
  1013.             int nCameraParams, // number of parameters per one camera
  1014.             int nErrParams, // number of parameters in measurement vector
  1015.                             // for 1 point at one camera (2 in case of 2D projections)
  1016.             Mat& visibility, // visibility matrix. rows correspond to points, columns correspond to cameras
  1017.                              // 1 - point is visible for the camera, 0 - invisible
  1018.             Mat& P0, // starting vector of parameters, first cameras then points
  1019.             Mat& X, // measurements, in order of visibility. non visible cases are skipped 
  1020.             TermCriteria criteria, // termination criteria
  1021.             
  1022.             // callback for estimation of Jacobian matrices
  1023.             void (CV_CDECL * fjac)(int i, int j, Mat& point_params,
  1024.                                    Mat& cam_params, Mat& A, Mat& B, void* data),
  1025.             // callback for estimation of backprojection errors
  1026.             void (CV_CDECL * func)(int i, int j, Mat& point_params,
  1027.                                    Mat& cam_params, Mat& estim, void* data),
  1028.             void* data // user-specific data passed to the callbacks
  1029.             );
  1030.     virtual void clear();
  1031.     
  1032.     // useful function to do simple bundle adjastment tasks
  1033.     static void bundleAdjust(vector<Point3d>& points, //positions of points in global coordinate system (input and output)
  1034.                              const vector<vector<Point2d> >& imagePoints, //projections of 3d points for every camera 
  1035.                              const vector<vector<int> >& visibility, //visibility of 3d points for every camera 
  1036.                              vector<Mat>& cameraMatrix, //intrinsic matrices of all cameras (input and output)
  1037.                              vector<Mat>& R, //rotation matrices of all cameras (input and output)
  1038.                              vector<Mat>& T, //translation vector of all cameras (input and output)
  1039.                              vector<Mat>& distCoeffs, //distortion coefficients of all cameras (input and output)
  1040.                              const TermCriteria& criteria=
  1041.                              TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
  1042.     
  1043. protected:
  1044.     virtual void optimize(); //main function that runs minimization
  1045.     
  1046.     //iteratively asks for measurement for visible camera-point pairs
  1047.     void ask_for_proj();                                        
  1048.     //iteratively asks for Jacobians for every camera_point pair
  1049.     void ask_for_projac();    
  1050.         
  1051.     CvMat* err; //error X-hX
  1052.     double prevErrNorm, errNorm;
  1053.     double lambda;
  1054.     CvTermCriteria criteria;
  1055.     int iters;
  1056.     
  1057.     CvMat** U; //size of array is equal to number of cameras
  1058.     CvMat** V; //size of array is equal to number of points
  1059.     CvMat** inv_V_star; //inverse of V*
  1060.     CvMat* A;
  1061.     CvMat* B;
  1062.     CvMat* W; 
  1063.     CvMat* X; //measurement 
  1064.     CvMat* hX; //current measurement extimation given new parameter vector 
  1065.     
  1066.     CvMat* prevP; //current already accepted parameter. 
  1067.     CvMat* P; // parameters used to evaluate function with new params
  1068.               // this parameters may be rejected 
  1069.     
  1070.     CvMat* deltaP; //computed increase of parameters (result of normal system solution )
  1071.     CvMat** ea; // sum_i  AijT * e_ij , used as right part of normal equation
  1072.                 // length of array is j = number of cameras  
  1073.     CvMat** eb; // sum_j  BijT * e_ij , used as right part of normal equation
  1074.                 // length of array is i = number of points
  1075.     CvMat** Yj; //length of array is i = num_points
  1076.     CvMat* S; //big matrix of block Sjk  , each block has size num_cam_params x num_cam_params 
  1077.     CvMat* JtJ_diag; //diagonal of JtJ,  used to backup diagonal elements before augmentation
  1078.     CvMat* Vis_index; // matrix which element is index of measurement for point i and camera j
  1079.                
  1080.     int num_cams;
  1081.     int num_points;
  1082.     int num_err_param;
  1083.     int num_cam_param;
  1084.     int num_point_param;
  1085.     //target function and jacobian pointers, which needs to be initialized 
  1086.     void (*fjac)(int i, int j, Mat& point_params, Mat& cam_params, Mat& A, Mat& B, void* data);
  1087.     void (*func)(int i, int j, Mat& point_params, Mat& cam_params, Mat& estim, void* data );
  1088.     void* data;
  1089. };
  1090. }
  1091. #endif /* __cplusplus */
  1092. #endif /* __CVAUX_HPP__ */
  1093. /* End of file. */