画像の局部的特徴(17)--DenseFeature

6418 ワード

原文:
http://blog.csdn.net/zhaocj/article/details/45198965
DenseFeature Detectorは、主に3 D VIZに使用される一定の密度と規則的な分布を持つ画像の特徴点を生成することができる.
DenseFeature Detectorの原理は、入力画像を大きさが等しいメッシュに分割し、各メッシュから特徴点として1画素を抽出することである.画像スケールピラミッドと同様に、この方法は異なる層画像の特徴点を生成することができ、各層画像に分割されたメッシュサイズは異なる、すなわち各層を表すスケールが異なる.
 
次はそのソースコードを分析します.
DenseFeature Detector類の構造関数:
 
 
[cpp]view play copy print?
  • DenseFeature Detector::DenseFeature Detector float _init Feature Scale 要点 _feature Scalevels、  
  •                                       float _feature ScreMul、 要点 _initXyStep、  
  •                                       要点 _initImgBound、 ブック _varyXyStep WithScale、  
  •                                       ブック _varyImgBoundWithScale ) :  
  •     init Feature Scale(_init Feature Scale)は、 feature Scrale Levels、  
  •     feature ScaleMull(_feature ScaleMull)は、 initXyStep(_initXyStep)は、 initImgBound、  
  •     varyXyStep WithScale(_varyXyStep WithScale)は、 varyImgBoundWithScale(_varyImgBoundWithScre)  
  • {}  
  • DenseFeatureDetector::DenseFeatureDetector( float _initFeatureScale, int _featureScaleLevels,
                                          float _featureScaleMul, int _initXyStep,
                                          int _initImgBound, bool _varyXyStepWithScale,
                                          bool _varyImgBoundWithScale ) :
        initFeatureScale(_initFeatureScale), featureScaleLevels(_featureScaleLevels),
        featureScaleMul(_featureScaleMul), initXyStep(_initXyStep), initImgBound(_initImgBound),
        varyXyStepWithScale(_varyXyStepWithScale), varyImgBoundWithScale(_varyImgBoundWithScale)
    {}
    
     
     
     
    initFeature Scaleは初期画像層の特徴点のスケールを表し、デフォルトでは1
     
    feature Scrale Levelsは、いくつかの層の画像を構築する必要がありますが、デフォルトでは1
     
    feature ScaleMullは、隣接する2層の画像間のグリッド幅の比、スケールの比、および境界幅の比率を予約し、デフォルトでは0.1である.
     
    initXyStepは初期画像層のグリッド幅を表し、デフォルトは6です.
     
    initImgBoundは初期画像層の予約境界幅を表し、デフォルトは0です.
     
    varyXyStep WithScaleは、各レイヤの画像がグリッド幅の調整を行うかどうかを示し、falseであれば、各レイヤの画像グリッド幅がinitXyStepであることを示し、trueであれば、各レイヤの画像グリッド幅が異なることを表し、それらの間のスケール係数はfeature ScaleMullであり、デフォルトはtrueである.
     
    varyImgBoundWithScaleは、各層の画像が予約境界幅の調整を行うかどうかを示し、falseであれば、各層の画像予約境界幅はinitImgBoundであり、trueであれば、各層の画像予約境界幅が異なることを示し、それらの間の比例係数はfeature ScaleMullであり、デフォルトはfalseである.
     
    以下は特徴点関数を検出するdetectImplです.
     
    [cpp]view play copy print?
  • void デンスFeature Detector:detectImpl( コンサート Mat& イメージ vector& keybonts コンサート Mat& マスター ) コンサート  
  • {  
  •     // curScaleは現在の層の画像の特徴点のスケールを表します.  
  •     float curScale = static ucast(init Feature Scale);  
  •     //curStepは現在のレイヤー画像のグリッド幅を表します.  
  •     要点 curStep = initXyStep;  
  •     //curBoundは、現在のレイヤ画像の予約境界幅を表します.  
  •     要点 curBound = initImgBound  
  •     //画像を巡回  
  •     フォーム( 要点 curLevel = 0; curLevel 
  •     {  
  •         //現在のレイヤー画像のすべてのグリッドを巡回して、画像の周りの予約境界はグリッドがないので、横、縦座標のステップはグリッドの幅です.  
  •         フォーム( 要点 x = curBound x 
  •         {  
  •             フォーム( 要点 y = curBound y 
  •             {  
  •                 //グリッドの左上隅座標のピクセルをこのグリッドの特徴点として保存します.  
  •                 keypybonts.pusic( KeyPoint(staticcaucast(x) static ucast(y) curScale) );  
  •             }  
  •         }  
  •         //次の画像の特徴点のスケールを調整します.  
  •         curScale = staticcaucast(curScale) * feature ScaleMull)  
  •         //もしvaryXyStep WithScaleがtrueであれば、次の画像のグリッド幅を調整します.  
  •         if( varyXyStep WithScale ) curStep = static ucast( curStep * feature ScaleMull + 0.5 f );  
  •         //varyImgBoundWithScaleがtrueである場合、次の画像の予約境界幅を調整する.  
  •         if( varyImgBoundWithScale ) curBound = static ucast( curBound * feature ScaleMull + 0.5 f );  
  •     }  
  •     //マスク行列の特徴点処理  
  •     KeyPoints Filter:runByPixels Mask( keybonts マスター );  
  • }  
  • void DenseFeatureDetector::detectImpl( const Mat& image, vector& keypoints, const Mat& mask ) const
    {
        // curScale             
        float curScale = static_cast(initFeatureScale);
        //curStep            
        int curStep = initXyStep;
        //curBound              
        int curBound = initImgBound;
        //      
        for( int curLevel = 0; curLevel < featureScaleLevels; curLevel++ )
        {
            //            ,                , 、             
            for( int x = curBound; x < image.cols - curBound; x += curStep )
            {
                for( int y = curBound; y < image.rows - curBound; y += curStep )
                {
                    //                      ,   
                    keypoints.push_back( KeyPoint(static_cast(x), static_cast(y), curScale) );
                }
            }
            //             
            curScale = static_cast(curScale * featureScaleMul);
            //  varyXyStepWithScale true,             
            if( varyXyStepWithScale ) curStep = static_cast( curStep * featureScaleMul + 0.5f );
            //  varyImgBoundWithScale true,               
            if( varyImgBoundWithScale ) curBound = static_cast( curBound * featureScaleMul + 0.5f );
        }
        //          
        KeyPointsFilter::runByPixelsMask( keypoints, mask );
    }
    
    具体的な応用例を以下に示す.
     
    [cpp]view play copy print?
  • 〓〓include 「opencv 2/core/core.hpp」  
  • 〓〓include 「highgui.h」  
  • 〓〓include 「opencv 2/imgproc/imgproc.hpp」  
  • 〓〓include 「opencv 2/feature s 2 d/feature s 2 d.hpp」  
  • 〓〓include 「opencv 2/nonfree/non free.hpp」  
  •   
  • using namespace cv;  
  • /using namespace std;  
  •   
  • int メール(int argc char** argv)  
  • {  
  •    Mat img = imread(「boxカムリ.png」)、 img 1;  
  •      
  •    cvt Color( img、 img 1, CV BGR 2 GRAY );  
  •   
  •    デンスFeature Detector dense;  
  •   
  •    vector key ploid nts;  
  •    Mat out put_img  
  •   
  •    dense.detect(img 1,keyuploents,Mat();  
  •    ドラフト key ploid nts out put uuimg、 スコア:all(-1) DrawMatch Flags:DRAWuRICHINTS);  
  •   
  •    namedWindow(「DENSE」);  
  •    imshow(「DENSE」、 out put_img);  
  •    waitKey(0)  
  •   
  •    return 0;  
  • }  
  •