From: Vadim Pisarevsky Date: Thu, 30 Aug 2012 13:32:47 +0000 (+0400) Subject: fixed building BRISK on Windows X-Git-Tag: accepted/2.0/20130307.220821~364^2~215^2~26^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=014106783d854cb4d89015171b26e79dda3c2632;p=profile%2Fivi%2Fopencv.git fixed building BRISK on Windows --- diff --git a/modules/features2d/src/brisk.cpp b/modules/features2d/src/brisk.cpp index 72fc9a8..2a54d7c 100755 --- a/modules/features2d/src/brisk.cpp +++ b/modules/features2d/src/brisk.cpp @@ -70,15 +70,15 @@ public: // Fast/Agast without non-max suppression void - getAgastPoints(uint8_t threshold, std::vector& keypoints); + getAgastPoints(int threshold, std::vector& keypoints); // get scores - attention, this is in layer coordinates, not scale=1 coordinates! - inline uint8_t - getAgastScore(int x, int y, uint8_t threshold) const; - inline uint8_t - getAgastScore_5_8(int x, int y, uint8_t threshold) const; - inline uint8_t - getAgastScore(float xf, float yf, uint8_t threshold, float scale = 1.0f) const; + inline int + getAgastScore(int x, int y, int threshold) const; + inline int + getAgastScore_5_8(int x, int y, int threshold) const; + inline int + getAgastScore(float xf, float yf, int threshold, float scale = 1.0f) const; // accessors inline const cv::Mat& @@ -111,7 +111,7 @@ public: private: // access gray values (smoothed/interpolated) - inline uint8_t + inline int value(const cv::Mat& mat, float xf, float yf, float scale) const; // the image cv::Mat img_; @@ -130,7 +130,7 @@ class CV_EXPORTS BriskScaleSpace { public: // construct telling the octaves number: - BriskScaleSpace(uint8_t _octaves = 3); + BriskScaleSpace(int _octaves = 3); ~BriskScaleSpace(); // construct the image pyramids @@ -139,12 +139,12 @@ public: // get Keypoints void - getKeypoints(const uint8_t _threshold, std::vector& keypoints); + getKeypoints(const int _threshold, std::vector& keypoints); protected: // nonmax suppression: inline bool - isMax2D(const uint8_t layer, const int x_layer, const int y_layer); + isMax2D(const int layer, const int x_layer, const int y_layer); // 1D (scale axis) refinement: inline float refine1D(const float s_05, const float s0, const float s05, float& max) const; // around octave @@ -158,24 +158,24 @@ protected: const int s_2_0, const int s_2_1, const int s_2_2, float& delta_x, float& delta_y) const; // 3D maximum refinement centered around (x_layer,y_layer) inline float - refine3D(const uint8_t layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, bool& ismax) const; + refine3D(const int layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, bool& ismax) const; // interpolated score access with recalculation when needed: inline int - getScoreAbove(const uint8_t layer, const int x_layer, const int y_layer) const; + getScoreAbove(const int layer, const int x_layer, const int y_layer) const; inline int - getScoreBelow(const uint8_t layer, const int x_layer, const int y_layer) const; + getScoreBelow(const int layer, const int x_layer, const int y_layer) const; // return the maximum of score patches above or below inline float - getScoreMaxAbove(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, + getScoreMaxAbove(const int layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, float& dx, float& dy) const; inline float - getScoreMaxBelow(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, + getScoreMaxBelow(const int layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, float& dx, float& dy) const; // the image pyramids: - uint8_t layers_; + int layers_; std::vector pyramid_; // some constant parameters: @@ -183,15 +183,13 @@ protected: static const float basicSize_; }; -using namespace cv; - -const float BRISK::basicSize_ = 12.0; +const float BRISK::basicSize_ = 12.0f; const unsigned int BRISK::scales_ = 64; -const float BRISK::scalerange_ = 30; // 40->4 Octaves - else, this needs to be adjusted... +const float BRISK::scalerange_ = 30.f; // 40->4 Octaves - else, this needs to be adjusted... const unsigned int BRISK::n_rot_ = 1024; // discretization of the rotation look-up -const float BriskScaleSpace::safetyFactor_ = 1.0; -const float BriskScaleSpace::basicSize_ = 12.0; +const float BriskScaleSpace::safetyFactor_ = 1.0f; +const float BriskScaleSpace::basicSize_ = 12.0f; // constructors BRISK::BRISK(int thresh, int octaves_in, float patternScale) @@ -207,11 +205,11 @@ BRISK::BRISK(int thresh, int octaves_in, float patternScale) nList.resize(5); const double f = 0.85 * patternScale; - rList[0] = f * 0; - rList[1] = f * 2.9; - rList[2] = f * 4.9; - rList[3] = f * 7.4; - rList[4] = f * 10.8; + rList[0] = (float)(f * 0.); + rList[1] = (float)(f * 2.9); + rList[2] = (float)(f * 4.9); + rList[3] = (float)(f * 7.4); + rList[4] = (float)(f * 10.8); nList[0] = 1; nList[1] = 10; @@ -219,7 +217,7 @@ BRISK::BRISK(int thresh, int octaves_in, float patternScale) nList[3] = 15; nList[4] = 20; - generateKernel(rList, nList, 5.85 * patternScale, 8.2 * patternScale); + generateKernel(rList, nList, (float)(5.85 * patternScale), (float)(8.2 * patternScale)); } BRISK::BRISK(std::vector &radiusList, std::vector &numberList, float dMax, float dMin, @@ -237,7 +235,7 @@ BRISK::generateKernel(std::vector &radiusList, std::vector &numberLi dMin_ = dMin; // get the total number of points - const int rings = radiusList.size(); + const int rings = (int)radiusList.size(); assert(radiusList.size()!=0&&radiusList.size()==numberList.size()); points_ = 0; // remember the total number of points for (int ring = 0; ring < rings; ring++) @@ -249,44 +247,44 @@ BRISK::generateKernel(std::vector &radiusList, std::vector &numberLi BriskPatternPoint* patternIterator = patternPoints_; // define the scale discretization: - static const float lb_scale = log(scalerange_) / log(2.0); + static const float lb_scale = (float)(log(scalerange_) / log(2.0)); static const float lb_scale_step = lb_scale / (scales_); scaleList_ = new float[scales_]; sizeList_ = new unsigned int[scales_]; - const float sigma_scale = 1.3; + const float sigma_scale = 1.3f; for (unsigned int scale = 0; scale < scales_; ++scale) { - scaleList_[scale] = pow((double) 2.0, (double) (scale * lb_scale_step)); + scaleList_[scale] = (float)pow((double) 2.0, (double) (scale * lb_scale_step)); sizeList_[scale] = 0; // generate the pattern points look-up double alpha, theta; for (size_t rot = 0; rot < n_rot_; ++rot) { - theta = double(rot) * 2 * M_PI / double(n_rot_); // this is the rotation of the feature + theta = double(rot) * 2 * CV_PI / double(n_rot_); // this is the rotation of the feature for (int ring = 0; ring < rings; ++ring) { for (int num = 0; num < numberList[ring]; ++num) { // the actual coordinates on the circle - alpha = (double(num)) * 2 * M_PI / double(numberList[ring]); - patternIterator->x = scaleList_[scale] * radiusList[ring] * cos(alpha + theta); // feature rotation plus angle of the point - patternIterator->y = scaleList_[scale] * radiusList[ring] * sin(alpha + theta); + alpha = (double(num)) * 2 * CV_PI / double(numberList[ring]); + patternIterator->x = (float)(scaleList_[scale] * radiusList[ring] * cos(alpha + theta)); // feature rotation plus angle of the point + patternIterator->y = (float)(scaleList_[scale] * radiusList[ring] * sin(alpha + theta)); // and the gaussian kernel sigma if (ring == 0) { - patternIterator->sigma = sigma_scale * scaleList_[scale] * 0.5; + patternIterator->sigma = sigma_scale * scaleList_[scale] * 0.5f; } else { - patternIterator->sigma = sigma_scale * scaleList_[scale] * (double(radiusList[ring])) - * sin(M_PI / numberList[ring]); + patternIterator->sigma = (float)(sigma_scale * scaleList_[scale] * (double(radiusList[ring])) + * sin(CV_PI / numberList[ring])); } // adapt the sizeList if necessary - const unsigned int size = ceil(((scaleList_[scale] * radiusList[ring]) + patternIterator->sigma)) + 1; + const unsigned int size = cvCeil(((scaleList_[scale] * radiusList[ring]) + patternIterator->sigma)) + 1; if (sizeList_[scale] < size) { sizeList_[scale] = size; @@ -306,11 +304,11 @@ BRISK::generateKernel(std::vector &radiusList, std::vector &numberLi noLongPairs_ = 0; // fill indexChange with 0..n if empty - unsigned int indSize = indexChange.size(); + unsigned int indSize = (unsigned int)indexChange.size(); if (indSize == 0) { indexChange.resize(points_ * (points_ - 1) / 2); - indSize = indexChange.size(); + indSize = (unsigned int)indexChange.size(); } for (unsigned int i = 0; i < indSize; i++) { @@ -370,34 +368,30 @@ BRISK::smoothedIntensity(const cv::Mat& image, const cv::Mat& integral, const fl // get the sigma: const float sigma_half = briskPoint.sigma; - const float area = 4.0 * sigma_half * sigma_half; + const float area = 4.0f * sigma_half * sigma_half; // calculate output: int ret_val; if (sigma_half < 0.5) { //interpolation multipliers: - const int r_x = (xf - x) * 1024; - const int r_y = (yf - y) * 1024; + const int r_x = (int)((xf - x) * 1024); + const int r_y = (int)((yf - y) * 1024); const int r_x_1 = (1024 - r_x); const int r_y_1 = (1024 - r_y); - uchar* ptr = image.data + x + y * imagecols; + const uchar* ptr = &image.at(y, x); + size_t step = image.step; // just interpolate: - ret_val = (r_x_1 * r_y_1 * int(*ptr)); - ptr++; - ret_val += (r_x * r_y_1 * int(*ptr)); - ptr += imagecols; - ret_val += (r_x * r_y * int(*ptr)); - ptr--; - ret_val += (r_x_1 * r_y * int(*ptr)); + ret_val = r_x_1 * r_y_1 * ptr[0] + r_x * r_y_1 * ptr[1] + + r_x * r_y * ptr[step] + r_x_1 * r_y * ptr[step+1]; return (ret_val + 512) / 1024; } // this is the standard case (simple, not speed optimized yet): // scaling: - const int scaling = 4194304.0 / area; - const int scaling2 = float(scaling) * area / 1024.0; + const int scaling = (int)(4194304.0 / area); + const int scaling2 = int(float(scaling) * area / 1024.0); // the integral image is larger: const int integralcols = imagecols + 1; @@ -414,20 +408,20 @@ BRISK::smoothedIntensity(const cv::Mat& image, const cv::Mat& integral, const fl const int y_bottom = int(y1 + 0.5); // overlap area - multiplication factors: - const float r_x_1 = float(x_left) - x_1 + 0.5; - const float r_y_1 = float(y_top) - y_1 + 0.5; - const float r_x1 = x1 - float(x_right) + 0.5; - const float r_y1 = y1 - float(y_bottom) + 0.5; + const float r_x_1 = float(x_left) - x_1 + 0.5f; + const float r_y_1 = float(y_top) - y_1 + 0.5f; + const float r_x1 = x1 - float(x_right) + 0.5f; + const float r_y1 = y1 - float(y_bottom) + 0.5f; const int dx = x_right - x_left - 1; const int dy = y_bottom - y_top - 1; - const int A = (r_x_1 * r_y_1) * scaling; - const int B = (r_x1 * r_y_1) * scaling; - const int C = (r_x1 * r_y1) * scaling; - const int D = (r_x_1 * r_y1) * scaling; - const int r_x_1_i = r_x_1 * scaling; - const int r_y_1_i = r_y_1 * scaling; - const int r_x1_i = r_x1 * scaling; - const int r_y1_i = r_y1 * scaling; + const int A = (int)((r_x_1 * r_y_1) * scaling); + const int B = (int)((r_x1 * r_y_1) * scaling); + const int C = (int)((r_x1 * r_y1) * scaling); + const int D = (int)((r_x_1 * r_y1) * scaling); + const int r_x_1_i = (int)(r_x_1 * scaling); + const int r_y_1_i = (int)(r_y_1 * scaling); + const int r_x1_i = (int)(r_x1 * scaling); + const int r_y1_i = (int)(r_y1 * scaling); if (dx + dy > 2) { @@ -529,7 +523,7 @@ void BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoints, OutputArray _descriptors, bool useProvidedKeypoints) const { - bool doOrientation; + bool doOrientation=true; if (useProvidedKeypoints) doOrientation = false; computeDescriptorsAndOrOrientation(_image, _mask, keypoints, _descriptors, true, doOrientation, @@ -555,11 +549,11 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v size_t ksize = keypoints.size(); std::vector kscales; // remember the scale per keypoint kscales.resize(ksize); - static const float log2 = 0.693147180559945; - static const float lb_scalerange = log(scalerange_) / (log2); + static const float log2 = 0.693147180559945f; + static const float lb_scalerange = (float)(log(scalerange_) / (log2)); std::vector::iterator beginning = keypoints.begin(); std::vector::iterator beginningkscales = kscales.begin(); - static const float basicSize06 = basicSize_ * 0.6; + static const float basicSize06 = basicSize_ * 0.6f; for (size_t k = 0; k < ksize; k++) { unsigned int scale; @@ -571,7 +565,7 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v const int border = sizeList_[scale]; const int border_x = image.cols - border; const int border_y = image.rows - border; - if (RoiPredicate(border, border, border_x, border_y, keypoints[k])) + if (RoiPredicate((float)border, (float)border, (float)border_x, (float)border_y, keypoints[k])) { keypoints.erase(beginning + k); kscales.erase(beginningkscales + k); @@ -596,7 +590,7 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v cv::Mat descriptors; if (doDescriptors) { - _descriptors.create(ksize, strings_, CV_8U); + _descriptors.create((int)ksize, strings_, CV_8U); descriptors = _descriptors.getMat(); descriptors.setTo(0); } @@ -640,9 +634,9 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v direction0 += tmp0; direction1 += tmp1; } - kp.angle = atan2((float) direction1, (float) direction0) / M_PI * 180.0; + kp.angle = (float)(atan2((float) direction1, (float) direction0) / CV_PI * 180.0); if (kp.angle < 0) - kp.angle += 360; + kp.angle += 360.f; } if (!doDescriptors) @@ -760,7 +754,7 @@ BRISK::computeImpl( const Mat& image, vector& keypoints, Mat& descript } // construct telling the octaves number: -BriskScaleSpace::BriskScaleSpace(uint8_t _octaves) +BriskScaleSpace::BriskScaleSpace(int _octaves) { if (_octaves == 0) layers_ = 1; @@ -787,7 +781,7 @@ BriskScaleSpace::constructPyramid(const cv::Mat& image) } const int octaves2 = layers_; - for (uint8_t i = 2; i < octaves2; i += 2) + for (uchar i = 2; i < octaves2; i += 2) { pyramid_.push_back(BriskLayer(pyramid_[i - 2], BriskLayer::CommonParams::HALFSAMPLE)); pyramid_.push_back(BriskLayer(pyramid_[i - 1], BriskLayer::CommonParams::HALFSAMPLE)); @@ -795,20 +789,19 @@ BriskScaleSpace::constructPyramid(const cv::Mat& image) } void -BriskScaleSpace::getKeypoints(const uint8_t _threshold, std::vector& keypoints) +BriskScaleSpace::getKeypoints(const int threshold_, std::vector& keypoints) { // make sure keypoints is empty keypoints.resize(0); keypoints.reserve(2000); // assign thresholds - uint8_t threshold_ = _threshold; - uint8_t safeThreshold_ = threshold_ * safetyFactor_; + int safeThreshold_ = (int)(threshold_ * safetyFactor_); std::vector > agastPoints; agastPoints.resize(layers_); // go through the octaves and intra layers and calculate fast corner scores: - for (uint8_t i = 0; i < layers_; i++) + for (int i = 0; i < layers_; i++) { // call OAST16_9 without nms BriskLayer& l = pyramid_[i]; @@ -818,25 +811,25 @@ BriskScaleSpace::getKeypoints(const uint8_t _threshold, std::vector max_below_uchar) - max_below_uchar = s_1_0; - register int s_2_0 = l.getAgastScore_5_8(x_layer + 1, y_layer - 1, 1); - if (s_2_0 > max_below_uchar) - max_below_uchar = s_2_0; - register int s_2_1 = l.getAgastScore_5_8(x_layer + 1, y_layer, 1); - if (s_2_1 > max_below_uchar) - max_below_uchar = s_2_1; - register int s_1_1 = l.getAgastScore_5_8(x_layer, y_layer, 1); - if (s_1_1 > max_below_uchar) - max_below_uchar = s_1_1; - register int s_0_1 = l.getAgastScore_5_8(x_layer - 1, y_layer, 1); - if (s_0_1 > max_below_uchar) - max_below_uchar = s_0_1; - register int s_0_2 = l.getAgastScore_5_8(x_layer - 1, y_layer + 1, 1); - if (s_0_2 > max_below_uchar) - max_below_uchar = s_0_2; - register int s_1_2 = l.getAgastScore_5_8(x_layer, y_layer + 1, 1); - if (s_1_2 > max_below_uchar) - max_below_uchar = s_1_2; - register int s_2_2 = l.getAgastScore_5_8(x_layer + 1, y_layer + 1, 1); - if (s_2_2 > max_below_uchar) - max_below_uchar = s_2_2; + int s_0_0 = l.getAgastScore_5_8(x_layer - 1, y_layer - 1, 1); + max_below = s_0_0; + int s_1_0 = l.getAgastScore_5_8(x_layer, y_layer - 1, 1); + max_below = std::max(s_1_0, max_below); + int s_2_0 = l.getAgastScore_5_8(x_layer + 1, y_layer - 1, 1); + max_below = std::max(s_2_0, max_below); + int s_2_1 = l.getAgastScore_5_8(x_layer + 1, y_layer, 1); + max_below = std::max(s_2_1, max_below); + int s_1_1 = l.getAgastScore_5_8(x_layer, y_layer, 1); + max_below = std::max(s_1_1, max_below); + int s_0_1 = l.getAgastScore_5_8(x_layer - 1, y_layer, 1); + max_below = std::max(s_0_1, max_below); + int s_0_2 = l.getAgastScore_5_8(x_layer - 1, y_layer + 1, 1); + max_below = std::max(s_0_2, max_below); + int s_1_2 = l.getAgastScore_5_8(x_layer, y_layer + 1, 1); + max_below = std::max(s_1_2, max_below); + int s_2_2 = l.getAgastScore_5_8(x_layer + 1, y_layer + 1, 1); + max_below = std::max(s_2_2, max_below); max_below_float = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_below, delta_y_below); - max_below_float = max_below_uchar; + max_below_float = (float)max_below; } else { @@ -1246,15 +1231,15 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la } // get the patch on this layer: - register int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); - register int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); - register int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); - register int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); - register int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); - register int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); - register int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); - register int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); - register int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); + int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); + int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); + int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); + int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); + int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); + int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); + int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); + int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); + int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); float delta_x_layer, delta_y_layer; float max_layer = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_layer, delta_y_layer); @@ -1270,8 +1255,8 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la if (scale > 1.0) { // interpolate the position: - const float r0 = (1.5 - scale) / .5; - const float r1 = 1.0 - r0; + const float r0 = (1.5f - scale) / .5f; + const float r1 = 1.0f - r0; x = (r0 * delta_x_layer + r1 * delta_x_above + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r1 * delta_y_above + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } @@ -1280,16 +1265,16 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la if (layer == 0) { // interpolate the position: - const float r0 = (scale - 0.5) / 0.5; - const float r_1 = 1.0 - r0; + const float r0 = (scale - 0.5f) / 0.5f; + const float r_1 = 1.0f - r0; x = r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer); y = r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer); } else { // interpolate the position: - const float r0 = (scale - 0.75) / 0.25; - const float r_1 = 1.0 - r0; + const float r0 = (scale - 0.75f) / 0.25f; + const float r_1 = 1.0f - r0; x = (r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } @@ -1302,18 +1287,18 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la float delta_x_below, delta_y_below; float max_below = getScoreMaxBelow(layer, x_layer, y_layer, center, ismax, delta_x_below, delta_y_below); if (!ismax) - return 0.0; + return 0.0f; // get the patch on this layer: - register int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); - register int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); - register int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); - register int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); - register int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); - register int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); - register int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); - register int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); - register int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); + int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); + int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); + int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); + int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); + int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); + int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); + int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); + int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); + int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); float delta_x_layer, delta_y_layer; float max_layer = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_layer, delta_y_layer); @@ -1323,16 +1308,16 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la if (scale > 1.0) { // interpolate the position: - const float r0 = 4.0 - scale * 3.0; - const float r1 = 1.0 - r0; + const float r0 = 4.0f - scale * 3.0f; + const float r1 = 1.0f - r0; x = (r0 * delta_x_layer + r1 * delta_x_above + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r1 * delta_y_above + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } else { // interpolate the position: - const float r0 = scale * 3.0 - 2.0; - const float r_1 = 1.0 - r0; + const float r0 = scale * 3.0f - 2.0f; + const float r_1 = 1.0f - r0; x = (r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } @@ -1347,7 +1332,7 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la // return the maximum of score patches above or below inline float -BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, +BriskScaleSpace::getScoreMaxAbove(const int layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, float& dx, float& dy) const { @@ -1365,10 +1350,10 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const if (layer % 2 == 0) { // octave - x_1 = float(4 * (x_layer) - 1 - 2) / 6.0; - x1 = float(4 * (x_layer) - 1 + 2) / 6.0; - y_1 = float(4 * (y_layer) - 1 - 2) / 6.0; - y1 = float(4 * (y_layer) - 1 + 2) / 6.0; + x_1 = float(4 * (x_layer) - 1 - 2) / 6.0f; + x1 = float(4 * (x_layer) - 1 + 2) / 6.0f; + y_1 = float(4 * (y_layer) - 1 - 2) / 6.0f; + y1 = float(4 * (y_layer) - 1 + 2) / 6.0f; } else { @@ -1380,103 +1365,103 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const } // check the first row - int max_x = x_1 + 1; - int max_y = y_1 + 1; + int max_x = (int)x_1 + 1; + int max_y = (int)y_1 + 1; float tmp_max; - float max = layerAbove.getAgastScore(x_1, y_1, 1); - if (max > threshold) + float maxval = (float)layerAbove.getAgastScore(x_1, y_1, 1); + if (maxval > threshold) return 0; - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerAbove.getAgastScore(float(x), y_1, 1); + tmp_max = (float)layerAbove.getAgastScore(float(x), y_1, 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = x; } } - tmp_max = layerAbove.getAgastScore(x1, y_1, 1); + tmp_max = (float)layerAbove.getAgastScore(x1, y_1, 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x1); } // middle rows - for (int y = y_1 + 1; y <= int(y1); y++) + for (int y = (int)y_1 + 1; y <= int(y1); y++) { - tmp_max = layerAbove.getAgastScore(x_1, float(y), 1); + tmp_max = (float)layerAbove.getAgastScore(x_1, float(y), 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x_1 + 1); max_y = y; } - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerAbove.getAgastScore(x, y, 1); + tmp_max = (float)layerAbove.getAgastScore(x, y, 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = x; max_y = y; } } - tmp_max = layerAbove.getAgastScore(x1, float(y), 1); + tmp_max = (float)layerAbove.getAgastScore(x1, float(y), 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x1); max_y = y; } } // bottom row - tmp_max = layerAbove.getAgastScore(x_1, y1, 1); - if (tmp_max > max) + tmp_max = (float)layerAbove.getAgastScore(x_1, y1, 1); + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x_1 + 1); max_y = int(y1); } - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerAbove.getAgastScore(float(x), y1, 1); - if (tmp_max > max) + tmp_max = (float)layerAbove.getAgastScore(float(x), y1, 1); + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = x; max_y = int(y1); } } - tmp_max = layerAbove.getAgastScore(x1, y1, 1); - if (tmp_max > max) + tmp_max = (float)layerAbove.getAgastScore(x1, y1, 1); + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x1); max_y = int(y1); } //find dx/dy: - register int s_0_0 = layerAbove.getAgastScore(max_x - 1, max_y - 1, 1); - register int s_1_0 = layerAbove.getAgastScore(max_x, max_y - 1, 1); - register int s_2_0 = layerAbove.getAgastScore(max_x + 1, max_y - 1, 1); - register int s_2_1 = layerAbove.getAgastScore(max_x + 1, max_y, 1); - register int s_1_1 = layerAbove.getAgastScore(max_x, max_y, 1); - register int s_0_1 = layerAbove.getAgastScore(max_x - 1, max_y, 1); - register int s_0_2 = layerAbove.getAgastScore(max_x - 1, max_y + 1, 1); - register int s_1_2 = layerAbove.getAgastScore(max_x, max_y + 1, 1); - register int s_2_2 = layerAbove.getAgastScore(max_x + 1, max_y + 1, 1); + int s_0_0 = layerAbove.getAgastScore(max_x - 1, max_y - 1, 1); + int s_1_0 = layerAbove.getAgastScore(max_x, max_y - 1, 1); + int s_2_0 = layerAbove.getAgastScore(max_x + 1, max_y - 1, 1); + int s_2_1 = layerAbove.getAgastScore(max_x + 1, max_y, 1); + int s_1_1 = layerAbove.getAgastScore(max_x, max_y, 1); + int s_0_1 = layerAbove.getAgastScore(max_x - 1, max_y, 1); + int s_0_2 = layerAbove.getAgastScore(max_x - 1, max_y + 1, 1); + int s_1_2 = layerAbove.getAgastScore(max_x, max_y + 1, 1); + int s_2_2 = layerAbove.getAgastScore(max_x + 1, max_y + 1, 1); float dx_1, dy_1; float refined_max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, dx_1, dy_1); @@ -1491,8 +1476,8 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const } else { - dx = (real_x * 8.0 + 1.0) / 6.0 - float(x_layer); - dy = (real_y * 8.0 + 1.0) / 6.0 - float(y_layer); + dx = (real_x * 8.0f + 1.0f) / 6.0f - float(x_layer); + dy = (real_y * 8.0f + 1.0f) / 6.0f - float(y_layer); } // saturate @@ -1521,13 +1506,13 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const ismax = true; if (returnrefined) { - return std::max(refined_max, max); + return std::max(refined_max, maxval); } - return max; + return maxval; } inline float -BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, +BriskScaleSpace::getScoreMaxBelow(const int layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, float& dx, float& dy) const { ismax = false; @@ -1541,17 +1526,17 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const if (layer % 2 == 0) { // octave - x_1 = float(8 * (x_layer) + 1 - 4) / 6.0; - x1 = float(8 * (x_layer) + 1 + 4) / 6.0; - y_1 = float(8 * (y_layer) + 1 - 4) / 6.0; - y1 = float(8 * (y_layer) + 1 + 4) / 6.0; + x_1 = float(8 * (x_layer) + 1 - 4) / 6.0f; + x1 = float(8 * (x_layer) + 1 + 4) / 6.0f; + y_1 = float(8 * (y_layer) + 1 - 4) / 6.0f; + y1 = float(8 * (y_layer) + 1 + 4) / 6.0f; } else { - x_1 = float(6 * (x_layer) + 1 - 3) / 4.0; - x1 = float(6 * (x_layer) + 1 + 3) / 4.0; - y_1 = float(6 * (y_layer) + 1 - 3) / 4.0; - y1 = float(6 * (y_layer) + 1 + 3) / 4.0; + x_1 = float(6 * (x_layer) + 1 - 3) / 4.0f; + x1 = float(6 * (x_layer) + 1 + 3) / 4.0f; + y_1 = float(6 * (y_layer) + 1 - 3) / 4.0f; + y1 = float(6 * (y_layer) + 1 + 3) / 4.0f; } // the layer below @@ -1559,15 +1544,15 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const const BriskLayer& layerBelow = pyramid_[layer - 1]; // check the first row - int max_x = x_1 + 1; - int max_y = y_1 + 1; + int max_x = (int)x_1 + 1; + int max_y = (int)y_1 + 1; float tmp_max; - float max = layerBelow.getAgastScore(x_1, y_1, 1); + float max = (float)layerBelow.getAgastScore(x_1, y_1, 1); if (max > threshold) return 0; - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerBelow.getAgastScore(float(x), y_1, 1); + tmp_max = (float)layerBelow.getAgastScore(float(x), y_1, 1); if (tmp_max > threshold) return 0; if (tmp_max > max) @@ -1576,7 +1561,7 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const max_x = x; } } - tmp_max = layerBelow.getAgastScore(x1, y_1, 1); + tmp_max = (float)layerBelow.getAgastScore(x1, y_1, 1); if (tmp_max > threshold) return 0; if (tmp_max > max) @@ -1586,9 +1571,9 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const } // middle rows - for (int y = y_1 + 1; y <= int(y1); y++) + for (int y = (int)y_1 + 1; y <= int(y1); y++) { - tmp_max = layerBelow.getAgastScore(x_1, float(y), 1); + tmp_max = (float)layerBelow.getAgastScore(x_1, float(y), 1); if (tmp_max > threshold) return 0; if (tmp_max > max) @@ -1597,9 +1582,9 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const max_x = int(x_1 + 1); max_y = y; } - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerBelow.getAgastScore(x, y, 1); + tmp_max = (float)layerBelow.getAgastScore(x, y, 1); if (tmp_max > threshold) return 0; if (tmp_max == max) @@ -1629,7 +1614,7 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const max_y = y; } } - tmp_max = layerBelow.getAgastScore(x1, float(y), 1); + tmp_max = (float)layerBelow.getAgastScore(x1, float(y), 1); if (tmp_max > threshold) return 0; if (tmp_max > max) @@ -1641,16 +1626,16 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const } // bottom row - tmp_max = layerBelow.getAgastScore(x_1, y1, 1); + tmp_max = (float)layerBelow.getAgastScore(x_1, y1, 1); if (tmp_max > max) { max = tmp_max; max_x = int(x_1 + 1); max_y = int(y1); } - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerBelow.getAgastScore(float(x), y1, 1); + tmp_max = (float)layerBelow.getAgastScore(float(x), y1, 1); if (tmp_max > max) { max = tmp_max; @@ -1658,7 +1643,7 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const max_y = int(y1); } } - tmp_max = layerBelow.getAgastScore(x1, y1, 1); + tmp_max = (float)layerBelow.getAgastScore(x1, y1, 1); if (tmp_max > max) { max = tmp_max; @@ -1667,15 +1652,15 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const } //find dx/dy: - register int s_0_0 = layerBelow.getAgastScore(max_x - 1, max_y - 1, 1); - register int s_1_0 = layerBelow.getAgastScore(max_x, max_y - 1, 1); - register int s_2_0 = layerBelow.getAgastScore(max_x + 1, max_y - 1, 1); - register int s_2_1 = layerBelow.getAgastScore(max_x + 1, max_y, 1); - register int s_1_1 = layerBelow.getAgastScore(max_x, max_y, 1); - register int s_0_1 = layerBelow.getAgastScore(max_x - 1, max_y, 1); - register int s_0_2 = layerBelow.getAgastScore(max_x - 1, max_y + 1, 1); - register int s_1_2 = layerBelow.getAgastScore(max_x, max_y + 1, 1); - register int s_2_2 = layerBelow.getAgastScore(max_x + 1, max_y + 1, 1); + int s_0_0 = layerBelow.getAgastScore(max_x - 1, max_y - 1, 1); + int s_1_0 = layerBelow.getAgastScore(max_x, max_y - 1, 1); + int s_2_0 = layerBelow.getAgastScore(max_x + 1, max_y - 1, 1); + int s_2_1 = layerBelow.getAgastScore(max_x + 1, max_y, 1); + int s_1_1 = layerBelow.getAgastScore(max_x, max_y, 1); + int s_0_1 = layerBelow.getAgastScore(max_x - 1, max_y, 1); + int s_0_2 = layerBelow.getAgastScore(max_x - 1, max_y + 1, 1); + int s_1_2 = layerBelow.getAgastScore(max_x, max_y + 1, 1); + int s_2_2 = layerBelow.getAgastScore(max_x + 1, max_y + 1, 1); float dx_1, dy_1; float refined_max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, dx_1, dy_1); @@ -1685,34 +1670,34 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const bool returnrefined = true; if (layer % 2 == 0) { - dx = (real_x * 6.0 + 1.0) / 8.0 - float(x_layer); - dy = (real_y * 6.0 + 1.0) / 8.0 - float(y_layer); + dx = (float)((real_x * 6.0 + 1.0) / 8.0) - float(x_layer); + dy = (float)((real_y * 6.0 + 1.0) / 8.0) - float(y_layer); } else { - dx = (real_x * 4.0 - 1.0) / 6.0 - float(x_layer); - dy = (real_y * 4.0 - 1.0) / 6.0 - float(y_layer); + dx = (float)((real_x * 4.0 - 1.0) / 6.0) - float(x_layer); + dy = (float)((real_y * 4.0 - 1.0) / 6.0) - float(y_layer); } // saturate if (dx > 1.0) { - dx = 1.0; + dx = 1.0f; returnrefined = false; } - if (dx < -1.0) + if (dx < -1.0f) { - dx = -1.0; + dx = -1.0f; returnrefined = false; } - if (dy > 1.0) + if (dy > 1.0f) { - dy = 1.0; + dy = 1.0f; returnrefined = false; } - if (dy < -1.0) + if (dy < -1.0f) { - dy = -1.0; + dy = -1.0f; returnrefined = false; } @@ -1743,17 +1728,17 @@ BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, flo if (s0 >= s_05 && s0 >= s05) { max = s0; - return 1.0; + return 1.0f; } if (s_05 >= s0 && s_05 >= s05) { max = s_05; - return 0.75; + return 0.75f; } if (s05 >= s0 && s05 >= s_05) { max = s05; - return 1.5; + return 1.5f; } } @@ -1767,7 +1752,7 @@ BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, flo ret_val = 1.5; // allow to be slightly off bounds ...? int three_c = +24 * i_05 - 27 * i0 + 6 * i05; max = float(three_c) + float(three_a) * ret_val * ret_val + float(three_b) * ret_val; - max /= 3072.0; + max /= 3072.0f; return ret_val; } @@ -1789,17 +1774,17 @@ BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, f if (s0 >= s_05 && s0 >= s05) { max = s0; - return 1.0; + return 1.0f; } if (s_05 >= s0 && s_05 >= s05) { max = s_05; - return 0.6666666666666666666666666667; + return 0.6666666666666666666666666667f; } if (s05 >= s0 && s05 >= s_05) { max = s05; - return 1.3333333333333333333333333333; + return 1.3333333333333333333333333333f; } } @@ -1807,13 +1792,13 @@ BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, f // calculate max location: float ret_val = -float(two_b) / float(2 * two_a); // saturate and return - if (ret_val < 0.6666666666666666666666666667) - ret_val = 0.666666666666666666666666667; - else if (ret_val > 1.33333333333333333333333333) - ret_val = 1.333333333333333333333333333; + if (ret_val < 0.6666666666666666666666666667f) + ret_val = 0.666666666666666666666666667f; + else if (ret_val > 1.33333333333333333333333333f) + ret_val = 1.333333333333333333333333333f; int two_c = +12 * i_05 - 16 * i0 + 6 * i05; max = float(two_c) + float(two_a) * ret_val * ret_val + float(two_b) * ret_val; - max /= 2048.0; + max /= 2048.0f; return ret_val; } @@ -1835,17 +1820,17 @@ BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, f if (s0 >= s_05 && s0 >= s05) { max = s0; - return 1.0; + return 1.0f; } if (s_05 >= s0 && s_05 >= s05) { max = s_05; - return 0.7; + return 0.7f; } if (s05 >= s0 && s05 >= s_05) { max = s05; - return 1.5; + return 1.5f; } } @@ -1853,10 +1838,10 @@ BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, f // calculate max location: float ret_val = -float(b) / float(2 * a); // saturate and return - if (ret_val < 0.7) - ret_val = 0.7; - else if (ret_val > 1.5) - ret_val = 1.5; // allow to be slightly off bounds ...? + if (ret_val < 0.7f) + ret_val = 0.7f; + else if (ret_val > 1.5f) + ret_val = 1.5f; // allow to be slightly off bounds ...? int c = +3 * i_05 - 3 * i0 + 1 * i05; max = float(c) + float(a) * ret_val * ret_val + float(b) * ret_val; max /= 1024; @@ -1870,56 +1855,56 @@ BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, c { // the coefficients of the 2d quadratic function least-squares fit: - register int tmp1 = s_0_0 + s_0_2 - 2 * s_1_1 + s_2_0 + s_2_2; - register int coeff1 = 3 * (tmp1 + s_0_1 - ((s_1_0 + s_1_2) << 1) + s_2_1); - register int coeff2 = 3 * (tmp1 - ((s_0_1 + s_2_1) << 1) + s_1_0 + s_1_2); - register int tmp2 = s_0_2 - s_2_0; - register int tmp3 = (s_0_0 + tmp2 - s_2_2); - register int tmp4 = tmp3 - 2 * tmp2; - register int coeff3 = -3 * (tmp3 + s_0_1 - s_2_1); - register int coeff4 = -3 * (tmp4 + s_1_0 - s_1_2); - register int coeff5 = (s_0_0 - s_0_2 - s_2_0 + s_2_2) << 2; - register int coeff6 = -(s_0_0 + s_0_2 - ((s_1_0 + s_0_1 + s_1_2 + s_2_1) << 1) - 5 * s_1_1 + s_2_0 + s_2_2) << 1; + int tmp1 = s_0_0 + s_0_2 - 2 * s_1_1 + s_2_0 + s_2_2; + int coeff1 = 3 * (tmp1 + s_0_1 - ((s_1_0 + s_1_2) << 1) + s_2_1); + int coeff2 = 3 * (tmp1 - ((s_0_1 + s_2_1) << 1) + s_1_0 + s_1_2); + int tmp2 = s_0_2 - s_2_0; + int tmp3 = (s_0_0 + tmp2 - s_2_2); + int tmp4 = tmp3 - 2 * tmp2; + int coeff3 = -3 * (tmp3 + s_0_1 - s_2_1); + int coeff4 = -3 * (tmp4 + s_1_0 - s_1_2); + int coeff5 = (s_0_0 - s_0_2 - s_2_0 + s_2_2) << 2; + int coeff6 = -(s_0_0 + s_0_2 - ((s_1_0 + s_0_1 + s_1_2 + s_2_1) << 1) - 5 * s_1_1 + s_2_0 + s_2_2) << 1; // 2nd derivative test: - register int H_det = 4 * coeff1 * coeff2 - coeff5 * coeff5; + int H_det = 4 * coeff1 * coeff2 - coeff5 * coeff5; if (H_det == 0) { - delta_x = 0.0; - delta_y = 0.0; - return float(coeff6) / 18.0; + delta_x = 0.0f; + delta_y = 0.0f; + return float(coeff6) / 18.0f; } if (!(H_det > 0 && coeff1 < 0)) { // The maximum must be at the one of the 4 patch corners. int tmp_max = coeff3 + coeff4 + coeff5; - delta_x = 1.0; - delta_y = 1.0; + delta_x = 1.0f; + delta_y = 1.0f; int tmp = -coeff3 + coeff4 - coeff5; if (tmp > tmp_max) { tmp_max = tmp; - delta_x = -1.0; - delta_y = 1.0; + delta_x = -1.0f; + delta_y = 1.0f; } tmp = coeff3 - coeff4 - coeff5; if (tmp > tmp_max) { tmp_max = tmp; - delta_x = 1.0; - delta_y = -1.0; + delta_x = 1.0f; + delta_y = -1.0f; } tmp = -coeff3 - coeff4 + coeff5; if (tmp > tmp_max) { tmp_max = tmp; - delta_x = -1.0; - delta_y = -1.0; + delta_x = -1.0f; + delta_y = -1.0f; } - return float(tmp_max + coeff1 + coeff2 + coeff6) / 18.0; + return float(tmp_max + coeff1 + coeff2 + coeff6) / 18.0f; } // this is hopefully the normal outcome of the Hessian test @@ -1942,50 +1927,50 @@ BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, c if (tx || tx_ || ty || ty_) { // get two candidates: - float delta_x1 = 0.0, delta_x2 = 0.0, delta_y1 = 0.0, delta_y2 = 0.0; + float delta_x1 = 0.0f, delta_x2 = 0.0f, delta_y1 = 0.0f, delta_y2 = 0.0f; if (tx) { - delta_x1 = 1.0; + delta_x1 = 1.0f; delta_y1 = -float(coeff4 + coeff5) / float(2 * coeff2); - if (delta_y1 > 1.0) - delta_y1 = 1.0; - else if (delta_y1 < -1.0) - delta_y1 = -1.0; + if (delta_y1 > 1.0f) + delta_y1 = 1.0f; + else if (delta_y1 < -1.0f) + delta_y1 = -1.0f; } else if (tx_) { - delta_x1 = -1.0; + delta_x1 = -1.0f; delta_y1 = -float(coeff4 - coeff5) / float(2 * coeff2); - if (delta_y1 > 1.0) - delta_y1 = 1.0; + if (delta_y1 > 1.0f) + delta_y1 = 1.0f; else if (delta_y1 < -1.0) - delta_y1 = -1.0; + delta_y1 = -1.0f; } if (ty) { - delta_y2 = 1.0; + delta_y2 = 1.0f; delta_x2 = -float(coeff3 + coeff5) / float(2 * coeff1); - if (delta_x2 > 1.0) - delta_x2 = 1.0; - else if (delta_x2 < -1.0) - delta_x2 = -1.0; + if (delta_x2 > 1.0f) + delta_x2 = 1.0f; + else if (delta_x2 < -1.0f) + delta_x2 = -1.0f; } else if (ty_) { - delta_y2 = -1.0; + delta_y2 = -1.0f; delta_x2 = -float(coeff3 - coeff5) / float(2 * coeff1); - if (delta_x2 > 1.0) - delta_x2 = 1.0; - else if (delta_x2 < -1.0) - delta_x2 = -1.0; + if (delta_x2 > 1.0f) + delta_x2 = 1.0f; + else if (delta_x2 < -1.0f) + delta_x2 = -1.0f; } // insert both options for evaluation which to pick float max1 = (coeff1 * delta_x1 * delta_x1 + coeff2 * delta_y1 * delta_y1 + coeff3 * delta_x1 + coeff4 * delta_y1 + coeff5 * delta_x1 * delta_y1 + coeff6) - / 18.0; + / 18.0f; float max2 = (coeff1 * delta_x2 * delta_x2 + coeff2 * delta_y2 * delta_y2 + coeff3 * delta_x2 + coeff4 * delta_y2 + coeff5 * delta_x2 * delta_y2 + coeff6) - / 18.0; + / 18.0f; if (max1 > max2) { delta_x = delta_x1; @@ -2003,7 +1988,7 @@ BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, c // this is the case of the maximum inside the boundaries: return (coeff1 * delta_x * delta_x + coeff2 * delta_y * delta_y + coeff3 * delta_x + coeff4 * delta_y + coeff5 * delta_x * delta_y + coeff6) - / 18.0; + / 18.0f; } // construct a layer @@ -2016,8 +2001,8 @@ BriskLayer::BriskLayer(const cv::Mat& img_in, float scale_in, float offset_in) offset_ = offset_in; // create an agast detector fast_9_16_ = new FastFeatureDetector(1, true, FastFeatureDetector::TYPE_9_16); - makeOffsets(pixel_5_8_, img_.step, 8); - makeOffsets(pixel_9_16_, img_.step, 16); + makeOffsets(pixel_5_8_, (int)img_.step, 8); + makeOffsets(pixel_9_16_, (int)img_.step, 16); } // derive a layer BriskLayer::BriskLayer(const BriskLayer& layer, int mode) @@ -2027,68 +2012,69 @@ BriskLayer::BriskLayer(const BriskLayer& layer, int mode) img_.create(layer.img().rows / 2, layer.img().cols / 2, CV_8U); halfsample(layer.img(), img_); scale_ = layer.scale() * 2; - offset_ = 0.5 * scale_ - 0.5; + offset_ = 0.5f * scale_ - 0.5f; } else { img_.create(2 * (layer.img().rows / 3), 2 * (layer.img().cols / 3), CV_8U); twothirdsample(layer.img(), img_); - scale_ = layer.scale() * 1.5; - offset_ = 0.5 * scale_ - 0.5; + scale_ = layer.scale() * 1.5f; + offset_ = 0.5f * scale_ - 0.5f; } scores_ = cv::Mat::zeros(img_.rows, img_.cols, CV_8U); fast_9_16_ = new FastFeatureDetector(1, false, FastFeatureDetector::TYPE_9_16); - makeOffsets(pixel_5_8_, img_.step, 8); - makeOffsets(pixel_9_16_, img_.step, 16); + makeOffsets(pixel_5_8_, (int)img_.step, 8); + makeOffsets(pixel_9_16_, (int)img_.step, 16); } // Fast/Agast // wraps the agast class void -BriskLayer::getAgastPoints(uint8_t threshold, std::vector& keypoints) +BriskLayer::getAgastPoints(int threshold, std::vector& keypoints) { fast_9_16_->set("threshold", threshold); fast_9_16_->detect(img_, keypoints); // also write scores - const int num = keypoints.size(); + const size_t num = keypoints.size(); - for (int i = 0; i < num; i++) - scores_(keypoints[i].pt.y, keypoints[i].pt.x) = keypoints[i].response; + for (size_t i = 0; i < num; i++) + scores_((int)keypoints[i].pt.y, (int)keypoints[i].pt.x) = saturate_cast(keypoints[i].response); } -inline uint8_t -BriskLayer::getAgastScore(int x, int y, uint8_t threshold) const + +inline int +BriskLayer::getAgastScore(int x, int y, int threshold) const { if (x < 3 || y < 3) return 0; if (x >= img_.cols - 3 || y >= img_.rows - 3) return 0; - uint8_t& score = *(scores_.data + x + y * scores_.cols); + uchar& score = (uchar&)scores_(y, x); if (score > 2) { return score; } - score = cornerScore<16>(img_.data + x + y * img_.cols, pixel_9_16_, threshold - 1); + score = (uchar)cornerScore<16>(&img_.at(y, x), pixel_9_16_, threshold - 1); if (score < threshold) score = 0; return score; } -inline uint8_t -BriskLayer::getAgastScore_5_8(int x, int y, uint8_t threshold) const +inline int +BriskLayer::getAgastScore_5_8(int x, int y, int threshold) const { if (x < 2 || y < 2) return 0; if (x >= img_.cols - 2 || y >= img_.rows - 2) return 0; - uint8_t score = cornerScore<8>(img_.data + x + y * img_.cols, pixel_5_8_, threshold - 1); + int score = cornerScore<8>(&img_.at(y, x), pixel_5_8_, threshold - 1); if (score < threshold) score = 0; return score; } -inline uint8_t -BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_in) const +inline int +BriskLayer::getAgastScore(float xf, float yf, int threshold_in, float scale_in) const { if (scale_in <= 1.0f) { @@ -2100,8 +2086,8 @@ BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_ const float ry1 = yf - float(y); const float ry = 1.0f - ry1; - return rx * ry * getAgastScore(x, y, threshold_in) + rx1 * ry * getAgastScore(x + 1, y, threshold_in) - + rx * ry1 * getAgastScore(x, y + 1, threshold_in) + rx1 * ry1 * getAgastScore(x + 1, y + 1, threshold_in); + return (uchar)(rx * ry * getAgastScore(x, y, threshold_in) + rx1 * ry * getAgastScore(x + 1, y, threshold_in) + + rx * ry1 * getAgastScore(x, y + 1, threshold_in) + rx1 * ry1 * getAgastScore(x + 1, y + 1, threshold_in)); } else { @@ -2121,26 +2107,26 @@ BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_ } // access gray values (smoothed/interpolated) -inline uint8_t +inline int BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) const { assert(!mat.empty()); // get the position - const int x = floor(xf); - const int y = floor(yf); + const int x = cvFloor(xf); + const int y = cvFloor(yf); const cv::Mat& image = mat; const int& imagecols = image.cols; // get the sigma_half: const float sigma_half = scale_in / 2; - const float area = 4.0 * sigma_half * sigma_half; + const float area = 4.0f * sigma_half * sigma_half; // calculate output: int ret_val; if (sigma_half < 0.5) { //interpolation multipliers: - const int r_x = (xf - x) * 1024; - const int r_y = (yf - y) * 1024; + const int r_x = (int)((xf - x) * 1024); + const int r_y = (int)((yf - y) * 1024); const int r_x_1 = (1024 - r_x); const int r_y_1 = (1024 - r_y); uchar* ptr = image.data + x + y * imagecols; @@ -2158,8 +2144,8 @@ BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) const // this is the standard case (simple, not speed optimized yet): // scaling: - const int scaling = 4194304.0 / area; - const int scaling2 = float(scaling) * area / 1024.0; + const int scaling = (int)(4194304.0f / area); + const int scaling2 = (int)(float(scaling) * area / 1024.0f); // calculate borders const float x_1 = xf - sigma_half; @@ -2173,20 +2159,20 @@ BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) const const int y_bottom = int(y1 + 0.5); // overlap area - multiplication factors: - const float r_x_1 = float(x_left) - x_1 + 0.5; - const float r_y_1 = float(y_top) - y_1 + 0.5; - const float r_x1 = x1 - float(x_right) + 0.5; - const float r_y1 = y1 - float(y_bottom) + 0.5; + const float r_x_1 = float(x_left) - x_1 + 0.5f; + const float r_y_1 = float(y_top) - y_1 + 0.5f; + const float r_x1 = x1 - float(x_right) + 0.5f; + const float r_y1 = y1 - float(y_bottom) + 0.5f; const int dx = x_right - x_left - 1; const int dy = y_bottom - y_top - 1; - const int A = (r_x_1 * r_y_1) * scaling; - const int B = (r_x1 * r_y_1) * scaling; - const int C = (r_x1 * r_y1) * scaling; - const int D = (r_x_1 * r_y1) * scaling; - const int r_x_1_i = r_x_1 * scaling; - const int r_y_1_i = r_y_1 * scaling; - const int r_x1_i = r_x1 * scaling; - const int r_y1_i = r_y1 * scaling; + const int A = (int)((r_x_1 * r_y_1) * scaling); + const int B = (int)((r_x1 * r_y_1) * scaling); + const int C = (int)((r_x1 * r_y1) * scaling); + const int D = (int)((r_x_1 * r_y1) * scaling); + const int r_x_1_i = (int)(r_x_1 * scaling); + const int r_y_1_i = (int)(r_y_1 * scaling); + const int r_x1_i = (int)(r_x1 * scaling); + const int r_y1_i = (int)(r_y1 * scaling); // now the calculation: uchar* ptr = image.data + x_left + imagecols * y_top; diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index ac0bb61..cbe9e29 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -1314,7 +1314,7 @@ public: ssize.width *= cn; int dy, dx, k = 0; - VecOp vop(scale_x, scale_y, src.channels(), src.step/*, area_ofs*/); + VecOp vop(scale_x, scale_y, src.channels(), (int)src.step/*, area_ofs*/); for( dy = range.start; dy < range.end; dy++ ) {