Commit 36db85a9 authored by Ilya Lavrenov's avatar Ilya Lavrenov

optimized some operations

parent 16ab6ec5
This diff is collapsed.
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
#endif #endif
#endif #endif
#define noconvert
#if cn != 3 #if cn != 3
#define loadpix(addr) *(__global const T *)(addr) #define loadpix(addr) *(__global const T *)(addr)
#define storepix(val, addr) *(__global T *)(addr) = val #define storepix(val, addr) *(__global T *)(addr) = val
...@@ -107,6 +109,11 @@ ...@@ -107,6 +109,11 @@
// BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii // BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii
#define ELEM(i, l_edge, r_edge, elem1, elem2) (i) < (l_edge) | (i) >= (r_edge) ? (elem1) : (elem2) #define ELEM(i, l_edge, r_edge, elem1, elem2) (i) < (l_edge) | (i) >= (r_edge) ? (elem1) : (elem2)
#if defined OP_GRADIENT || defined OP_TOPHAT || defined OP_BLACKHAT
#define EXTRA_PARAMS , __global const uchar * matptr, int mat_step, int mat_offset
#else
#define EXTRA_PARAMS
#endif
__kernel void morph(__global const uchar * srcptr, int src_step, int src_offset, __kernel void morph(__global const uchar * srcptr, int src_step, int src_offset,
__global uchar * dstptr, int dst_step, int dst_offset, __global uchar * dstptr, int dst_step, int dst_offset,
...@@ -155,6 +162,20 @@ __kernel void morph(__global const uchar * srcptr, int src_step, int src_offset, ...@@ -155,6 +162,20 @@ __kernel void morph(__global const uchar * srcptr, int src_step, int src_offset,
PROCESS_ELEMS; PROCESS_ELEMS;
int dst_index = mad24(gidy, dst_step, mad24(gidx, TSIZE, dst_offset)); int dst_index = mad24(gidy, dst_step, mad24(gidx, TSIZE, dst_offset));
#if defined OP_GRADIENT || defined OP_TOPHAT || defined OP_BLACKHAT
int mat_index = mad24(gidy, mat_step, mad24(gidx, TSIZE, mat_offset));
T value = loadpix(matptr + mat_index);
#ifdef OP_GRADIENT
storepix(convertToT(convertToWT(res) - convertToWT(value)), dstptr + dst_index);
#elif defined OP_TOPHAT
storepix(convertToT(convertToWT(value) - convertToWT(res)), dstptr + dst_index);
#elif defined OP_BLACKHAT
storepix(convertToT(convertToWT(res) - convertToWT(value)), dstptr + dst_index);
#endif
#else // erode or dilate
storepix(res, dstptr + dst_index); storepix(res, dstptr + dst_index);
#endif
} }
} }
...@@ -63,7 +63,7 @@ PARAM_TEST_CASE(FilterTestBase, MatType, ...@@ -63,7 +63,7 @@ PARAM_TEST_CASE(FilterTestBase, MatType,
BorderType, // border type BorderType, // border type
double, // optional parameter double, // optional parameter
bool, // roi or not bool, // roi or not
int) //width multiplier int) // width multiplier
{ {
int type, borderType, ksize; int type, borderType, ksize;
Size size; Size size;
...@@ -244,8 +244,8 @@ OCL_TEST_P(Erode, Mat) ...@@ -244,8 +244,8 @@ OCL_TEST_P(Erode, Mat)
random_roi(); random_roi();
Mat kernel = randomMat(kernelSize, CV_8UC1, 0, 3); Mat kernel = randomMat(kernelSize, CV_8UC1, 0, 3);
OCL_OFF(cv::erode(src_roi, dst_roi, kernel, Point(-1,-1), iterations) ); OCL_OFF(cv::erode(src_roi, dst_roi, kernel, Point(-1, -1), iterations) );
OCL_ON(cv::erode(usrc_roi, udst_roi, kernel, Point(-1,-1), iterations) ); OCL_ON(cv::erode(usrc_roi, udst_roi, kernel, Point(-1, -1), iterations) );
Near(); Near();
} }
...@@ -266,8 +266,8 @@ OCL_TEST_P(Dilate, Mat) ...@@ -266,8 +266,8 @@ OCL_TEST_P(Dilate, Mat)
random_roi(); random_roi();
Mat kernel = randomMat(kernelSize, CV_8UC1, 0, 3); Mat kernel = randomMat(kernelSize, CV_8UC1, 0, 3);
OCL_OFF(cv::dilate(src_roi, dst_roi, kernel, Point(-1,-1), iterations) ); OCL_OFF(cv::dilate(src_roi, dst_roi, kernel, Point(-1, -1), iterations) );
OCL_ON(cv::dilate(usrc_roi, udst_roi, kernel, Point(-1,-1), iterations) ); OCL_ON(cv::dilate(usrc_roi, udst_roi, kernel, Point(-1, -1), iterations) );
Near(); Near();
} }
...@@ -289,8 +289,8 @@ OCL_TEST_P(MorphologyEx, Mat) ...@@ -289,8 +289,8 @@ OCL_TEST_P(MorphologyEx, Mat)
random_roi(); random_roi();
Mat kernel = randomMat(kernelSize, CV_8UC1, 0, 3); Mat kernel = randomMat(kernelSize, CV_8UC1, 0, 3);
OCL_OFF(cv::morphologyEx(src_roi, dst_roi, op, kernel, Point(-1,-1), iterations) ); OCL_OFF(cv::morphologyEx(src_roi, dst_roi, op, kernel, Point(-1, -1), iterations) );
OCL_ON(cv::morphologyEx(usrc_roi, udst_roi, op, kernel, Point(-1,-1), iterations) ); OCL_ON(cv::morphologyEx(usrc_roi, udst_roi, op, kernel, Point(-1, -1), iterations) );
Near(); Near();
} }
...@@ -360,8 +360,8 @@ OCL_INSTANTIATE_TEST_CASE_P(Filter, GaussianBlurTest, Combine( ...@@ -360,8 +360,8 @@ OCL_INSTANTIATE_TEST_CASE_P(Filter, GaussianBlurTest, Combine(
OCL_INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine( OCL_INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(
Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC4),
Values(3, 5, 7), Values(3, 5, 7),
Values(Size(0,0)),//not used Values(Size(0, 0)), //not used
Values((BorderType)BORDER_CONSTANT),//not used Values((BorderType)BORDER_CONSTANT),
Values(1.0, 2.0, 3.0), Values(1.0, 2.0, 3.0),
Bool(), Bool(),
Values(1))); // not used Values(1))); // not used
...@@ -369,20 +369,20 @@ OCL_INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine( ...@@ -369,20 +369,20 @@ OCL_INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(
OCL_INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine( OCL_INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(
Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC4),
Values(3, 5, 7), Values(3, 5, 7),
Values(Size(0,0)),//not used Values(Size(0, 0)), // not used
Values((BorderType)BORDER_CONSTANT),//not used Values((BorderType)BORDER_CONSTANT),
Values(1.0, 2.0, 3.0), Values(1.0, 2.0, 3.0),
Bool(), Bool(),
Values(1))); //not used Values(1))); // not used
OCL_INSTANTIATE_TEST_CASE_P(Filter, MorphologyEx, Combine( OCL_INSTANTIATE_TEST_CASE_P(Filter, MorphologyEx, Combine(
Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(3, 5, 7), Values(3, 5, 7),
Values(Size(0, 0), Size(0, 1), Size(0, 2), Size(0, 3), Size(0, 4), Size(0, 5), Size(0, 6)), // used as generator of operations Values(Size(0, 2), Size(0, 3), Size(0, 4), Size(0, 5), Size(0, 6)), // used as generator of operations
Values((BorderType)BORDER_CONSTANT),// not used Values((BorderType)BORDER_CONSTANT),
Values(1.0, 2.0, 3.0), Values(1.0, 2.0, 3.0),
Bool(), Bool(),
Values(1))); //not used Values(1))); // not used
} } // namespace cvtest::ocl } } // namespace cvtest::ocl
......
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