Skip to content

Commit 66843d9

Browse files
Albertsovrasov
authored andcommitted
Enable SURF OCL. Fix incorrect calling sequence for two kernels. Fix compiler warnings in surf.cl. Enable SURF OCL test. Test runs with no failures.
1 parent b954189 commit 66843d9

File tree

4 files changed

+42
-56
lines changed

4 files changed

+42
-56
lines changed

modules/xfeatures2d/src/opencl/surf.cl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,10 +1102,10 @@ void SURF_computeDescriptors128(
11021102
descriptors_step /= sizeof(*descriptors);
11031103
keypoints_step /= sizeof(*keypoints);
11041104

1105-
__global float * featureX = keypoints + X_ROW * keypoints_step;
1106-
__global float * featureY = keypoints + Y_ROW * keypoints_step;
1107-
__global float* featureSize = keypoints + SIZE_ROW * keypoints_step;
1108-
__global float* featureDir = keypoints + ANGLE_ROW * keypoints_step;
1105+
__global const float * featureX = keypoints + X_ROW * keypoints_step;
1106+
__global const float * featureY = keypoints + Y_ROW * keypoints_step;
1107+
__global const float* featureSize = keypoints + SIZE_ROW * keypoints_step;
1108+
__global const float* featureDir = keypoints + ANGLE_ROW * keypoints_step;
11091109

11101110
// 2 floats (dx,dy) for each thread (5x5 sample points in each sub-region)
11111111
volatile __local float sdx[25];

modules/xfeatures2d/src/surf.ocl.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,13 @@ bool SURF_OCL::init(const SURF_Impl* p)
9191
if(ocl::haveOpenCL())
9292
{
9393
const ocl::Device& dev = ocl::Device::getDefault();
94-
if( dev.type() == ocl::Device::TYPE_CPU || dev.doubleFPConfig() == 0 )
94+
if( dev.type() == ocl::Device::TYPE_CPU )
9595
return false;
96-
haveImageSupport = false;//dev.imageSupport();
97-
kerOpts = haveImageSupport ? "-D HAVE_IMAGE2D -D DOUBLE_SUPPORT" : "";
98-
// status = 1;
96+
haveImageSupport = dev.imageSupport();
97+
kerOpts = format("%s%s",
98+
haveImageSupport ? "-D HAVE_IMAGE2D" : "",
99+
dev.doubleFPConfig() > 0? " -D DOUBLE_SUPPORT": "");
100+
status = 1;
99101
}
100102
}
101103
return status > 0;
@@ -243,7 +245,7 @@ bool SURF_OCL::computeDescriptors(const UMat &keypoints, OutputArray _descriptor
243245
}
244246

245247
size_t localThreads[] = {6, 6};
246-
size_t globalThreads[] = {nFeatures*localThreads[0], localThreads[1]};
248+
size_t globalThreads[] = {nFeatures*localThreads[0], 16 * localThreads[1]};
247249

