Я пытаюсь изменить каскадный классификатор OpenCV haar для конкретной цели и просмотрел его исходный код сверху вниз. Но я застрял на понимании самой последней части, которая вычисляет значение функции в строке 361 cascadedetect.hpp.
return optfeaturesPtr[featureIdx].calc(pwin) * varianceNormFactor;
и его подчасть для (а) вычисления взвешенной суммы каждого прямоугольника в строке 398-407 cascadedetect.hpp
inline float HaarEvaluator::OptFeature :: calc( const int* ptr ) const
{
float ret = weight[0] * CALC_SUM_OFS(ofs[0], ptr) +
weight[1] * CALC_SUM_OFS(ofs[1], ptr);
if( weight[2] != 0.0f )
ret += weight[2] * CALC_SUM_OFS(ofs[2], ptr);
return ret;
}
и (b) вычисление varianceNormFactor в строках 691-697 и 701 файла cascadedetect.cpp.
pwin = &sbuf.at<int>(pt) + s.layer_ofs;
const int* pq = (const int*)(pwin + sqofs);
int valsum = CALC_SUM_OFS(nofs, pwin);
unsigned valsqsum = (unsigned)(CALC_SUM_OFS(nofs, pq));
double area = normrect.area();
double nf = area * valsqsum - (double)valsum * valsum;
line:701 varianceNormFactor = (float)(1./nf);
Из моих небольших знаний я предполагаю, что «pwin» представляет собой фактическое окно, которое в данный момент выполняется, но (Q1) Что означает pq? Я не смог найти ни одной строки, которая дает значение в переменную sbuf (которая каким-то образом связана со всем вышеперечисленным)
Согласно статье Райнера Линхарта, упомянутой командой OpenCV, они использовали это уравнение для коррекции света. Но в этой статье они сказали, что мы можем вычислить σ, просто взглянув на 4 значения в интегральном изображении из квадрата каждого пикселя. (Q2) Но разве мы не должны вычитать среднее из каждого пикселя ПЕРЕД тем, как взять сумму квадратов, чтобы вычислить стандартное отклонение, или σ в этой статье представляет что-то другое?
И из источника я думаю, что уравнение, которое они использовали, должно быть похоже на вместо этого. (Q3) Итак, если возможно, где я могу получить математические расчеты этих кодов или подробные справочные материалы для этой части? Я просмотрел справочное руководство OpenCV, но ничего не нашел об этом.