• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15 // Third party copyrights are property of their respective owners.
16 //
17 // Redistribution and use in source and binary forms, with or without modification,
18 // are permitted provided that the following conditions are met:
19 //
20 //   * Redistribution's of source code must retain the above copyright notice,
21 //     this list of conditions and the following disclaimer.
22 //
23 //   * Redistribution's in binary form must reproduce the above copyright notice,
24 //     this list of conditions and the following disclaimer in the documentation
25 //     and/or other materials provided with the distribution.
26 //
27 //   * The name of the copyright holders may not be used to endorse or promote products
28 //     derived from this software without specific prior written permission.
29 //
30 // This software is provided by the copyright holders and contributors "as is" and
31 // any express or implied warranties, including, but not limited to, the implied
32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
33 // In no event shall the Intel Corporation or contributors be liable for any direct,
34 // indirect, incidental, special, exemplary, or consequential damages
35 // (including, but not limited to, procurement of substitute goods or services;
36 // loss of use, data, or profits; or business interruption) however caused
37 // and on any theory of liability, whether in contract, strict liability,
38 // or tort (including negligence or otherwise) arising in any way out of
39 // the use of this software, even if advised of the possibility of such damage.
40 //
41 //M*/
42 
43 #include <stdlib.h>
44 #include <math.h>
45 #include <vector>
46 
47 /****************************************************************************************\
48 *                                   For EMDL1 Framework                                 *
49 \****************************************************************************************/
50 typedef struct cvEMDEdge* cvPEmdEdge;
51 typedef struct cvEMDNode* cvPEmdNode;
52 struct cvEMDNode
53 {
54     int pos[3]; // grid position
55     float d; // initial value
56     int u;
57     // tree maintainance
58     int iLevel; // level in the tree, 0 means root
59     cvPEmdNode pParent; // pointer to its parent
60     cvPEmdEdge pChild;
61     cvPEmdEdge pPEdge; // point to the edge coming out from its parent
62 };
63 struct cvEMDEdge
64 {
65     float flow; // initial value
66     int iDir; // 1:outward, 0:inward
67     // tree maintainance
68     cvPEmdNode pParent; // point to its parent
69     cvPEmdNode pChild; // the child node
70     cvPEmdEdge pNxt; // next child/edge
71 };
72 typedef std::vector<cvEMDNode> cvEMDNodeArray;
73 typedef std::vector<cvEMDEdge> cvEMDEdgeArray;
74 typedef std::vector<cvEMDNodeArray> cvEMDNodeArray2D;
75 typedef std::vector<cvEMDEdgeArray> cvEMDEdgeArray2D;
76 typedef std::vector<float> floatArray;
77 typedef std::vector<floatArray> floatArray2D;
78 
79 /****************************************************************************************\
80 *                                   EMDL1 Class                                         *
81 \****************************************************************************************/
82 class EmdL1
83 {
84 public:
EmdL1()85     EmdL1()
86     {
87         m_pRoot	= NULL;
88         binsDim1 = 0;
89         binsDim2 = 0;
90         binsDim3 = 0;
91         dimension = 0;
92         nMaxIt = 500;
93     }
94 
~EmdL1()95     ~EmdL1()
96     {
97     }
98 
99     float getEMDL1(cv::Mat &sig1, cv::Mat &sig2);
100     void setMaxIteration(int _nMaxIt);
101 
102 private:
103     //-- SubFunctions called in the EMD algorithm
104     bool initBaseTrees(int n1=0, int n2=0, int n3=0);
105     bool fillBaseTrees(float *H1, float *H2);
106     bool greedySolution();
107     bool greedySolution2();
108     bool greedySolution3();
109     void initBVTree();
110     void updateSubtree(cvPEmdNode pRoot);
111     bool isOptimal();
112     void findNewSolution();
113     void findLoopFromEnterBV();
114     float compuTotalFlow();
115 
116 private:
117     int dimension;
118     int binsDim1, binsDim2, binsDim3; // the hitogram contains m_n1 rows and m_n2 columns
119     int nNBV; // number of Non-Basic Variables (NBV)
120     int nMaxIt;
121     cvEMDNodeArray2D m_Nodes; // all nodes
122     cvEMDEdgeArray2D m_EdgesRight; // all edges to right
123     cvEMDEdgeArray2D m_EdgesUp; // all edges to upward
124     std::vector<cvEMDNodeArray2D>	m_3dNodes; // all nodes for 3D
125     std::vector<cvEMDEdgeArray2D>	m_3dEdgesRight; // all edges to right, 3D
126     std::vector<cvEMDEdgeArray2D>	m_3dEdgesUp; // all edges to upward, 3D
127     std::vector<cvEMDEdgeArray2D>	m_3dEdgesDeep; // all edges to deep, 3D
128     std::vector<cvPEmdEdge> m_NBVEdges; // pointers to all NON-BV edges
129     std::vector<cvPEmdNode> m_auxQueue; // auxiliary node queue
130     cvPEmdNode m_pRoot; // root of the BV Tree
131     cvPEmdEdge m_pEnter; // Enter BV edge
132     int m_iEnter; // Enter BV edge, index in m_NBVEdges
133     cvPEmdEdge m_pLeave; // Leave BV edge
134     int m_nItr; // number of iteration
135     // auxiliary variables for searching a new loop
136     std::vector<cvPEmdEdge> m_fromLoop;
137     std::vector<cvPEmdEdge> m_toLoop;
138     int	m_iFrom;
139     int m_iTo;
140 };
141