В исходном коде OpenCV вы найдете cvhaar.cpp
, который дает некоторое представление о том, как работает каскад Хаара. К сожалению, это, по сути, не комментарий, и документация не сильно помогает. Вот мое понимание того, как это работает.
В функции icvEvalHidHaarClassifier()
сумма вычисляется для функций одного CvHidHaarTreeNode
.
Если эта сумма меньше порогового значения, за «левым» узлом следует, и процесс повторяется. В противном случае «правый» узел повторяется, снова повторяется. Это отражено в следующем утверждении:
idx = sum < t ? node->left : node->right;
Цикл прерывается, когда «левый» или «правый» узел имеет отрицательное значение. В этом случае сумма больше не вычисляется для этой функции, но пороговое значение для этой функции возвращается как результат классификатора.
Я ставлю «влево» и «вправо» в кавычках, потому что, как вы говорите, они не имеют ничего общего с положением объекта. Вместо этого они отражают, в каком направлении «падает» каскад: ниже порога каскад падает влево , выше порога падает вправо .
Давайте теперь вернемся к представлению этих узлов. В XML вы увидите представление узлов не в виде индексов, а в виде значений:
<left_val>0.0337941907346249</left_val>
<right_val>0.8378106951713562</right_val>
Эти числа на самом деле являются узлами имен , которые ищутся с помощью cvGetFileNodeByName()
. Я не знаю точно, как это работает внутри OpenCV, но теперь я надеюсь, что у вас есть хотя бы лучшее представление о том, как работает каскад.