美文网首页
SIFT Pyramid Code

SIFT Pyramid Code

作者: lucientlau | 来源:发表于2017-10-21 14:30 被阅读0次
    void SIFT::buildGaussianPyramid( const Mat& base, vector<Mat>& pyr, int nOctaves ) const  
    {  
        vector<double> sig(nOctaveLayers + 3);  
        pyr.resize(nOctaves*(nOctaveLayers + 3));  
        // precompute Gaussian sigmas using the following formula:  
        //  \sigma_{total}^2 = \sigma_{i}^2 + \sigma_{i-1}^2  
        sig[0] = sigma;  
        double k = pow( 2., 1. / nOctaveLayers );  
        for( int i = 1; i < nOctaveLayers + 3; i++ )  
        {  
            double sig_prev = pow(k, (double)(i-1))*sigma;  
            double sig_total = sig_prev*k;  
            sig[i] = std::sqrt(sig_total*sig_total - sig_prev*sig_prev);  
        }  
        for( int o = 0; o < nOctaves; o++ )  
        {  
            for( int i = 0; i < nOctaveLayers + 3; i++ )  
            {  
                Mat& dst = pyr[o*(nOctaveLayers + 3) + i];  
                if( o == 0  &&  i == 0 )  
                    dst = base;  
                // base of new octave is halved image from end of previous octave  
                else if( i == 0 )/*每一个八度中第一幅图像的确定过程*/  
                {  
                      const Mat& src = pyr[(o-1)*(nOctaveLayers + 3) + nOctaveLayers];  
                      resize(src, dst, Size(src.cols/2, src.rows/2), 0, 0, INTER_NEAREST);  
                }   
               else  
               {  
                        const Mat& src = pyr[o*(nOctaveLayers + 3) + i-1];   
                        GaussianBlur(src, dst, Size(), sig[i], sig[i]);   
               }  
            }   
         }  
    }  
    void SIFT::buildDoGPyramid( const vector<Mat>& gpyr, vector<Mat>& dogpyr ) const  
    {   
            int nOctaves = (int)gpyr.size()/(nOctaveLayers + 3);  
            dogpyr.resize( nOctaves*(nOctaveLayers + 2) );   
            for( int o = 0; o < nOctaves; o++ )  
            {   
                   for( int i = 0; i < nOctaveLayers + 2; i++ )   
                   {   
                         const Mat& src1 = gpyr[o*(nOctaveLayers + 3) + i];   
                         const Mat& src2 = gpyr[o*(nOctaveLayers + 3) + i + 1];   
                         Mat& dst = dogpyr[o*(nOctaveLayers + 2) + i];   
                         subtract(src2, src1, dst, noArray(), DataType<sift_wt>::type);   
                   }  
            }  
    }  
    

    以上SIFT源码均摘自OpenCV nonfree模块,lowe对SIFT拥有版权。
    Code is copy from CSDN (honpey)

    相关文章

      网友评论

          本文标题:SIFT Pyramid Code

          本文链接:https://www.haomeiwen.com/subject/zguiuxtx.html