Commit 10d60f99 authored by Ilya Lavrenov's avatar Ilya Lavrenov

fixed ocl::integral and enabled perf test for it

parent 8224f984
...@@ -198,7 +198,7 @@ PERF_TEST_P(cornerHarrisFixture, cornerHarris, ...@@ -198,7 +198,7 @@ PERF_TEST_P(cornerHarrisFixture, cornerHarris,
typedef TestBaseWithParam<Size> integralFixture; typedef TestBaseWithParam<Size> integralFixture;
PERF_TEST_P(integralFixture, DISABLED_integral, OCL_TYPICAL_MAT_SIZES) // TODO does not work properly PERF_TEST_P(integralFixture, integral, OCL_TYPICAL_MAT_SIZES)
{ {
const Size srcSize = GetParam(); const Size srcSize = GetParam();
......
...@@ -1141,7 +1141,6 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std ...@@ -1141,7 +1141,6 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std
CvSize sz; CvSize sz;
cv::Rect roi, roi2; cv::Rect roi, roi2;
cv::Mat imgroi, imgroisq;
cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; cv::ocl::oclMat resizeroi, gimgroi, gimgroisq;
for( int i = 0; i < m_loopcount; i++ ) for( int i = 0; i < m_loopcount; i++ )
......
...@@ -975,10 +975,12 @@ namespace cv ...@@ -975,10 +975,12 @@ namespace cv
void integral(const oclMat &src, oclMat &sum, oclMat &sqsum) void integral(const oclMat &src, oclMat &sum, oclMat &sqsum)
{ {
CV_Assert(src.type() == CV_8UC1); CV_Assert(src.type() == CV_8UC1);
if(!src.clCxt->supportsFeature(FEATURE_CL_DOUBLE) && src.depth() == CV_64F) if(!src.clCxt->supportsFeature(ocl::FEATURE_CL_DOUBLE) && src.depth() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported, "select device don't support double"); CV_Error(CV_GpuNotSupported, "select device don't support double");
return;
} }
int vlen = 4; int vlen = 4;
int offset = src.offset / vlen; int offset = src.offset / vlen;
int pre_invalid = src.offset % vlen; int pre_invalid = src.offset % vlen;
...@@ -986,21 +988,15 @@ namespace cv ...@@ -986,21 +988,15 @@ namespace cv
oclMat t_sum , t_sqsum; oclMat t_sum , t_sqsum;
int w = src.cols + 1, h = src.rows + 1; int w = src.cols + 1, h = src.rows + 1;
int depth; int depth = src.depth() == CV_8U ? CV_32S : CV_64F;
if( src.cols * src.rows <= 2901 * 2901 ) //2901 is the maximum size for int when all values are 255 int type = CV_MAKE_TYPE(depth, 1);
{
t_sum.create(src.cols, src.rows, CV_32SC1); t_sum.create(src.cols, src.rows, type);
sum.create(h, w, CV_32SC1); sum.create(h, w, type);
}
else
{
//Use float to prevent overflow
t_sum.create(src.cols, src.rows, CV_32FC1);
sum.create(h, w, CV_32FC1);
}
t_sqsum.create(src.cols, src.rows, CV_32FC1); t_sqsum.create(src.cols, src.rows, CV_32FC1);
sqsum.create(h, w, CV_32FC1); sqsum.create(h, w, CV_32FC1);
depth = sum.depth();
int sum_offset = sum.offset / vlen; int sum_offset = sum.offset / vlen;
int sqsum_offset = sqsum.offset / vlen; int sqsum_offset = sqsum.offset / vlen;
...@@ -1016,6 +1012,7 @@ namespace cv ...@@ -1016,6 +1012,7 @@ namespace cv
args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step)); args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step));
size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1}; size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1};
openCLExecuteKernel(src.clCxt, &imgproc_integral, "integral_cols", gt, lt, args, -1, depth); openCLExecuteKernel(src.clCxt, &imgproc_integral, "integral_cols", gt, lt, args, -1, depth);
args.clear(); args.clear();
args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data ));
args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sqsum.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sqsum.data ));
...@@ -1042,17 +1039,12 @@ namespace cv ...@@ -1042,17 +1039,12 @@ namespace cv
oclMat t_sum; oclMat t_sum;
int w = src.cols + 1, h = src.rows + 1; int w = src.cols + 1, h = src.rows + 1;
int depth; int depth = src.depth() == CV_8U ? CV_32S : CV_32F;
if(src.cols * src.rows <= 2901 * 2901) int type = CV_MAKE_TYPE(depth, 1);
{
t_sum.create(src.cols, src.rows, CV_32SC1); t_sum.create(src.cols, src.rows, type);
sum.create(h, w, CV_32SC1); sum.create(h, w, type);
}else
{
t_sum.create(src.cols, src.rows, CV_32FC1);
sum.create(h, w, CV_32FC1);
}
depth = sum.depth();
int sum_offset = sum.offset / vlen; int sum_offset = sum.offset / vlen;
vector<pair<size_t , const void *> > args; vector<pair<size_t , const void *> > args;
args.push_back( make_pair( sizeof(cl_mem) , (void *)&src.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&src.data ));
...@@ -1065,6 +1057,7 @@ namespace cv ...@@ -1065,6 +1057,7 @@ namespace cv
args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step)); args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step));
size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1}; size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1};
openCLExecuteKernel(src.clCxt, &imgproc_integral_sum, "integral_sum_cols", gt, lt, args, -1, depth); openCLExecuteKernel(src.clCxt, &imgproc_integral_sum, "integral_sum_cols", gt, lt, args, -1, depth);
args.clear(); args.clear();
args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data ));
args.push_back( make_pair( sizeof(cl_mem) , (void *)&sum.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&sum.data ));
......
...@@ -579,7 +579,19 @@ TEST_P(cornerHarris, Mat) ...@@ -579,7 +579,19 @@ TEST_P(cornerHarris, Mat)
struct integral : ImgprocTestBase {}; struct integral : ImgprocTestBase {};
TEST_P(integral, Mat) TEST_P(integral, Mat1)
{
for(int j = 0; j < LOOP_TIMES; j++)
{
random_roi();
cv::ocl::integral(clmat1_roi, cldst_roi);
cv::integral(mat1_roi, dst_roi);
Near(0);
}
}
TEST_P(integral, Mat2)
{ {
for(int j = 0; j < LOOP_TIMES; j++) for(int j = 0; j < LOOP_TIMES; j++)
{ {
......
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