Skip to content

Commit dedce9a

Browse files
committed
Merge pull request #1383 from alalek:fix_surf
2 parents d32827a + 2e2b629 commit dedce9a

File tree

3 files changed

+39
-16
lines changed

3 files changed

+39
-16
lines changed

modules/xfeatures2d/src/surf.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ void SURF_Impl::detectAndCompute(InputArray _img, InputArray _mask,
893893
CV_Assert(_descriptors.needed() || !useProvidedKeypoints);
894894

895895
#ifdef HAVE_OPENCL
896-
if( ocl::useOpenCL() )
896+
if( ocl::useOpenCL() && _img.isUMat())
897897
{
898898
SURF_OCL ocl_surf;
899899
UMat gpu_kpt;

modules/xfeatures2d/test/test_features2d.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,18 @@ class CV_DescriptorExtractorTest : public cvtest::BaseTest
408408

409409
Mat calcDescriptors;
410410
double t = (double)getTickCount();
411-
dextractor->compute( img, keypoints, calcDescriptors );
411+
#ifdef HAVE_OPENCL
412+
if(ocl::useOpenCL())
413+
{
414+
cv::UMat uimg;
415+
img.copyTo(uimg);
416+
dextractor->compute(uimg, keypoints, calcDescriptors);
417+
}
418+
else
419+
#endif
420+
{
421+
dextractor->compute(img, keypoints, calcDescriptors);
422+
}
412423
t = getTickCount() - t;
413424
ts->printf(cvtest::TS::LOG, "\nAverage time of computing one descriptor = %g ms.\n", t/((double)getTickFrequency()*1000.)/calcDescriptors.rows );
414425

@@ -1277,8 +1288,20 @@ class CV_DetectPlanarTest : public cvtest::BaseTest
12771288
}
12781289
vector<KeyPoint> kpt1, kpt2;
12791290
Mat d1, d2;
1280-
f2d->detectAndCompute(img1, Mat(), kpt1, d1);
1281-
f2d->detectAndCompute(img1, Mat(), kpt2, d2);
1291+
#ifdef HAVE_OPENCL
1292+
if(ocl::useOpenCL())
1293+
{
1294+
cv::UMat uimg1;
1295+
img1.copyTo(uimg1);
1296+
f2d->detectAndCompute(uimg1, Mat(), kpt1, d1);
1297+
f2d->detectAndCompute(uimg1, Mat(), kpt2, d2);
1298+
}
1299+
else
1300+
#endif
1301+
{
1302+
f2d->detectAndCompute(img1, Mat(), kpt1, d1);
1303+
f2d->detectAndCompute(img1, Mat(), kpt2, d2);
1304+
}
12821305
for( size_t i = 0; i < kpt1.size(); i++ )
12831306
CV_Assert(kpt1[i].response > 0 );
12841307
for( size_t i = 0; i < kpt2.size(); i++ )

modules/xfeatures2d/test/test_surf.ocl.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,18 +144,18 @@ PARAM_TEST_CASE(SURF, HessianThreshold, Octaves, OctaveLayers, Extended, Upright
144144

145145
TEST_P(SURF, Detector)
146146
{
147-
cv::UMat image;
148-
cv::ocl::setUseOpenCL(true);
149-
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
147+
cv::UMat image;
148+
cv::ocl::setUseOpenCL(true);
149+
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
150150
ASSERT_FALSE(image.empty());
151151

152152
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
153153
std::vector<cv::KeyPoint> keypoints;
154154
surf->detect(image, keypoints, cv::noArray());
155155

156-
cv::ocl::setUseOpenCL(false);
156+
cv::ocl::setUseOpenCL(false);
157157
std::vector<cv::KeyPoint> keypoints_gold;
158-
surf->detect(image, keypoints_gold, cv::noArray());
158+
surf->detect(image, keypoints_gold, cv::noArray());
159159

160160
ASSERT_EQ(keypoints_gold.size(), keypoints.size());
161161
int matchedCount = getMatchedPointsCount(keypoints_gold, keypoints);
@@ -166,23 +166,23 @@ TEST_P(SURF, Detector)
166166

167167
TEST_P(SURF, Descriptor)
168168
{
169-
cv::UMat image;
170-
cv::ocl::setUseOpenCL(true);
171-
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
169+
cv::UMat image;
170+
cv::ocl::setUseOpenCL(true);
171+
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
172172
ASSERT_FALSE(image.empty());
173173

174-
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
174+
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
175175

176176
std::vector<cv::KeyPoint> keypoints;
177-
surf->detect(image, keypoints, cv::noArray());
177+
surf->detect(image, keypoints, cv::noArray());
178178

179179
cv::UMat descriptors;
180180

181181
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors, true);
182182

183-
cv::ocl::setUseOpenCL(false);
183+
cv::ocl::setUseOpenCL(false);
184184
cv::Mat descriptors_gold;
185-
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors_gold, true);
185+
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors_gold, true);
186186

187187
cv::BFMatcher matcher(surf->defaultNorm());
188188
std::vector<cv::DMatch> matches;

0 commit comments

Comments
 (0)