Я пытаюсь реализовать модель активного внешнего вида. Я на этапе, где я вычисляю модель текстуры. Я реализовал алгоритм для применения фотометрической нормализации для каждой векторной текстуры (как, например, на этом веб-сайте) фотометрическая нормализация).
Моя проблема в том, что мой алгоритм не сходится. В моем коде есть ошибка, но я не могу ее найти. Может кто-нибудь помочь мне найти это?
Eigen::VectorXd getMeanTexture(std::vector<Eigen::VectorXd> &gi)
{
//gi array of texture vector //n => number of texture vectors
//nelt => number element into a texture vector
int n = gi.size(), nelt = gi[0].size();
Eigen::VectorXd mean = gi[0];
double dst = 1.;
//start algorithm
while(dst > 0.0001)
{
//normalized mean
mean = mean.array() - mean.mean(); //centred mean texture
double s = mean.array().pow(2).sum() / nelt;
mean = (mean.array())/sqrt(s); //normalized mean texture
Eigen::VectorXd tmp = VectorXd::Zero(nelt); //tempory mean texture
//match each texture vector at the mean
for(int i = 0; i < n; ++i)
{
double beta = gi[i].mean();
double alpha = gi[i].dot(mean);
gi[i] = (gi[i].array() - beta)/alpha;
tmp += gi[i];
}
//estimate the new mean vector
tmp /= n;
//compute distance between tmp and mean to know when to stop algorithm
dst = (mean - tmp).norm();
mean = tmp;
cout << dst << endl;
}
return mean;
}
Вот вывод моего алгоритма:
421.868
421.868
421.868
421.868
....
421.868
421.868
421.868
421.868
Задача ещё не решена.
Других решений пока нет …