c++ - 在 OpenCV 中是否有关于级联分类器的更详细引用?

标签 c++ opencv computer-vision viola-jones

我正在尝试将 OpenCV 的 haar 级联分类器修改为特定用途,并从上到下查看其源代码。但我坚持理解最后一部分,即在 cascadedetect.hpp 的第 361 行计算特征值

return optfeaturesPtr[featureIdx].calc(pwin) * varianceNormFactor;

cascadedetect.hpp 的第 398-407 行中的 (a) 计算每个矩形加权和的子部分

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 的论文,他们使用了 this equation用于光线校正。但是在本文中他们说我们可以通过查看每个像素正方形的积分图像中的 4 个值来计算 σ。 (Q2)但是我们不是应该在计算平方和之前从每个像素中减去平均值以计算标准偏差或本文中的 σ 代表不同的东西吗?

从源头上看,我认为他们使用的方程式一定很相似to this反而。 (Q3) 那么,如果可能的话,我在哪里可以获得这些代码背后的数学知识或这部分的详细引用资料?我已经阅读了 OpenCV 的引用手册,但没有找到任何相关信息。

最佳答案

(Q1) What does pq mean:

我认为它可能暗示“Pointer to Square”; 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 上检查过了,是的,它没有减去平均值。 我想因为 Haar 模式是对称的,例如对于 Horizo​​ntal 2,一个区域减去一个具有相同面积的区域。因此,效果总和为零,我们可以忽略它。

关于c++ - 在 OpenCV 中是否有关于级联分类器的更详细引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40320934/

相关文章:

computer-vision - 如何计算一台相机相对于第二台相机的外参数?

c++ - qt 错误 : undefined reference to `vtable for Thread'

c++ - 如何让 __declspec(thread) 在 Windows CE 上工作

python - 如何从 Python cv2、scikit 图像和 mahotas 中的 Internet URL 读取图像?

python - opencv:在 GPU 端裁剪图像

image-processing - 使用 OpenCV 检测标记

c++ - 在图算法中,确定节点是否被访问的最佳方法是什么?

c++ - 有什么办法可以使 SHFileOperation 成为模态吗?

c++ - openCV imdecode 工作缓慢

python - 从图像中获取两个图像,图像中有两个图像粘贴在一个文档中 - Python/C++