Merge pull request #1383 from alalek:fix_surf

pull/1385/head
Alexander Alekhin 7 years ago
commit dedce9a345
  1. 2
      modules/xfeatures2d/src/surf.cpp
  2. 29
      modules/xfeatures2d/test/test_features2d.cpp
  3. 24
      modules/xfeatures2d/test/test_surf.ocl.cpp

@ -893,7 +893,7 @@ void SURF_Impl::detectAndCompute(InputArray _img, InputArray _mask,
CV_Assert(_descriptors.needed() || !useProvidedKeypoints);
#ifdef HAVE_OPENCL
if( ocl::useOpenCL() )
if( ocl::useOpenCL() && _img.isUMat())
{
SURF_OCL ocl_surf;
UMat gpu_kpt;

@ -408,7 +408,18 @@ protected:
Mat calcDescriptors;
double t = (double)getTickCount();
dextractor->compute( img, keypoints, calcDescriptors );
#ifdef HAVE_OPENCL
if(ocl::useOpenCL())
{
cv::UMat uimg;
img.copyTo(uimg);
dextractor->compute(uimg, keypoints, calcDescriptors);
}
else
#endif
{
dextractor->compute(img, keypoints, calcDescriptors);
}
t = getTickCount() - t;
ts->printf(cvtest::TS::LOG, "\nAverage time of computing one descriptor = %g ms.\n", t/((double)getTickFrequency()*1000.)/calcDescriptors.rows );
@ -1277,8 +1288,20 @@ protected:
}
vector<KeyPoint> kpt1, kpt2;
Mat d1, d2;
f2d->detectAndCompute(img1, Mat(), kpt1, d1);
f2d->detectAndCompute(img1, Mat(), kpt2, d2);
#ifdef HAVE_OPENCL
if(ocl::useOpenCL())
{
cv::UMat uimg1;
img1.copyTo(uimg1);
f2d->detectAndCompute(uimg1, Mat(), kpt1, d1);
f2d->detectAndCompute(uimg1, Mat(), kpt2, d2);
}
else
#endif
{
f2d->detectAndCompute(img1, Mat(), kpt1, d1);
f2d->detectAndCompute(img1, Mat(), kpt2, d2);
}
for( size_t i = 0; i < kpt1.size(); i++ )
CV_Assert(kpt1[i].response > 0 );
for( size_t i = 0; i < kpt2.size(); i++ )

@ -144,18 +144,18 @@ PARAM_TEST_CASE(SURF, HessianThreshold, Octaves, OctaveLayers, Extended, Upright
TEST_P(SURF, Detector)
{
cv::UMat image;
cv::ocl::setUseOpenCL(true);
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
cv::UMat image;
cv::ocl::setUseOpenCL(true);
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
ASSERT_FALSE(image.empty());
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
std::vector<cv::KeyPoint> keypoints;
surf->detect(image, keypoints, cv::noArray());
cv::ocl::setUseOpenCL(false);
cv::ocl::setUseOpenCL(false);
std::vector<cv::KeyPoint> keypoints_gold;
surf->detect(image, keypoints_gold, cv::noArray());
surf->detect(image, keypoints_gold, cv::noArray());
ASSERT_EQ(keypoints_gold.size(), keypoints.size());
int matchedCount = getMatchedPointsCount(keypoints_gold, keypoints);
@ -166,23 +166,23 @@ TEST_P(SURF, Detector)
TEST_P(SURF, Descriptor)
{
cv::UMat image;
cv::ocl::setUseOpenCL(true);
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
cv::UMat image;
cv::ocl::setUseOpenCL(true);
cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE).copyTo(image);
ASSERT_FALSE(image.empty());
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright);
std::vector<cv::KeyPoint> keypoints;
surf->detect(image, keypoints, cv::noArray());
surf->detect(image, keypoints, cv::noArray());
cv::UMat descriptors;
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors, true);
cv::ocl::setUseOpenCL(false);
cv::ocl::setUseOpenCL(false);
cv::Mat descriptors_gold;
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors_gold, true);
surf->detectAndCompute(image, cv::noArray(), keypoints, descriptors_gold, true);
cv::BFMatcher matcher(surf->defaultNorm());
std::vector<cv::DMatch> matches;

Loading…
Cancel
Save