SIFT Pyramid Code

void SIFT::buildGaussianPyramid( const Mat& base, vector& pyr, int nOctaves ) const  
{  
    vector 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& gpyr, vector& 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::type);   
               }  
        }  
}  

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

你可能感兴趣的:(SIFT Pyramid Code)