From 4b1724aeb918d293fd5a4a1e7a6b400142988462 Mon Sep 17 00:00:00 2001 From: Marina Kolpakova Date: Fri, 1 Jun 2012 15:12:10 +0000 Subject: [PATCH] fix for ORB tests --- modules/gpu/src/orb.cpp | 51 ++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/modules/gpu/src/orb.cpp b/modules/gpu/src/orb.cpp index 1dba7a7090..2621398878 100644 --- a/modules/gpu/src/orb.cpp +++ b/modules/gpu/src/orb.cpp @@ -63,7 +63,7 @@ void cv::gpu::ORB_GPU::mergeKeyPoints(GpuMat&) { throw_nogpu(); } #else /* !defined (HAVE_CUDA) */ -namespace cv { namespace gpu { namespace device +namespace cv { namespace gpu { namespace device { namespace orb { @@ -345,8 +345,8 @@ namespace 9,-7, 10,-2/*mean (0.124978), correlation (0.549846)*/, 7,0, 12,-2/*mean (0.127002), correlation (0.537452)*/, -1,-6, 0,-11/*mean (0.127148), correlation (0.547401)*/ - }; - + }; + void initializeOrbPattern(const Point* pattern0, Mat& pattern, int ntuples, int tupleSize, int poolSize) { RNG rng(0x12345678); @@ -356,7 +356,7 @@ namespace int* pattern_x_ptr = pattern.ptr(0); int* pattern_y_ptr = pattern.ptr(1); - + for (int i = 0; i < ntuples; i++) { for (int k = 0; k < tupleSize; k++) @@ -386,8 +386,8 @@ namespace { // we always start with a fixed seed, // to make patterns the same on each run - RNG rng(0x34985739); - + RNG rng(0x34985739); + for (int i = 0; i < npoints; i++) { pattern[i].x = rng.uniform(-patchSize / 2, patchSize / 2 + 1); @@ -400,11 +400,11 @@ cv::gpu::ORB_GPU::ORB_GPU(int nFeatures, float scaleFactor, int nLevels, int edg nFeatures_(nFeatures), scaleFactor_(scaleFactor), nLevels_(nLevels), edgeThreshold_(edgeThreshold), firstLevel_(firstLevel), WTA_K_(WTA_K), scoreType_(scoreType), patchSize_(patchSize), fastDetector_(DEFAULT_FAST_THRESHOLD) -{ +{ // fill the extractors and descriptors for the corresponding scales float factor = 1.0f / scaleFactor_; float n_desired_features_per_scale = nFeatures_ * (1.0f - factor) / (1.0f - std::pow(factor, nLevels_)); - + n_features_per_level_.resize(nLevels_); size_t sum_n_features = 0; for (int level = 0; level < nLevels_ - 1; ++level) @@ -420,7 +420,7 @@ cv::gpu::ORB_GPU::ORB_GPU(int nFeatures, float scaleFactor, int nLevels, int edg vector u_max(half_patch_size + 1); for (int v = 0; v <= half_patch_size * std::sqrt(2.f) / 2 + 1; ++v) u_max[v] = cvRound(std::sqrt(static_cast(half_patch_size * half_patch_size - v * v))); - + // Make sure we are symmetric for (int v = half_patch_size, v_0 = 0; v >= half_patch_size * std::sqrt(2.f) / 2; --v) { @@ -431,7 +431,7 @@ cv::gpu::ORB_GPU::ORB_GPU(int nFeatures, float scaleFactor, int nLevels, int edg } CV_Assert(u_max.size() < 32); cv::gpu::device::orb::loadUMax(&u_max[0], static_cast(u_max.size())); - + // Calc pattern const int npoints = 512; Point pattern_buf[npoints]; @@ -441,15 +441,15 @@ cv::gpu::ORB_GPU::ORB_GPU(int nFeatures, float scaleFactor, int nLevels, int edg pattern0 = pattern_buf; makeRandomPattern(patchSize_, pattern_buf, npoints); } - - CV_Assert(WTA_K_ == 2 || WTA_K_ == 3 || WTA_K_ == 4); + + CV_Assert(WTA_K_ == 2 || WTA_K_ == 3 || WTA_K_ == 4); Mat h_pattern; if (WTA_K_ == 2) { h_pattern.create(2, npoints, CV_32SC1); - + int* pattern_x_ptr = h_pattern.ptr(0); int* pattern_y_ptr = h_pattern.ptr(1); @@ -466,7 +466,7 @@ cv::gpu::ORB_GPU::ORB_GPU(int nFeatures, float scaleFactor, int nLevels, int edg } pattern_.upload(h_pattern); - + blurFilter = createGaussianFilter_GPU(CV_8UC1, Size(7, 7), 2, 2, BORDER_REFLECT_101); blurForDescriptor = false; @@ -497,7 +497,7 @@ void cv::gpu::ORB_GPU::buildScalePyramids(const GpuMat& image, const GpuMat& mas ensureSizeIsEnough(sz, image.type(), imagePyr_[level]); ensureSizeIsEnough(sz, CV_8UC1, maskPyr_[level]); maskPyr_[level].setTo(Scalar::all(255)); - + // Compute the resized image if (level != firstLevel_) { @@ -513,7 +513,10 @@ void cv::gpu::ORB_GPU::buildScalePyramids(const GpuMat& image, const GpuMat& mas resize(imagePyr_[level - 1], imagePyr_[level], sz, 0, 0, INTER_LINEAR); if (!mask.empty()) + { resize(maskPyr_[level - 1], maskPyr_[level], sz, 0, 0, INTER_LINEAR); + threshold(maskPyr_[level], maskPyr_[level], 254, 0, THRESH_TOZERO); + } } } else @@ -544,7 +547,7 @@ namespace //this is only necessary if the keypoints size is greater than the number of desired points. if (count > n_points) { - if (n_points == 0) + if (n_points == 0) { keypoints.release(); return; @@ -563,7 +566,7 @@ void cv::gpu::ORB_GPU::computeKeyPointsPyramid() keyPointsPyr_.resize(nLevels_); keyPointsCount_.resize(nLevels_); - + for (int level = 0; level < nLevels_; ++level) { keyPointsCount_[level] = fastDetector_.calcKeyPointsLocation(imagePyr_[level], maskPyr_[level]); @@ -588,7 +591,7 @@ void cv::gpu::ORB_GPU::computeKeyPointsPyramid() // Compute the Harris cornerness (better scoring than FAST) HarrisResponses_gpu(imagePyr_[level], keyPointsPyr_[level].ptr(0), keyPointsPyr_[level].ptr(1), keyPointsCount_[level], 7, HARRIS_K, 0); - } + } //cull to the final desired level, using the new Harris scores or the original FAST scores. cull(keyPointsPyr_[level], keyPointsCount_[level], n_features); @@ -618,7 +621,7 @@ void cv::gpu::ORB_GPU::computeDescriptors(GpuMat& descriptors) int offset = 0; for (int level = 0; level < nLevels_; ++level) - { + { if (keyPointsCount_[level] == 0) continue; @@ -631,7 +634,7 @@ void cv::gpu::ORB_GPU::computeDescriptors(GpuMat& descriptors) blurFilter->apply(imagePyr_[level], buf_, Rect(0, 0, imagePyr_[level].cols, imagePyr_[level].rows)); } - computeOrbDescriptor_gpu(blurForDescriptor ? buf_ : imagePyr_[level], keyPointsPyr_[level].ptr(0), keyPointsPyr_[level].ptr(2), + computeOrbDescriptor_gpu(blurForDescriptor ? buf_ : imagePyr_[level], keyPointsPyr_[level].ptr(0), keyPointsPyr_[level].ptr(2), keyPointsCount_[level], pattern_.ptr(0), pattern_.ptr(1), descRange, descriptorSize(), WTA_K_, 0); offset += keyPointsCount_[level]; @@ -656,7 +659,7 @@ void cv::gpu::ORB_GPU::mergeKeyPoints(GpuMat& keypoints) ensureSizeIsEnough(ROWS_COUNT, nAllkeypoints, CV_32FC1, keypoints); int offset = 0; - + for (int level = 0; level < nLevels_; ++level) { if (keyPointsCount_[level] == 0) @@ -664,15 +667,15 @@ void cv::gpu::ORB_GPU::mergeKeyPoints(GpuMat& keypoints) float sf = getScale(scaleFactor_, firstLevel_, level); - GpuMat keyPointsRange = keypoints.colRange(offset, offset + keyPointsCount_[level]); - + GpuMat keyPointsRange = keypoints.colRange(offset, offset + keyPointsCount_[level]); + float locScale = level != firstLevel_ ? sf : 1.0f; mergeLocation_gpu(keyPointsPyr_[level].ptr(0), keyPointsRange.ptr(0), keyPointsRange.ptr(1), keyPointsCount_[level], locScale, 0); GpuMat range = keyPointsRange.rowRange(2, 4); keyPointsPyr_[level](Range(1, 3), Range(0, keyPointsCount_[level])).copyTo(range); - + keyPointsRange.row(4).setTo(Scalar::all(level)); keyPointsRange.row(5).setTo(Scalar::all(patchSize_ * sf)); -- GitLab