diff --git a/modules/gpu/src/cuda/surf.cu b/modules/gpu/src/cuda/surf.cu index e65f4aafc..17cff8584 100644 --- a/modules/gpu/src/cuda/surf.cu +++ b/modules/gpu/src/cuda/surf.cu @@ -51,6 +51,7 @@ #include "opencv2/gpu/device/utility.hpp" #include "opencv2/gpu/device/functional.hpp" #include "opencv2/gpu/device/filters.hpp" +#include namespace cv { namespace gpu { namespace device { @@ -625,6 +626,10 @@ namespace cv { namespace gpu { namespace device kp_dir += 2.0f * CV_PI_F; kp_dir *= 180.0f / CV_PI_F; + kp_dir = 360.0f - kp_dir; + if (abs(kp_dir - 360.f) < FLT_EPSILON) + kp_dir = 0.f; + featureDir[blockIdx.x] = kp_dir; } } @@ -709,7 +714,10 @@ namespace cv { namespace gpu { namespace device const float centerX = featureX[blockIdx.x]; const float centerY = featureY[blockIdx.x]; const float size = featureSize[blockIdx.x]; - const float descriptor_dir = featureDir[blockIdx.x] * (float)(CV_PI_F / 180.0f); + float descriptor_dir = 360.0f - featureDir[blockIdx.x]; + if (std::abs(descriptor_dir - 360.f) < FLT_EPSILON) + descriptor_dir = 0.f; + descriptor_dir *= (float)(CV_PI_F / 180.0f); /* The sampling intervals and wavelet sized for selecting an orientation and building the keypoint descriptor are defined relative to 's' */ diff --git a/modules/gpu/src/surf.cpp b/modules/gpu/src/surf.cpp index 9a9efc460..12181e3ad 100644 --- a/modules/gpu/src/surf.cpp +++ b/modules/gpu/src/surf.cpp @@ -198,7 +198,7 @@ namespace keypoints.cols = featureCounter; if (surf_.upright) - keypoints.row(SURF_GPU::ANGLE_ROW).setTo(Scalar::all(90.0)); + keypoints.row(SURF_GPU::ANGLE_ROW).setTo(Scalar::all(360.0 - 90.0)); else findOrientation(keypoints); } diff --git a/modules/nonfree/src/sift.cpp b/modules/nonfree/src/sift.cpp index 3237ae6c0..aca8020cc 100644 --- a/modules/nonfree/src/sift.cpp +++ b/modules/nonfree/src/sift.cpp @@ -500,7 +500,7 @@ void SIFT::findScaleSpaceExtrema( const vector& gauss_pyr, const vector= n ? bin - n : bin; kpt.angle = 360.f - (float)((360.f/n) * bin); if(std::abs(kpt.angle - 360.f) < FLT_EPSILON) - kpt.angle = 0.f; + kpt.angle = 0.f; keypoints.push_back(kpt); } }