001package org.opencv.imgproc;
002
003import java.lang.Math;
004
005//javadoc:Moments
006public class Moments {
007
008    public double m00;
009    public double m10;
010    public double m01;
011    public double m20;
012    public double m11;
013    public double m02;
014    public double m30;
015    public double m21;
016    public double m12;
017    public double m03;
018
019    public double mu20;
020    public double mu11;
021    public double mu02;
022    public double mu30;
023    public double mu21;
024    public double mu12;
025    public double mu03;
026
027    public double nu20;
028    public double nu11;
029    public double nu02;
030    public double nu30;
031    public double nu21;
032    public double nu12;
033    public double nu03;
034
035    public Moments(
036        double m00,
037        double m10,
038        double m01,
039        double m20,
040        double m11,
041        double m02,
042        double m30,
043        double m21,
044        double m12,
045        double m03)
046    {
047        this.m00 = m00;
048        this.m10 = m10;
049        this.m01 = m01;
050        this.m20 = m20;
051        this.m11 = m11;
052        this.m02 = m02;
053        this.m30 = m30;
054        this.m21 = m21;
055        this.m12 = m12;
056        this.m03 = m03;
057        this.completeState();
058    }
059
060    public Moments() {
061        this(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
062    }
063
064    public Moments(double[] vals) {
065        set(vals);
066    }
067
068    public void set(double[] vals) {
069        if (vals != null) {
070            m00 = vals.length > 0 ? (int) vals[0] : 0;
071            m10 = vals.length > 1 ? (int) vals[1] : 0;
072            m01 = vals.length > 2 ? (int) vals[2] : 0;
073            m20 = vals.length > 3 ? (int) vals[3] : 0;
074            m11 = vals.length > 4 ? (int) vals[4] : 0;
075            m02 = vals.length > 5 ? (int) vals[5] : 0;
076            m30 = vals.length > 6 ? (int) vals[6] : 0;
077            m21 = vals.length > 7 ? (int) vals[7] : 0;
078            m12 = vals.length > 8 ? (int) vals[8] : 0;
079            m03 = vals.length > 9 ? (int) vals[9] : 0;
080            this.completeState();
081        } else {
082            m00 = 0;
083            m10 = 0;
084            m01 = 0;
085            m20 = 0;
086            m11 = 0;
087            m02 = 0;
088            m30 = 0;
089            m21 = 0;
090            m12 = 0;
091            m03 = 0;
092            mu20 = 0;
093            mu11 = 0;
094            mu02 = 0;
095            mu30 = 0;
096            mu21 = 0;
097            mu12 = 0;
098            mu03 = 0;
099            nu20 = 0;
100            nu11 = 0;
101            nu02 = 0;
102            nu30 = 0;
103            nu21 = 0;
104            nu12 = 0;
105            nu03 = 0;
106        }
107    }
108
109    @Override
110    public String toString() {
111        return "Moments [ " +
112            "\n" +
113            "m00=" + m00 + ", " +
114            "\n" +
115            "m10=" + m10 + ", " +
116            "m01=" + m01 + ", " +
117            "\n" +
118            "m20=" + m20 + ", " +
119            "m11=" + m11 + ", " +
120            "m02=" + m02 + ", " +
121            "\n" +
122            "m30=" + m30 + ", " +
123            "m21=" + m21 + ", " +
124            "m12=" + m12 + ", " +
125            "m03=" + m03 + ", " +
126            "\n" +
127            "mu20=" + mu20 + ", " +
128            "mu11=" + mu11 + ", " +
129            "mu02=" + mu02 + ", " +
130            "\n" +
131            "mu30=" + mu30 + ", " +
132            "mu21=" + mu21 + ", " +
133            "mu12=" + mu12 + ", " +
134            "mu03=" + mu03 + ", " +
135            "\n" +
136            "nu20=" + nu20 + ", " +
137            "nu11=" + nu11 + ", " +
138            "nu02=" + nu02 + ", " +
139            "\n" +
140            "nu30=" + nu30 + ", " +
141            "nu21=" + nu21 + ", " +
142            "nu12=" + nu12 + ", " +
143            "nu03=" + nu03 + ", " +
144            "\n]";
145    }
146
147    protected void completeState()
148    {
149        double cx = 0, cy = 0;
150        double mu20, mu11, mu02;
151        double inv_m00 = 0.0;
152
153        if( Math.abs(this.m00) > 0.00000001 )
154        {
155            inv_m00 = 1. / this.m00;
156            cx = this.m10 * inv_m00;
157            cy = this.m01 * inv_m00;
158        }
159
160        // mu20 = m20 - m10*cx
161        mu20 = this.m20 - this.m10 * cx;
162        // mu11 = m11 - m10*cy
163        mu11 = this.m11 - this.m10 * cy;
164        // mu02 = m02 - m01*cy
165        mu02 = this.m02 - this.m01 * cy;
166
167        this.mu20 = mu20;
168        this.mu11 = mu11;
169        this.mu02 = mu02;
170
171        // mu30 = m30 - cx*(3*mu20 + cx*m10)
172        this.mu30 = this.m30 - cx * (3 * mu20 + cx * this.m10);
173        mu11 += mu11;
174        // mu21 = m21 - cx*(2*mu11 + cx*m01) - cy*mu20
175        this.mu21 = this.m21 - cx * (mu11 + cx * this.m01) - cy * mu20;
176        // mu12 = m12 - cy*(2*mu11 + cy*m10) - cx*mu02
177        this.mu12 = this.m12 - cy * (mu11 + cy * this.m10) - cx * mu02;
178        // mu03 = m03 - cy*(3*mu02 + cy*m01)
179        this.mu03 = this.m03 - cy * (3 * mu02 + cy * this.m01);
180
181
182        double inv_sqrt_m00 = Math.sqrt(Math.abs(inv_m00));
183        double s2 = inv_m00*inv_m00, s3 = s2*inv_sqrt_m00;
184
185        this.nu20 = this.mu20*s2;
186        this.nu11 = this.mu11*s2;
187        this.nu02 = this.mu02*s2;
188        this.nu30 = this.mu30*s3;
189        this.nu21 = this.mu21*s3;
190        this.nu12 = this.mu12*s3;
191        this.nu03 = this.mu03*s3;
192
193    }
194
195    public double get_m00() { return this.m00; }
196    public double get_m10() { return this.m10; }
197    public double get_m01() { return this.m01; }
198    public double get_m20() { return this.m20; }
199    public double get_m11() { return this.m11; }
200    public double get_m02() { return this.m02; }
201    public double get_m30() { return this.m30; }
202    public double get_m21() { return this.m21; }
203    public double get_m12() { return this.m12; }
204    public double get_m03() { return this.m03; }
205    public double get_mu20() { return this.mu20; }
206    public double get_mu11() { return this.mu11; }
207    public double get_mu02() { return this.mu02; }
208    public double get_mu30() { return this.mu30; }
209    public double get_mu21() { return this.mu21; }
210    public double get_mu12() { return this.mu12; }
211    public double get_mu03() { return this.mu03; }
212    public double get_nu20() { return this.nu20; }
213    public double get_nu11() { return this.nu11; }
214    public double get_nu02() { return this.nu02; }
215    public double get_nu30() { return this.nu30; }
216    public double get_nu21() { return this.nu21; }
217    public double get_nu12() { return this.nu12; }
218    public double get_nu03() { return this.nu03; }
219
220    public void set_m00(double m00) { this.m00 = m00; }
221    public void set_m10(double m10) { this.m10 = m10; }
222    public void set_m01(double m01) { this.m01 = m01; }
223    public void set_m20(double m20) { this.m20 = m20; }
224    public void set_m11(double m11) { this.m11 = m11; }
225    public void set_m02(double m02) { this.m02 = m02; }
226    public void set_m30(double m30) { this.m30 = m30; }
227    public void set_m21(double m21) { this.m21 = m21; }
228    public void set_m12(double m12) { this.m12 = m12; }
229    public void set_m03(double m03) { this.m03 = m03; }
230    public void set_mu20(double mu20) { this.mu20 = mu20; }
231    public void set_mu11(double mu11) { this.mu11 = mu11; }
232    public void set_mu02(double mu02) { this.mu02 = mu02; }
233    public void set_mu30(double mu30) { this.mu30 = mu30; }
234    public void set_mu21(double mu21) { this.mu21 = mu21; }
235    public void set_mu12(double mu12) { this.mu12 = mu12; }
236    public void set_mu03(double mu03) { this.mu03 = mu03; }
237    public void set_nu20(double nu20) { this.nu20 = nu20; }
238    public void set_nu11(double nu11) { this.nu11 = nu11; }
239    public void set_nu02(double nu02) { this.nu02 = nu02; }
240    public void set_nu30(double nu30) { this.nu30 = nu30; }
241    public void set_nu21(double nu21) { this.nu21 = nu21; }
242    public void set_nu12(double nu12) { this.nu12 = nu12; }
243    public void set_nu03(double nu03) { this.nu03 = nu03; }
244}