Commit dedce9a3 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #1383 from alalek:fix_surf

parents d32827a8 2e2b6291
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment