Commit 9698079c authored by peng xiao's avatar peng xiao

Pass warp size into SURF

parent 0c19a07b
...@@ -57,19 +57,29 @@ namespace cv ...@@ -57,19 +57,29 @@ namespace cv
///////////////////////////OpenCL kernel strings/////////////////////////// ///////////////////////////OpenCL kernel strings///////////////////////////
extern const char *surf; extern const char *surf;
const char* noImage2dOption = "-D DISABLE_IMAGE2D"; const char noImage2dOption [] = "-D DISABLE_IMAGE2D";
static char SURF_OPTIONS [1024] = "";
static bool USE_IMAGE2d = false;
static void openCLExecuteKernelSURF(Context *clCxt , const char **source, string kernelName, size_t globalThreads[3], static void openCLExecuteKernelSURF(Context *clCxt , const char **source, string kernelName, size_t globalThreads[3],
size_t localThreads[3], vector< pair<size_t, const void *> > &args, int channels, int depth) size_t localThreads[3], vector< pair<size_t, const void *> > &args, int channels, int depth)
{ {
if(support_image2d()) char * pSURF_OPTIONS = SURF_OPTIONS;
static bool OPTION_INIT = false;
if(!OPTION_INIT)
{ {
openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth); if( !USE_IMAGE2d )
}
else
{ {
openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, noImage2dOption); strcat(pSURF_OPTIONS, noImage2dOption);
pSURF_OPTIONS += strlen(noImage2dOption);
}
size_t wave_size = 0;
queryDeviceInfo(DEVICE_INFO::WAVEFRONT_SIZE, &wave_size);
sprintf(pSURF_OPTIONS, " -D WAVE_SIZE=%d", static_cast<int>(wave_size));
OPTION_INIT = true;
} }
openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, SURF_OPTIONS);
} }
} }
} }
...@@ -152,8 +162,20 @@ public: ...@@ -152,8 +162,20 @@ public:
integral(img, surf_.sum); integral(img, surf_.sum);
if(support_image2d()) if(support_image2d())
{ {
bindImgTex(img, imgTex); try
bindImgTex(surf_.sum, sumTex); {
bindImgTex(img, imgTex);
bindImgTex(surf_.sum, sumTex);
USE_IMAGE2d = true;
}
catch (const cv::Exception& e)
{
USE_IMAGE2d = false;
if(e.code != CL_IMAGE_FORMAT_NOT_SUPPORTED && e.code != -217)
{
throw e;
}
}
} }
maskSumTex = 0; maskSumTex = 0;
......
...@@ -178,7 +178,7 @@ TEST_P(SURF, Detector) ...@@ -178,7 +178,7 @@ TEST_P(SURF, Detector)
EXPECT_GT(matchedRatio, 0.99); EXPECT_GT(matchedRatio, 0.99);
} }
TEST_P(SURF, DISABLED_Descriptor) TEST_P(SURF, Descriptor)
{ {
cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE); cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE);
ASSERT_FALSE(image.empty()); ASSERT_FALSE(image.empty());
......
...@@ -361,7 +361,7 @@ namespace cv ...@@ -361,7 +361,7 @@ namespace cv
{ {
case WAVEFRONT_SIZE: case WAVEFRONT_SIZE:
{ {
#ifndef CL_DEVICE_WAVEFRONT_WIDTH_AMD #ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0], openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0],
CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof(size_t), info, 0)); CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof(size_t), info, 0));
#else #else
......
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