Я пытаюсь изменить каскадный классификатор OpenCV для конкретной цели и изучил его исходный код сверху вниз. Но я застрял на понимании очень последней части, которая вычисляет значение функции в строке 361 cascadedetect.hpp
return optfeaturesPtr[featureIdx].calc(pwin) * varianceNormFactor;
и его подраздел для (a) вычисления взвешенной суммы каждого прямоугольника в строке 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, но ничего не нашел по этому поводу.
Задача ещё не решена.
Других решений пока нет …