diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index 850a2e60e..4d63e3f00 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -575,6 +575,7 @@ protected: CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf); CV_EXPORTS const char* typeToStr(int t); CV_EXPORTS const char* memopTypeToStr(int t); +CV_EXPORTS String kernelToStr(InputArray _kernel, int ddepth = -1); CV_EXPORTS void getPlatfomsInfo(std::vector& platform_info); class CV_EXPORTS Image2D diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 66dbcbbab..03abc061b 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -3814,6 +3814,57 @@ const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf) return buf; } +template +static std::string kerToStr(const Mat & k) +{ + int width = k.cols - 1, depth = k.depth(); + const T * const data = reinterpret_cast(k.data); + + std::ostringstream stream; + stream.precision(10); + + if (depth <= CV_8S) + { + for (int i = 0; i < width; ++i) + stream << (int)data[i] << ", "; + stream << (int)data[width]; + } + else if (depth == CV_32F) + { + stream.setf(std::ios_base::showpoint); + for (int i = 0; i < width; ++i) + stream << data[i] << "f, "; + stream << data[width] << "f"; + } + else + { + for (int i = 0; i < width; ++i) + stream << data[i] << ", "; + } + + return stream.str(); +} + +String kernelToStr(InputArray _kernel, int ddepth) +{ + Mat kernel = _kernel.getMat().reshape(1, 1); + + int depth = kernel.depth(); + if (ddepth < 0) + ddepth = depth; + + if (ddepth != depth) + kernel.convertTo(kernel, ddepth); + + typedef std::string (*func_t)(const Mat &); + static const func_t funcs[] = { kerToStr, kerToStr, kerToStr,kerToStr, + kerToStr, kerToStr, kerToStr, 0 }; + const func_t func = funcs[depth]; + CV_Assert(func != 0); + + return cv::format(" -D COEFF=%s", func(kernel).c_str()); +} + /////////////////////////////////////////////////////////////////////////////////////////////// // deviceVersion has format // OpenCL diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp index c3a096619..09519e74d 100644 --- a/modules/imgproc/src/filter.cpp +++ b/modules/imgproc/src/filter.cpp @@ -3313,57 +3313,6 @@ static bool ocl_filter2D( InputArray _src, OutputArray _dst, int ddepth, return kernel.run(2, globalsize, localsize, true); } -template -static std::string kerToStr(const Mat & k) -{ - int width = k.cols - 1, depth = k.depth(); - const T * const data = reinterpret_cast(k.data); - - std::ostringstream stream; - stream.precision(10); - - if (depth <= CV_8S) - { - for (int i = 0; i < width; ++i) - stream << (int)data[i] << ","; - stream << (int)data[width]; - } - else if (depth == CV_32F) - { - stream.setf(std::ios_base::showpoint); - for (int i = 0; i < width; ++i) - stream << data[i] << "f,"; - stream << data[width] << "f"; - } - else - { - for (int i = 0; i < width; ++i) - stream << data[i] << ","; - } - - return stream.str(); -} - -static String kernelToStr(InputArray _kernel, int ddepth = -1) -{ - Mat kernel = _kernel.getMat().reshape(1, 1); - - int depth = kernel.depth(); - if (ddepth < 0) - ddepth = depth; - - if (ddepth != depth) - kernel.convertTo(kernel, ddepth); - - typedef std::string (*func_t)(const Mat &); - static const func_t funcs[] = { kerToStr, kerToStr, kerToStr,kerToStr, - kerToStr, kerToStr, kerToStr, 0 }; - const func_t func = funcs[depth]; - CV_Assert(func != 0); - - return cv::format(" -D COEFF=%s", func(kernel).c_str()); -} - static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor, int borderType, bool sync) { int type = src.type(); @@ -3429,7 +3378,7 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor, btype, extra_extrapolation ? "EXTRA_EXTRAPOLATION" : "NO_EXTRA_EXTRAPOLATION", isIsolatedBorder ? "BORDER_ISOLATED" : "NO_BORDER_ISOLATED"); - build_options += kernelToStr(kernelX, CV_32F); + build_options += ocl::kernelToStr(kernelX, CV_32F); Size srcWholeSize; Point srcOffset; src.locateROI(srcWholeSize, srcOffset); @@ -3462,7 +3411,6 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor, idxArg = kernelRow.set(idxArg, buf.cols); idxArg = kernelRow.set(idxArg, buf.rows); idxArg = kernelRow.set(idxArg, radiusY); -// idxArg = kernelRow.set(idxArg, ocl::KernelArg::PtrReadOnly(kernelX.getUMat(ACCESS_READ))); return kernelRow.run(2, globalsize, localsize, sync); } @@ -3532,7 +3480,7 @@ static bool ocl_sepColFilter2D(UMat &buf, UMat &dst, Mat &kernelY, int anchor, b } } - build_options += kernelToStr(kernelY, CV_32F); + build_options += ocl::kernelToStr(kernelY, CV_32F); ocl::Kernel kernelCol; if (!kernelCol.create("col_filter", cv::ocl::imgproc::filterSepCol_oclsrc, build_options)) @@ -3549,7 +3497,6 @@ static bool ocl_sepColFilter2D(UMat &buf, UMat &dst, Mat &kernelY, int anchor, b idxArg = kernelCol.set(idxArg, (int)(dst.step / dst.elemSize())); idxArg = kernelCol.set(idxArg, dst.cols); idxArg = kernelCol.set(idxArg, dst.rows); -// idxArg = kernelCol.set(idxArg, ocl::KernelArg::PtrReadOnly(kernelY.getUMat(ACCESS_READ))); return kernelCol.run(2, globalsize, localsize, sync); }