我正在尝试将 OpenCV 的 haar Cascade Classifier 修改为特定用途,并从上到下查看其源代码。但我坚持理解最后一部分,即在 cascadedetect.hpp 的第 361 行计算特征值
return optfeaturesPtr[featureIdx].calc(pwin) * varianceNormFactor;
及其子部分用于 (a) 计算 cascadedetect.hpp 第 398-407 行中的每个矩形加权和
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) 计算 cascadedetect.cpp 的第 691-697 行和第 701 行中的 varianceNormFactor
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 团队提到的 Rainer Lienhart 的论文,他们使用这个方程进行光校正。但是在这篇论文中,他们说我们可以通过从每个像素的正方形中查看积分图像中的 4 个值来计算 σ。(Q2)但是我们不应该在取平方和之前从每个像素中减去平均值以计算标准偏差或本文中的 σ 代表不同的东西吗?
从源头上看,我认为他们使用的方程式必须与此类似。(Q3)所以如果可能的话,我在哪里可以获得这些代码背后的数学或这部分的详细参考资料?我已经红色 OpenCV 的参考手册,但没有找到任何关于它的信息。