Unverified Commit 9c0ae273 authored by raanyild's avatar raanyild Committed by GitHub
Browse files

Merge pull request #2440 from raanyild:freak_rounding_bug

* FREAK : better rounding off for weighted dx and dy of orientation pairs

* updated using cvRound

* cvRound modified
parent f220e983
Loading
Loading
Loading
Loading
+9 −15
Original line number Diff line number Diff line
@@ -287,8 +287,8 @@ void FREAK_Impl::buildPattern()
        const float dx = patternLookup[orientationPairs[m].i].x-patternLookup[orientationPairs[m].j].x;
        const float dy = patternLookup[orientationPairs[m].i].y-patternLookup[orientationPairs[m].j].y;
        const float norm_sq = (dx*dx+dy*dy);
        orientationPairs[m].weight_dx = int((dx/(norm_sq))*4096.0+0.5);
        orientationPairs[m].weight_dy = int((dy/(norm_sq))*4096.0+0.5);
        orientationPairs[m].weight_dx = cvRound((dx/(norm_sq))*4096.0);
        orientationPairs[m].weight_dy = cvRound((dy/(norm_sq))*4096.0);
    }

    // build the list of description pairs
@@ -486,7 +486,7 @@ void FREAK_Impl::computeDescriptors( InputArray _image, std::vector<KeyPoint>& k
    }
    else
    {
        const int scIdx = std::max( (int)(1.0986122886681*sizeCst+0.5) ,0);
        const int scIdx = std::max( cvRound(1.0986122886681*sizeCst) ,0);
        for( size_t k = keypoints.size(); k--; )
        {
            kpScaleIdx[k] = scIdx; // equivalent to the formule when the scale is normalized with a constant size of keypoints[k].size=3*SMALLEST_KP_SIZE
@@ -543,10 +543,7 @@ void FREAK_Impl::computeDescriptors( InputArray _image, std::vector<KeyPoint>& k

                keypoints[k].angle = static_cast<float>(atan2((float)direction1,(float)direction0)*(180.0/CV_PI));//estimate orientation

                if(keypoints[k].angle < 0.f)
                    thetaIdx = int(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0)-0.5);
                else
                    thetaIdx = int(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0)+0.5);
                thetaIdx = cvRound(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0));

                if( thetaIdx < 0 )
                    thetaIdx += FREAK_NB_ORIENTATION;
@@ -600,10 +597,7 @@ void FREAK_Impl::computeDescriptors( InputArray _image, std::vector<KeyPoint>& k

                keypoints[k].angle = static_cast<float>(atan2((float)direction1,(float)direction0)*(180.0/CV_PI)); //estimate orientation

                if(keypoints[k].angle < 0.f)
                    thetaIdx = int(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0)-0.5);
                else
                    thetaIdx = int(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0)+0.5);
                thetaIdx = cvRound(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0));

                if( thetaIdx < 0 )
                    thetaIdx += FREAK_NB_ORIENTATION;
@@ -675,10 +669,10 @@ imgType FREAK_Impl::meanIntensity( InputArray _image, InputArray _integral,
    // expected case:

    // calculate borders
    const int x_left = int(xf-radius+0.5);
    const int y_top = int(yf-radius+0.5);
    const int x_right = int(xf+radius+1.5);//integral image is 1px wider
    const int y_bottom = int(yf+radius+1.5);//integral image is 1px higher
    const int x_left = cvRound(xf-radius);
    const int y_top = cvRound(yf-radius);
    const int x_right = cvRound(xf+radius+1);//integral image is 1px wider
    const int y_bottom = cvRound(yf+radius+1);//integral image is 1px higher
    iiType ret_val;

    ret_val = integral.at<iiType>(y_bottom,x_right);//bottom right corner