248250
if(haveImageSupport)
249251
{
@@ -420,7 +422,7 @@ bool SURF_OCL::findMaximaInLayer(int counterOffset, int octave,
420422
ocl::KernelArg::PtrReadWrite(maxPosBuffer),
421423
ocl::KernelArg::PtrReadWrite(counters),
422424
counterOffset, img_rows, img_cols,
423-
octave, nOctaveLayers,
425+
nOctaveLayers, octave,
424426
layer_rows, layer_cols,
425427
maxCandidates,
426428
(float)params->hessianThreshold).run(2, globalThreads, localThreads, true);

modules/xfeatures2d/test/test_precomp.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
#include "opencv2/opencv_modules.hpp"
2222
#include "cvconfig.h"
2323

24-
#ifdef HAVE_OPENCV_OCL
25-
# include "opencv2/ocl.hpp"
24+
#ifdef HAVE_OPENCL
25+
# include "opencv2/core/ocl.hpp"
2626
#endif
2727

2828
#ifdef HAVE_CUDA

modules/xfeatures2d/test/test_surf.ocl.cpp

Lines changed: 28 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,13 @@
4545

4646
#include "test_precomp.hpp"
4747

48-
#ifdef HAVE_OPENCV_OCL
48+
#ifdef HAVE_OPENCL
49+
50+
namespace cvtest {
51+
namespace ocl {
4952

5053
using namespace std;
5154
using std::tr1::get;
52-
5355
static bool keyPointsEquals(const cv::KeyPoint& p1, const cv::KeyPoint& p2)
5456
{
5557
const double maxPtDif = 0.1;
@@ -133,31 +135,20 @@ PARAM_TEST_CASE(SURF, HessianThreshold, Octaves, OctaveLayers, Extended, Upright
133135
}
134136
};
135137

136-
TEST_P(SURF, DISABLED_Detector)
138+
TEST_P(SURF, Detector)
137139
{
138-
cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE);
140+
cv::UMat image;
141+
cv::ocl::setUseOpenCL(true);
142+
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
139143
ASSERT_FALSE(image.empty());
140144

141-
cv::ocl::SURF_OCL surf;
142-
surf.hessianThreshold = static_cast<float>(hessianThreshold);
143-
surf.nOctaves = nOctaves;
144-
surf.nOctaveLayers = nOctaveLayers;
145-
surf.extended = extended;
146-
surf.upright = upright;
147-
surf.keypointsRatio = 0.05f;
148-
145+
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
149146
std::vector<cv::KeyPoint> keypoints;
150-
surf(cv::ocl::oclMat(image), cv::ocl::oclMat(), keypoints);
151-
152-
cv::SURF surf_gold;
153-
surf_gold.hessianThreshold = hessianThreshold;
154-
surf_gold.nOctaves = nOctaves;
155-
surf_gold.nOctaveLayers = nOctaveLayers;
156-
surf_gold.extended = extended;
157-
surf_gold.upright = upright;
147+
surf->detect(image, keypoints, cv::noArray());
158148

149+
cv::ocl::setUseOpenCL(false);
159150
std::vector<cv::KeyPoint> keypoints_gold;
160-
surf_gold(image, cv::noArray(), keypoints_gold);
151+
surf->detect(image, keypoints_gold, cv::noArray());
161152

162153
ASSERT_EQ(keypoints_gold.size(), keypoints.size());
163154
int matchedCount = getMatchedPointsCount(keypoints_gold, keypoints);
@@ -166,38 +157,29 @@ TEST_P(SURF, DISABLED_Detector)
166157
EXPECT_GT(matchedRatio, 0.99);
167158
}
168159

169-
TEST_P(SURF, DISABLED_Descriptor)
160+
TEST_P(SURF, Descriptor)
170161
{
171-
cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE);
162+
cv::UMat image;
163+
cv::ocl::setUseOpenCL(true);
164+
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
172165
ASSERT_FALSE(image.empty());
173166

174-
cv::ocl::SURF_OCL surf;
175-
surf.hessianThreshold = static_cast<float>(hessianThreshold);
176-
surf.nOctaves = nOctaves;
177-
surf.nOctaveLayers = nOctaveLayers;
178-
surf.extended = extended;
179-
surf.upright = upright;
180-
surf.keypointsRatio = 0.05f;
181-
182-
cv::SURF surf_gold;
183-
surf_gold.hessianThreshold = hessianThreshold;
184-
surf_gold.nOctaves = nOctaves;
185-
surf_gold.nOctaveLayers = nOctaveLayers;
186-
surf_gold.extended = extended;
187-
surf_gold.upright = upright;
167+
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
188168

189169
std::vector<cv::KeyPoint> keypoints;
190-
surf_gold(image, cv::noArray(), keypoints);
170+
surf->detect(image, keypoints, cv::noArray());
171+
172+
cv::UMat descriptors;
191173

192-
cv::ocl::oclMat descriptors;
193-
surf(cv::ocl::oclMat(image), cv::ocl::oclMat(), keypoints, descriptors, true);
174+
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors, true);
194175

176+
cv::ocl::setUseOpenCL(false);
195177
cv::Mat descriptors_gold;
196-
surf_gold(image, cv::noArray(), keypoints, descriptors_gold, true);
178+
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors_gold, true);
197179

198-
cv::BFMatcher matcher(surf.defaultNorm());
180+
cv::BFMatcher matcher(surf->defaultNorm());
199181
std::vector<cv::DMatch> matches;
200-
matcher.match(descriptors_gold, cv::Mat(descriptors), matches);
182+
matcher.match(descriptors_gold, descriptors, matches);
201183

202184
int matchedCount = getMatchedPointsCount(keypoints, keypoints, matches);
203185
double matchedRatio = static_cast<double>(matchedCount) / keypoints.size();
@@ -212,4 +194,6 @@ INSTANTIATE_TEST_CASE_P(OCL_Features2D, SURF, testing::Combine(
212194
testing::Values(Extended(false), Extended(true)),
213195
testing::Values(Upright(false), Upright(true))));
214196

215-
#endif // HAVE_OPENCV_OCL
197+
} } // namespace cvtest::ocl
198+
199+
#endif // HAVE_OPENCL

0 commit comments

Comments
 (0)