64 m_nMaxNumberOfTriplets = 0;
65 m_nCurrentPosition = 0;
72 delete [] m_pTriplets;
83 delete [] m_pTriplets;
85 m_nMaxNumberOfTriplets = nMaxNumberOfTriplets;
86 m_nCurrentPosition = 0;
88 m_pTriplets =
new Vec3d[nMaxNumberOfTriplets];
93 if (m_nCurrentPosition >= m_nMaxNumberOfTriplets)
96 Math3d::SetVec(m_pTriplets[m_nCurrentPosition++],
float(r),
float(g),
float(b));
103 Mat3d rgb_covariance;
108 for (i = 0; i < m_nCurrentPosition; i++)
115 for (i = 0; i < m_nCurrentPosition; i++)
117 const float r = m_pTriplets[i].
x - rgb_mean.
x;
118 const float g = m_pTriplets[i].
y - rgb_mean.
y;
119 const float b = m_pTriplets[i].
z - rgb_mean.
z;
120 rgb_covariance.
r1 += r * r;
121 rgb_covariance.
r2 += r * g;
122 rgb_covariance.
r3 += r * b;
123 rgb_covariance.
r4 += r * g;
124 rgb_covariance.
r5 += g * g;
125 rgb_covariance.
r6 += g * b;
126 rgb_covariance.
r7 += r * b;
127 rgb_covariance.
r8 += g * b;
128 rgb_covariance.
r9 += b * b;
134 printf(
"mean = %f %f %f\n", rgb_mean.
x, rgb_mean.
y, rgb_mean.
z);
148 const float rd = (r - rgb_mean.
x);
149 const float gd = (g - rgb_mean.
y);
150 const float bd = (b - rgb_mean.
z);
152 return rd * rd + gd * gd + bd * bd;
157 FILE *f = fopen(pFileName,
"r");
161 if (fscanf(f,
"%f %f %f\n", &rgb_mean.
x, &rgb_mean.
y, &rgb_mean.
z) == EOF)
167 if (fscanf(f,
"%f %f %f %f %f %f %f %f %f\n",
168 &inverse_rgb_covariance.
r1, &inverse_rgb_covariance.
r2, &inverse_rgb_covariance.
r3,
169 &inverse_rgb_covariance.
r4, &inverse_rgb_covariance.
r5, &inverse_rgb_covariance.
r6,
170 &inverse_rgb_covariance.
r7, &inverse_rgb_covariance.
r8, &inverse_rgb_covariance.
r9) == EOF)
183 FILE *f = fopen(pFileName,
"w");
187 if (fprintf(f,
"%.10f %.10f %.10f\n", rgb_mean.
x, rgb_mean.
y, rgb_mean.
z) < 0)
193 if (fprintf(f,
"%.10f %.10f %.10f %.10f %.10f %.10f %.10f %.10f %.10f\n",
194 inverse_rgb_covariance.
r1, inverse_rgb_covariance.
r2, inverse_rgb_covariance.
r3,
195 inverse_rgb_covariance.
r4, inverse_rgb_covariance.
r5, inverse_rgb_covariance.
r6,
196 inverse_rgb_covariance.
r7, inverse_rgb_covariance.
r8, inverse_rgb_covariance.
r9) < 0)
void Invert(const Mat3d &matrix, Mat3d &result)
bool AddRGBTriplet(int r, int g, int b)
void SetInverseCovariance(const Mat3d &inverse_covariance)
bool LoadFromFile(const char *pFileName)
float EvaluateForm(const Vec3d &matrix1, const Mat3d &matrix2)
void Reset(int nMaxNumberOfTriplets)
void SetMean(const Vec3d &mean)
void CalculateColorModel()
void SubtractVecVec(const Vec3d &vector1, const Vec3d &vector2, Vec3d &result)
bool SaveToFile(const char *pFileName)
Data structure for the representation of a 3D vector.
void SetMat(Mat3d &matrix, float r1, float r2, float r3, float r4, float r5, float r6, float r7, float r8, float r9)
float CalculateColorDistanceSquared(int r, int g, int b)
void AddToVec(Vec3d &vec, const Vec3d &vectorToAdd)
Data structure for the representation of a 3x3 matrix.
void MulMatScalar(const Mat3d &matrix, float scalar, Mat3d &result)
void MulVecScalar(const Vec3d &vec, float scalar, Vec3d &result)
float CalculateColorProbability(const Vec3d &rgb)
void SetVec(Vec3d &vec, float x, float y, float z)