using System; using System.Runtime.InteropServices; using System.Collections.Generic; namespace OpenCVForUnity.ImgprocModule { //javadoc:Moments [System.Serializable] public class Moments { public double m00; public double m10; public double m01; public double m20; public double m11; public double m02; public double m30; public double m21; public double m12; public double m03; public double mu20; public double mu11; public double mu02; public double mu30; public double mu21; public double mu12; public double mu03; public double nu20; public double nu11; public double nu02; public double nu30; public double nu21; public double nu12; public double nu03; public Moments ( double m00, double m10, double m01, double m20, double m11, double m02, double m30, double m21, double m12, double m03) { this.m00 = m00; this.m10 = m10; this.m01 = m01; this.m20 = m20; this.m11 = m11; this.m02 = m02; this.m30 = m30; this.m21 = m21; this.m12 = m12; this.m03 = m03; this.completeState (); } public Moments () : this (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) { } public Moments (double[] vals) { set (vals); } public void set (double[] vals) { if (vals != null) { m00 = vals.Length > 0 ? vals[0] : 0; m10 = vals.Length > 1 ? vals[1] : 0; m01 = vals.Length > 2 ? vals[2] : 0; m20 = vals.Length > 3 ? vals[3] : 0; m11 = vals.Length > 4 ? vals[4] : 0; m02 = vals.Length > 5 ? vals[5] : 0; m30 = vals.Length > 6 ? vals[6] : 0; m21 = vals.Length > 7 ? vals[7] : 0; m12 = vals.Length > 8 ? vals[8] : 0; m03 = vals.Length > 9 ? vals[9] : 0; this.completeState (); } else { m00 = 0; m10 = 0; m01 = 0; m20 = 0; m11 = 0; m02 = 0; m30 = 0; m21 = 0; m12 = 0; m03 = 0; mu20 = 0; mu11 = 0; mu02 = 0; mu30 = 0; mu21 = 0; mu12 = 0; mu03 = 0; nu20 = 0; nu11 = 0; nu02 = 0; nu30 = 0; nu21 = 0; nu12 = 0; nu03 = 0; } } //@Override public override string ToString () { return "Moments [ " + "\n" + "m00=" + m00 + ", " + "\n" + "m10=" + m10 + ", " + "m01=" + m01 + ", " + "\n" + "m20=" + m20 + ", " + "m11=" + m11 + ", " + "m02=" + m02 + ", " + "\n" + "m30=" + m30 + ", " + "m21=" + m21 + ", " + "m12=" + m12 + ", " + "m03=" + m03 + ", " + "\n" + "mu20=" + mu20 + ", " + "mu11=" + mu11 + ", " + "mu02=" + mu02 + ", " + "\n" + "mu30=" + mu30 + ", " + "mu21=" + mu21 + ", " + "mu12=" + mu12 + ", " + "mu03=" + mu03 + ", " + "\n" + "nu20=" + nu20 + ", " + "nu11=" + nu11 + ", " + "nu02=" + nu02 + ", " + "\n" + "nu30=" + nu30 + ", " + "nu21=" + nu21 + ", " + "nu12=" + nu12 + ", " + "nu03=" + nu03 + ", " + "\n]"; } protected void completeState () { double cx = 0, cy = 0; double mu20, mu11, mu02; double inv_m00 = 0.0; if (System.Math.Abs (this.m00) > 0.00000001) { inv_m00 = 1.0 / this.m00; cx = this.m10 * inv_m00; cy = this.m01 * inv_m00; } // mu20 = m20 - m10*cx mu20 = this.m20 - this.m10 * cx; // mu11 = m11 - m10*cy mu11 = this.m11 - this.m10 * cy; // mu02 = m02 - m01*cy mu02 = this.m02 - this.m01 * cy; this.mu20 = mu20; this.mu11 = mu11; this.mu02 = mu02; // mu30 = m30 - cx*(3*mu20 + cx*m10) this.mu30 = this.m30 - cx * (3 * mu20 + cx * this.m10); mu11 += mu11; // mu21 = m21 - cx*(2*mu11 + cx*m01) - cy*mu20 this.mu21 = this.m21 - cx * (mu11 + cx * this.m01) - cy * mu20; // mu12 = m12 - cy*(2*mu11 + cy*m10) - cx*mu02 this.mu12 = this.m12 - cy * (mu11 + cy * this.m10) - cx * mu02; // mu03 = m03 - cy*(3*mu02 + cy*m01) this.mu03 = this.m03 - cy * (3 * mu02 + cy * this.m01); double inv_sqrt_m00 = System.Math.Sqrt (System.Math.Abs (inv_m00)); double s2 = inv_m00 * inv_m00, s3 = s2 * inv_sqrt_m00; this.nu20 = this.mu20 * s2; this.nu11 = this.mu11 * s2; this.nu02 = this.mu02 * s2; this.nu30 = this.mu30 * s3; this.nu21 = this.mu21 * s3; this.nu12 = this.mu12 * s3; this.nu03 = this.mu03 * s3; } public double get_m00 () { return this.m00; } public double get_m10 () { return this.m10; } public double get_m01 () { return this.m01; } public double get_m20 () { return this.m20; } public double get_m11 () { return this.m11; } public double get_m02 () { return this.m02; } public double get_m30 () { return this.m30; } public double get_m21 () { return this.m21; } public double get_m12 () { return this.m12; } public double get_m03 () { return this.m03; } public double get_mu20 () { return this.mu20; } public double get_mu11 () { return this.mu11; } public double get_mu02 () { return this.mu02; } public double get_mu30 () { return this.mu30; } public double get_mu21 () { return this.mu21; } public double get_mu12 () { return this.mu12; } public double get_mu03 () { return this.mu03; } public double get_nu20 () { return this.nu20; } public double get_nu11 () { return this.nu11; } public double get_nu02 () { return this.nu02; } public double get_nu30 () { return this.nu30; } public double get_nu21 () { return this.nu21; } public double get_nu12 () { return this.nu12; } public double get_nu03 () { return this.nu03; } public void set_m00 (double m00) { this.m00 = m00; } public void set_m10 (double m10) { this.m10 = m10; } public void set_m01 (double m01) { this.m01 = m01; } public void set_m20 (double m20) { this.m20 = m20; } public void set_m11 (double m11) { this.m11 = m11; } public void set_m02 (double m02) { this.m02 = m02; } public void set_m30 (double m30) { this.m30 = m30; } public void set_m21 (double m21) { this.m21 = m21; } public void set_m12 (double m12) { this.m12 = m12; } public void set_m03 (double m03) { this.m03 = m03; } public void set_mu20 (double mu20) { this.mu20 = mu20; } public void set_mu11 (double mu11) { this.mu11 = mu11; } public void set_mu02 (double mu02) { this.mu02 = mu02; } public void set_mu30 (double mu30) { this.mu30 = mu30; } public void set_mu21 (double mu21) { this.mu21 = mu21; } public void set_mu12 (double mu12) { this.mu12 = mu12; } public void set_mu03 (double mu03) { this.mu03 = mu03; } public void set_nu20 (double nu20) { this.nu20 = nu20; } public void set_nu11 (double nu11) { this.nu11 = nu11; } public void set_nu02 (double nu02) { this.nu02 = nu02; } public void set_nu30 (double nu30) { this.nu30 = nu30; } public void set_nu21 (double nu21) { this.nu21 = nu21; } public void set_nu12 (double nu12) { this.nu12 = nu12; } public void set_nu03 (double nu03) { this.nu03 = nu03; } } }