注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BeyondEgo

Welcome to Winsolider's yard! 超越自我,谁与争锋?

 
 
 

日志

 
 
关于我

本博为记事、畅聊、交友博客,邀你共同探讨人生、探讨成长,广交天下有志之士!愿与有相同兴趣爱好的你,共同学习、一起成长、收获喜悦!

网易考拉推荐

【原创】关于PatchGenerator类  

2013-06-09 12:31:15|  分类: TLD算法 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

该类是OPENCV中的一个类。

PatchGenerator的声明位于legacy.hpp中;

class CV_EXPORTS PatchGenerator

{

public:

    PatchGenerator();

    PatchGenerator(double _backgroundMin, double _backgroundMax,

                   double _noiseRange, bool _randomBlur=true,

                   double _lambdaMin=0.6, double _lambdaMax=1.5,

                   double _thetaMin=-CV_PI, double _thetaMax=CV_PI,

                   double _phiMin=-CV_PI, double _phiMax=CV_PI );

    void operator()(const Mat& image, Point2f pt, Mat& patch, Size patchSize, RNG& rng) const;

    void operator()(const Mat& image, const Mat& transform, Mat& patch,

                    Size patchSize, RNG& rng) const;

    void warpWholeImage(const Mat& image, Mat& matT, Mat& buf,

                        CV_OUT Mat& warped, int border, RNG& rng) const;

    void generateRandomTransform(Point2f srcCenter, Point2f dstCenter,

                                 CV_OUT Mat& transform, RNG& rng,

                                 bool inverse=falseconst;

    void setAffineParam(double lambda, double theta, double phi);

    ...

};

 

PatchGenerator的实现位于planardetect.cpp

void PatchGenerator::operator ()(const Mat& image, Point2f pt, Mat& patch, Size patchSize, RNG& rng) const

{

    double buffer[6];

    Mat_<double> T(2, 3, buffer);//定义仿射矩阵

 

    generateRandomTransform(pt, Point2f((patchSize.width-1)*0.5f, (patchSize.height-1)*0.5f), T, rng);//按要求生成仿射矩阵

    (*this)(image, T, patch, patchSize, rng);//使用仿射矩阵做变换。

}

 

//生成仿射矩阵函数

void PatchGenerator::generateRandomTransform(Point2f srcCenter, Point2f dstCenter,

                                             Mat& transform, RNG& rng, bool inverse) const

{...}

 

//使用仿射矩阵做仿射变换

void PatchGenerator::operator ()(const Mat& image, const Mat& T,

                                 Mat& patch, Size patchSize, RNG& rng) const

{

    patch.create( patchSize, image.type() );

    if( backgroundMin != backgroundMax )

    {

        rng.fill(patch, RNG::UNIFORM, Scalar::all(backgroundMin), Scalar::all(backgroundMax));

        warpAffine(image, patch, T, patchSize, INTER_LINEAR, BORDER_TRANSPARENT);

      //使用仿射矩阵T,对原图像做仿射变换,得到大小为patchSize的图像patch。

      //INTER_LINEAR,表示缩放时使用双线性插值

     //BORDER_TRANSPARENT表示仿射变换到原图像外的区域,不使用该函数。

    //更多详情,参考OPENCV2.3.*文档资料

    }

    else

        warpAffine(image, patch, T, patchSize, INTER_LINEAR, BORDER_CONSTANT, Scalar::all(backgroundMin));


    int ksize = randomBlur ? (unsigned)rng % 9 - 5 : 0;

    if( ksize > 0 )

    {

        ksize = ksize*2 + 1;

        GaussianBlur(patch, patch, Size(ksize, ksize), 0, 0);

    }


    if( noiseRange > 0 )

    {

        AutoBuffer<uchar> _noiseBuf( patchSize.width*patchSize.height*image.elemSize() );

        Mat noise(patchSize, image.type(), (uchar*)_noiseBuf);

        int delta = image.depth() == CV_8U ? 128 : image.depth() == CV_16U ? 32768 : 0;

        rng.fill(noise, RNG::NORMAL, Scalar::all(delta), Scalar::all(noiseRange));

        if( backgroundMin != backgroundMax )

            addWeighted(patch, 1, noise, 1, -delta, patch);

        else

        {

            for( int i = 0; i < patchSize.height; i++ )

            {

                uchar* prow = patch.ptr<uchar>(i);

                const uchar* nrow =  noise.ptr<uchar>(i);

                for( int j = 0; j < patchSize.width; j++ )

                    if( prow[j] != backgroundMin )

                        prow[j] = saturate_cast<uchar>(prow[j] + nrow[j] - delta);

            }

        }

    }

}


TLD::init()中:

generator = PatchGenerator (0,0,noise_init,true,1-scale_init,1+scale_init,-angle_init*CV_PI/180,angle_init*CV_PI/180,-angle_init*CV_PI/180,angle_init*CV_PI/180);

作用:

      初始化generator

            背景最小值:0

                       背景最大值:0

                       噪声范围:noise_init0到)

                       是否模糊化:true

                       最小尺度:1-scale_init

                       最大尺度:1+scale_init

                       (即尺度变化范围为:1-scale_init  1+scale_init

                       最小角度:-angle_init*CV_PI/180

                       最大角度:angle_init*CV_PI/180

                       (即旋转角度范围为-angle_init*CV_PI/180

    angle_init*CV_PI/180


TLD::generatePositiveData()中:

generator(frame,pt,warped,bbhull.size(),rng);

frame进行仿射变换,将仿射变换结果保存到warped

  评论这张
 
阅读(2966)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017