Есть ли более подробная ссылка на каскадные классификаторы в OpenCV?

Я пытаюсь изменить каскадный классификатор 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, но ничего не нашел об этом.


person BilguunCH    schedule 29.10.2016    source источник


Ответы (1)


(Q1) What does pq mean:

Я думаю, что это может означать «Указатель на квадрат»; OpenCV может вычислить квадрат всех пикселей и добавить его в буфер B. Таким образом, при нормализации он может быстро ссылаться на него:

  1. смещение текущего окна в B, которое равно pwin.

  2. смещение квадратного значения для каждого пикселя в текущем окне в B на основе pwin, которое равно sqofs.

(Q2) But aren't we supposed to subtract average from each pixels BEFORE taking sum of squares in order to calculate standard deviation > or σ in this paper represent something different?

Я проверил это на OpenCV 3.4.4, и да, это НЕ вычитает среднее значение. Я предполагаю, что поскольку шаблон Хаара является симметричным, например, для Горизонтального 2 из одной области вычитается область с той же площадью. Следовательно, эффект сводится к нулю, и мы можем его игнорировать.

person chang jc    schedule 25.06.2019