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}