Commit e646f9d2 authored by Han Hu's avatar Han Hu

Fix subpixel problem of akaze.

This is found in the original akaze repo. Previous sub pixel localization method assumes the coordinate (0, 0) is the up-left corner of the up-left pixel. But as far as I know, opencv uses the center of the up-left corner, in this case it should be done in this way.

https://github.com/pablofdezalc/akaze/commit/35aeb83a7142e9ec42419603a094ffc2a1401c05
https://github.com/pablofdezalc/akaze/commit/db3dc22981e856ca8111f2f7fe57d9c2e0286efc
parent c3d1f94e
......@@ -342,14 +342,14 @@ void AKAZEFeatures::Find_Scale_Space_Extrema(std::vector<KeyPoint>& kpts)
if (is_out == false) {
if (is_repeated == false) {
point.pt.x *= ratio;
point.pt.y *= ratio;
point.pt.x = (float)(point.pt.x*ratio + .5*(ratio-1.0));
point.pt.y = (float)(point.pt.y*ratio + .5*(ratio-1.0));
kpts_aux.push_back(point);
npoints++;
}
else {
point.pt.x *= ratio;
point.pt.y *= ratio;
point.pt.x = (float)(point.pt.x*ratio + .5*(ratio-1.0));
point.pt.y = (float)(point.pt.y*ratio + .5*(ratio-1.0));
kpts_aux[id_repeated] = point;
}
} // if is_out
......@@ -439,8 +439,8 @@ void AKAZEFeatures::Do_Subpixel_Refinement(std::vector<KeyPoint>& kpts)
kpts[i].pt.x = x + dst(0);
kpts[i].pt.y = y + dst(1);
int power = fastpow(2, evolution_[kpts[i].class_id].octave);
kpts[i].pt.x *= power;
kpts[i].pt.y *= power;
kpts[i].pt.x = (float)(kpts[i].pt.x*power + .5*(power-1));
kpts[i].pt.y = (float)(kpts[i].pt.y*power + .5*(power-1));
kpts[i].angle = 0.0;
// In OpenCV the size of a keypoint its the diameter
......
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