58 const GaussianMixtureDistributionBasePtr& gmm2,
62 std::vector<NormalDistributionPtr> g1, g2;
63 std::vector<float> w1, w2;
64 preprocessGMM(gmm1, g1, w1);
65 preprocessGMM(gmm2, g2, w2);
67 const float d11 = calcCrossSum(gmm1, g1, w1, gmm1, g1, w1);
68 const float d22 = calcCrossSum(gmm2, g2, w2, gmm2, g2, w2);
69 const float d12 = calcCrossSum(gmm1, g1, w1, gmm2, g2, w2);
71 const float isd = d11 + d22 - 2 * d12;
72 return normalize ? (isd / (d11 + d22)) : isd;
77 const GaussianMixtureDistributionBasePtr& gmm2)
override
79 return getDistance(gmm1, gmm2,
false);
84 const GaussianMixtureDistributionBasePtr& gmm2,
88 std::vector<NormalDistributionPtr> g1, g2;
89 std::vector<float> w1, w2;
90 preprocessGMM(gmm1, g1, w1);
91 preprocessGMM(gmm2, g2, w2);
93 const float d22 = calcCrossSum(gmm2, g2, w2, gmm2, g2, w2);
94 const float d12 = calcCrossSum(gmm1, g1, w1, gmm2, g2, w2);
96 return d11 + d22 - 2 * d12;
101 const GaussianMixtureComponent& comp2)
override
109 std::vector<NormalDistributionPtr> g;
110 std::vector<float> w;
111 preprocessGMM(gmm, g, w);
113 return calcCrossSum(gmm, g, w, gmm, g, w);
119 preprocessGMM(
const GaussianMixtureDistributionBasePtr& gmm,
120 std::vector<NormalDistributionPtr>& g,
121 std::vector<float>& w)
124 for (
int i = 0; i < gmm->size(); ++i)
126 GaussianMixtureComponent
c = gmm->getComponent(i);
127 g.push_back(NormalDistributionPtr::dynamicCast(
c.gaussian));
128 w.push_back(
c.weight);
133 calcCrossSum(
const GaussianMixtureDistributionBasePtr& gmm1,
134 std::vector<NormalDistributionPtr>& g1,
135 std::vector<float>& w1,
136 const GaussianMixtureDistributionBasePtr& gmm2,
137 std::vector<NormalDistributionPtr>& g2,
138 std::vector<float>& w2)
142 const int GMM2_SIZE = gmm2->size();
144 for (
int i = 0; i < gmm1->size(); ++i)
146 const float wi = w1[i];
147 const Eigen::Vector3f mi = g1[i]->toEigenMean();
150 for (
int j = 0; j < GMM2_SIZE; ++j)
152 const float f = evaluate3DGaussian(
153 mi, g2[j]->toEigenMean(),
pi + g2[j]->toEigenCovariance());
162 evaluate3DGaussian(
const Eigen::Vector3f& point,
163 const Eigen::Vector3f&
mean,
166 return evaluate3DGaussian(point,
mean, cov.inverse(), cov.determinant());
170 evaluate3DGaussian(
const Eigen::Vector3f& point,
171 const Eigen::Vector3f&
mean,
176 const float e = expf(inner);
178 static const float pm = powf(2 *
M_PI, -1.5f);
179 return pm * powf(covDet, -0.5) * e;