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

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
...@@ -287,8 +287,8 @@ void FREAK_Impl::buildPattern() ...@@ -287,8 +287,8 @@ void FREAK_Impl::buildPattern()
const float dx = patternLookup[orientationPairs[m].i].x-patternLookup[orientationPairs[m].j].x; 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 dy = patternLookup[orientationPairs[m].i].y-patternLookup[orientationPairs[m].j].y;
const float norm_sq = (dx*dx+dy*dy); const float norm_sq = (dx*dx+dy*dy);
orientationPairs[m].weight_dx = int((dx/(norm_sq))*4096.0+0.5); orientationPairs[m].weight_dx = cvRound((dx/(norm_sq))*4096.0);
orientationPairs[m].weight_dy = int((dy/(norm_sq))*4096.0+0.5); orientationPairs[m].weight_dy = cvRound((dy/(norm_sq))*4096.0);
} }
// build the list of description pairs // build the list of description pairs
...@@ -486,7 +486,7 @@ void FREAK_Impl::computeDescriptors( InputArray _image, std::vector<KeyPoint>& k ...@@ -486,7 +486,7 @@ void FREAK_Impl::computeDescriptors( InputArray _image, std::vector<KeyPoint>& k
} }
else 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--; ) 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 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 ...@@ -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 keypoints[k].angle = static_cast<float>(atan2((float)direction1,(float)direction0)*(180.0/CV_PI));//estimate orientation
if(keypoints[k].angle < 0.f) thetaIdx = cvRound(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0));
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);
if( thetaIdx < 0 ) if( thetaIdx < 0 )
thetaIdx += FREAK_NB_ORIENTATION; thetaIdx += FREAK_NB_ORIENTATION;
...@@ -600,10 +597,7 @@ void FREAK_Impl::computeDescriptors( InputArray _image, std::vector<KeyPoint>& k ...@@ -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 keypoints[k].angle = static_cast<float>(atan2((float)direction1,(float)direction0)*(180.0/CV_PI)); //estimate orientation
if(keypoints[k].angle < 0.f) thetaIdx = cvRound(FREAK_NB_ORIENTATION*keypoints[k].angle*(1/360.0));
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);
if( thetaIdx < 0 ) if( thetaIdx < 0 )
thetaIdx += FREAK_NB_ORIENTATION; thetaIdx += FREAK_NB_ORIENTATION;
...@@ -675,10 +669,10 @@ imgType FREAK_Impl::meanIntensity( InputArray _image, InputArray _integral, ...@@ -675,10 +669,10 @@ imgType FREAK_Impl::meanIntensity( InputArray _image, InputArray _integral,
// expected case: // expected case:
// calculate borders // calculate borders
const int x_left = int(xf-radius+0.5); const int x_left = cvRound(xf-radius);
const int y_top = int(yf-radius+0.5); const int y_top = cvRound(yf-radius);
const int x_right = int(xf+radius+1.5);//integral image is 1px wider const int x_right = cvRound(xf+radius+1);//integral image is 1px wider
const int y_bottom = int(yf+radius+1.5);//integral image is 1px higher const int y_bottom = cvRound(yf+radius+1);//integral image is 1px higher
iiType ret_val; iiType ret_val;
ret_val = integral.at<iiType>(y_bottom,x_right);//bottom right corner ret_val = integral.at<iiType>(y_bottom,x_right);//bottom right corner
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment