Commit a51ab99a authored by Ilya Lavrenov's avatar Ilya Lavrenov

added 3-channels support to cv::filter2D, cv::Laplacian

parent e19c42dd
...@@ -3157,10 +3157,9 @@ static bool ocl_filter2D( InputArray _src, OutputArray _dst, int ddepth, ...@@ -3157,10 +3157,9 @@ static bool ocl_filter2D( InputArray _src, OutputArray _dst, int ddepth,
if (abs(delta) > FLT_MIN) if (abs(delta) > FLT_MIN)
return false; return false;
int type = _src.type(); int type = _src.type(), cn = CV_MAT_CN(type);
int cn = CV_MAT_CN(type); if (cn > 4)
if ((1 != cn) && (2 != cn) && (4 != cn)) return false;
return false;//TODO
int sdepth = CV_MAT_DEPTH(type); int sdepth = CV_MAT_DEPTH(type);
Size ksize = _kernel.size(); Size ksize = _kernel.size();
...@@ -3298,7 +3297,7 @@ static bool ocl_filter2D( InputArray _src, OutputArray _dst, int ddepth, ...@@ -3298,7 +3297,7 @@ static bool ocl_filter2D( InputArray _src, OutputArray _dst, int ddepth,
double borderValueDouble[4] = {0, 0, 0, 0}; double borderValueDouble[4] = {0, 0, 0, 0};
if ((borderType & ~BORDER_ISOLATED) == BORDER_CONSTANT) if ((borderType & ~BORDER_ISOLATED) == BORDER_CONSTANT)
{ {
int cnocl = (3 == cn) ? 4 : cn; int cnocl = 3 == cn ? 4 : cn;
if (useDouble) if (useDouble)
idxArg = kernel.set(idxArg, (void *)&borderValueDouble[0], sizeof(double) * cnocl); idxArg = kernel.set(idxArg, (void *)&borderValueDouble[0], sizeof(double) * cnocl);
else else
......
...@@ -203,10 +203,24 @@ ...@@ -203,10 +203,24 @@
#define VEC_TYPE CAT(BASE_TYPE, VEC_SIZE) #define VEC_TYPE CAT(BASE_TYPE, VEC_SIZE)
#define TYPE VEC_TYPE #define TYPE VEC_TYPE
#if VEC_SIZE == 3
#define SCALAR_TYPE CAT(FPTYPE, 4)
#else
#define SCALAR_TYPE CAT(FPTYPE, VEC_SIZE) #define SCALAR_TYPE CAT(FPTYPE, VEC_SIZE)
#endif
#define INTERMEDIATE_TYPE CAT(FPTYPE, VEC_SIZE) #define INTERMEDIATE_TYPE CAT(FPTYPE, VEC_SIZE)
#if DATA_CHAN != 3
#define loadpix(addr) *(__global const TYPE *)(addr)
#define storepix(val, addr) *(__global TYPE *)(addr) = val
#define TSIZE (int)sizeof(TYPE)
#else
#define loadpix(addr) vload3(0, (__global const BASE_TYPE *)(addr))
#define storepix(val, addr) vstore3(val, 0, (__global BASE_TYPE *)(addr))
#define TSIZE (int)sizeof(BASE_TYPE)*DATA_CHAN
#endif
struct RectCoords struct RectCoords
{ {
int x1, y1, x2, y2; int x1, y1, x2, y2;
...@@ -235,13 +249,17 @@ inline INTERMEDIATE_TYPE readSrcPixel(int2 pos, __global const uchar* srcptr, in ...@@ -235,13 +249,17 @@ inline INTERMEDIATE_TYPE readSrcPixel(int2 pos, __global const uchar* srcptr, in
#endif #endif
{ {
//__global TYPE* ptr = (__global TYPE*)((__global char*)src + pos.x * sizeof(TYPE) + pos.y * srcStepBytes); //__global TYPE* ptr = (__global TYPE*)((__global char*)src + pos.x * sizeof(TYPE) + pos.y * srcStepBytes);
__global TYPE* ptr = (__global TYPE*)(srcptr + pos.y * srcstep + pos.x * sizeof(TYPE)); __global TYPE* ptr = (__global TYPE*)(srcptr + pos.y * srcstep + pos.x * TSIZE);
return CONVERT_TO_FPTYPE(*ptr); return CONVERT_TO_FPTYPE(loadpix(ptr));
} }
else else
{ {
#ifdef BORDER_CONSTANT #ifdef BORDER_CONSTANT
#if VEC_SIZE == 3
return (INTERMEDIATE_TYPE)(borderValue.x, borderValue.y, borderValue.z);
#else
return borderValue; return borderValue;
#endif
#else #else
int selected_col = pos.x; int selected_col = pos.x;
int selected_row = pos.y; int selected_row = pos.y;
...@@ -262,8 +280,8 @@ inline INTERMEDIATE_TYPE readSrcPixel(int2 pos, __global const uchar* srcptr, in ...@@ -262,8 +280,8 @@ inline INTERMEDIATE_TYPE readSrcPixel(int2 pos, __global const uchar* srcptr, in
if(pos.x >= 0 && pos.y >= 0 && pos.x < srcCoords.x2 && pos.y < srcCoords.y2) if(pos.x >= 0 && pos.y >= 0 && pos.x < srcCoords.x2 && pos.y < srcCoords.y2)
{ {
//__global TYPE* ptr = (__global TYPE*)((__global char*)src + pos.x * sizeof(TYPE) + pos.y * srcStepBytes); //__global TYPE* ptr = (__global TYPE*)((__global char*)src + pos.x * sizeof(TYPE) + pos.y * srcStepBytes);
__global TYPE* ptr = (__global TYPE*)(srcptr + pos.y * srcstep + pos.x * sizeof(TYPE)); __global TYPE* ptr = (__global TYPE*)(srcptr + pos.y * srcstep + pos.x * TSIZE);
return CONVERT_TO_FPTYPE(*ptr); return CONVERT_TO_FPTYPE(loadpix(ptr));
} }
else else
{ {
...@@ -300,7 +318,7 @@ void filter2D(__global const uchar* srcptr, int srcstep, int srcOffsetX, int src ...@@ -300,7 +318,7 @@ void filter2D(__global const uchar* srcptr, int srcstep, int srcOffsetX, int src
int2 srcPos = (int2)(srcCoords.x1 + x, srcCoords.y1 + y - ANCHOR_Y); int2 srcPos = (int2)(srcCoords.x1 + x, srcCoords.y1 + y - ANCHOR_Y);
int2 pos = (int2)(x, y); int2 pos = (int2)(x, y);
__global TYPE* dstPtr = (__global TYPE*)((__global char*)dstptr + pos.y * dststep + dstoffset + pos.x * sizeof(TYPE)); // Pointer can be out of bounds! __global TYPE* dstPtr = (__global TYPE*)((__global char*)dstptr + pos.y * dststep + dstoffset + pos.x * TSIZE); // Pointer can be out of bounds!
bool writeResult = ((local_id >= ANCHOR_X) && (local_id < LOCAL_SIZE - (KERNEL_SIZE_X - 1 - ANCHOR_X)) && bool writeResult = ((local_id >= ANCHOR_X) && (local_id < LOCAL_SIZE - (KERNEL_SIZE_X - 1 - ANCHOR_X)) &&
(pos.x >= 0) && (pos.x < cols)); (pos.x >= 0) && (pos.x < cols));
...@@ -360,7 +378,7 @@ void filter2D(__global const uchar* srcptr, int srcstep, int srcOffsetX, int src ...@@ -360,7 +378,7 @@ void filter2D(__global const uchar* srcptr, int srcstep, int srcOffsetX, int src
if (writeResult) if (writeResult)
{ {
*dstPtr = CONVERT_TO_TYPE(total_sum); storepix(CONVERT_TO_TYPE(total_sum), dstPtr);
} }
#if BLOCK_SIZE_Y > 1 #if BLOCK_SIZE_Y > 1
......
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
//M*/ //M*/
#include "precomp.hpp" #include "precomp.hpp"
#define CV_OPENCL_RUN_ASSERT
#include "opencl_kernels.hpp" #include "opencl_kernels.hpp"
/* /*
...@@ -642,10 +641,7 @@ static bool ocl_boxFilter( InputArray _src, OutputArray _dst, int ddepth, ...@@ -642,10 +641,7 @@ static bool ocl_boxFilter( InputArray _src, OutputArray _dst, int ddepth,
if (cn > 4 || (!doubleSupport && (sdepth == CV_64F || ddepth == CV_64F)) || if (cn > 4 || (!doubleSupport && (sdepth == CV_64F || ddepth == CV_64F)) ||
_src.offset() % esz != 0 || _src.step() % esz != 0) _src.offset() % esz != 0 || _src.step() % esz != 0)
{
printf("!!!!!!!!!!!!!!!!!!!!!!!\n");
return false; return false;
}
if (anchor.x < 0) if (anchor.x < 0)
anchor.x = ksize.width / 2; anchor.x = ksize.width / 2;
......
...@@ -115,11 +115,10 @@ OCL_TEST_P(Filter2D, Mat) ...@@ -115,11 +115,10 @@ OCL_TEST_P(Filter2D, Mat)
} }
} }
OCL_INSTANTIATE_TEST_CASE_P(ImageProc, Filter2D, OCL_INSTANTIATE_TEST_CASE_P(ImageProc, Filter2D,
Combine( Combine(
Values(CV_8U, CV_16U, CV_16S, CV_32F, CV_64F), Values(CV_8U, CV_16U, CV_32F),
Values(1, 2, 4), OCL_ALL_CHANNELS,
Values((BorderType)BORDER_CONSTANT, Values((BorderType)BORDER_CONSTANT,
(BorderType)BORDER_REPLICATE, (BorderType)BORDER_REPLICATE,
(BorderType)BORDER_REFLECT, (BorderType)BORDER_REFLECT,
......
...@@ -304,7 +304,7 @@ OCL_TEST_P(MorphologyEx, Mat) ...@@ -304,7 +304,7 @@ OCL_TEST_P(MorphologyEx, Mat)
(int)BORDER_REFLECT|BORDER_ISOLATED, (int)BORDER_WRAP|BORDER_ISOLATED, \ (int)BORDER_REFLECT|BORDER_ISOLATED, (int)BORDER_WRAP|BORDER_ISOLATED, \
(int)BORDER_REFLECT_101|BORDER_ISOLATED*/) // WRAP and ISOLATED are not supported by cv:: version (int)BORDER_REFLECT_101|BORDER_ISOLATED*/) // WRAP and ISOLATED are not supported by cv:: version
#define FILTER_TYPES Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4) #define FILTER_TYPES Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_16UC1, CV_16UC3, CV_16UC4, CV_32FC1, CV_32FC3, CV_32FC4)
OCL_INSTANTIATE_TEST_CASE_P(Filter, Bilateral, Combine( OCL_INSTANTIATE_TEST_CASE_P(Filter, Bilateral, Combine(
Values(CV_8UC1, CV_8UC3), Values(CV_8UC1, CV_8UC3),
......
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