我正在尝试将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)计算行691-697中的varianceNormFactor和cascadedetect.cpp的701
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的论文,他们使用this equation进行光线校正。但是在本文中他们说我们只需要通过观察每个像素平方的积分图像中的4个值来计算σ。 (Q2)但是我们不应该从每个像素中减去平均值在采用平方和之前为了计算标准偏差或者本文中的σ代表不同的东西吗?
从源头上我认为他们使用的等式必须与to this相似。 (Q3)如果可能的话,我在哪里可以获得这些代码背后的数学或这部分的详细参考资料?我是红色OpenCV的参考手册,但没有找到任何相关信息。
答案 0 :(得分:0)
(Q1) What does pq mean:
我认为这可能意味着“指向正方形的指针”; OpenCV可以计算所有像素的平方并将其附加到缓冲区B。 因此,在进行规范化时,可以通过以下方式快速引用它:
当前窗口在B中的偏移量,即pwin。
B中基于pwin的B中当前窗口内每个像素的平方值的偏移量,即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上进行了检查,是的,它没有减去均值。 我猜因为Haar模式是对称的,例如对于水平2,一个区域减去一个具有相同面积的区域。因此,效果总计为零,我们可以忽略它。