繁体   English   中英

Viola和Jones Haar在OpenCV 4.0.0中有所体现

[英]Viola and Jones Haar features in OpenCV 4.0.0

在OpenCV中的haarfeatures.cpp中,我看到了V&J Haar功能的以下实现:

 void CvHaarEvaluator::generateFeatures()
{
    int mode = ((const CvHaarFeatureParams*)((CvFeatureParams*)featureParams))->mode;
    int offset = winSize.width + 1;
    for( int x = 0; x < winSize.width; x++ )
    {
        for( int y = 0; y < winSize.height; y++ )
        {
            for( int dx = 1; dx <= winSize.width; dx++ )
            {
                for( int dy = 1; dy <= winSize.height; dy++ )
                {
                    // haar_x2
                    if ( (x+dx*2 <= winSize.width) && (y+dy <= winSize.height) )
                    {
                        features.push_back( Feature( offset, false,
                            x,    y, dx*2, dy, -1,
                            x+dx, y, dx  , dy, +2 ) );
                    }
                    // haar_y2
                    if ( (x+dx <= winSize.width) && (y+dy*2 <= winSize.height) )
                    {
                        features.push_back( Feature( offset, false,
                            x,    y, dx, dy*2, -1,
                            x, y+dy, dx, dy,   +2 ) );
                    }
                    // haar_x3
                    if ( (x+dx*3 <= winSize.width) && (y+dy <= winSize.height) )
                    {
                        features.push_back( Feature( offset, false,
                            x,    y, dx*3, dy, -1,
                            x+dx, y, dx  , dy, +3 ) );
                    }
                    // haar_y3
                    if ( (x+dx <= winSize.width) && (y+dy*3 <= winSize.height) )
                    {
                        features.push_back( Feature( offset, false,
                            x, y,    dx, dy*3, -1,
                            x, y+dy, dx, dy,   +3 ) );
                    }
                    // x2_y2
                    if ( (x+dx*2 <= winSize.width) && (y+dy*2 <= winSize.height) )
                    {
                        features.push_back( Feature( offset, false,
                            x,    y,    dx*2, dy*2, -1,
                            x,    y,    dx,   dy,   +2,
                            x+dx, y+dy, dx,   dy,   +2 ) );
                    }

                }
            }
        }
    }
    numFeatures = (int)features.size();
} 

其中每个特征由两个(haar_x2,haar_y2,haar_x3,haar_y3)或三个(x2_y2)矩形和对应的权重表示 ,以便从积分图像计算特征。

inline float CvHaarEvaluator::Feature::calc( const cv::Mat &_sum, const cv::Mat &_tilted, size_t y) const
{
    const int* img = tilted ? _tilted.ptr<int>((int)y) : _sum.ptr<int>((int)y);
    float ret = rect[0].weight * (img[fastRect[0].p0] - img[fastRect[0].p1] - img[fastRect[0].p2] + img[fastRect[0].p3] ) +
        rect[1].weight * (img[fastRect[1].p0] - img[fastRect[1].p1] - img[fastRect[1].p2] + img[fastRect[1].p3] );
    if( rect[2].weight != 0.0f )
        ret += rect[2].weight * (img[fastRect[2].p0] - img[fastRect[2].p1] - img[fastRect[2].p2] + img[fastRect[2].p3] );
    return ret;
}

对于haar_x2,配置为:

在此输入图像描述

所以第一个矩形(x, y, dx*2, dy)代表和A + B(重量-1),第二个矩形(x+dx, y, dx, dy)代表B(重量+2) )总结权重给出 - (A + B)+ 2 * B = B - A应该如此。 haar_y2也是如此

对于x2_y2,配置为:

在此输入图像描述

这里第一个矩形(x, y, dx*2, dy*2)代表(A + B + C + D),第二个矩形(x, y, dx, dy)代表A和第三个矩形(x+dx, y+dy, dx, dy)代表D所以我们应该得到权重 - (A + B + C + D)+ 2 * A + 2 * D = A + D - (B + C)。

但是对于haar_x3(和y3),配置是:

在此输入图像描述

所以第一个矩形(x, y, dx*3, dy)代表(A + B + C),第二个矩形(x+dx, y, dx, dy)代表B.

现在,我们得到权重 - (A + B + C)+ 3 * B = 2 * B - (A + C),而V&J文件指出

“三个矩形特征计算从中心矩形中的总和中减去的两个外部矩形内的总和”

在此输入图像描述

我把它读作B - (A + C)而不是2 * B - (A + C)!

我在这里错过了什么吗? 或者这是一个错误? 谁能证实这一点?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM