From 3fe74ad124c5bf8f797cd6c60774fb750f4a2e30 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Fri, 18 Oct 2013 16:39:47 +0400 Subject: [PATCH] fixed ocl::copyMakeBorder --- modules/ocl/src/imgproc.cpp | 43 +++++++++++++++++++++++++----------------- modules/ocl/test/test_warp.cpp | 9 +-------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/modules/ocl/src/imgproc.cpp b/modules/ocl/src/imgproc.cpp index f742558..a6917a1 100644 --- a/modules/ocl/src/imgproc.cpp +++ b/modules/ocl/src/imgproc.cpp @@ -448,31 +448,40 @@ namespace cv void copyMakeBorder(const oclMat &src, oclMat &dst, int top, int bottom, int left, int right, int bordertype, const Scalar &scalar) { + oclMat _src = src; + CV_Assert(top >= 0 && bottom >= 0 && left >= 0 && right >= 0); - if ((dst.cols != dst.wholecols) || (dst.rows != dst.wholerows)) //has roi + + if( _src.offset != 0 && (bordertype & BORDER_ISOLATED) == 0 ) { - if (((bordertype & cv::BORDER_ISOLATED) == 0) && - (bordertype != cv::BORDER_CONSTANT) && - (bordertype != cv::BORDER_REPLICATE)) - { - CV_Error(CV_StsBadArg, "Unsupported border type"); - } + Size wholeSize; + Point ofs; + _src.locateROI(wholeSize, ofs); + int dtop = std::min(ofs.y, top); + int dbottom = std::min(wholeSize.height - _src.rows - ofs.y, bottom); + int dleft = std::min(ofs.x, left); + int dright = std::min(wholeSize.width - _src.cols - ofs.x, right); + _src.adjustROI(dtop, dbottom, dleft, dright); + top -= dtop; + left -= dleft; + bottom -= dbottom; + right -= dright; } - bordertype &= ~cv::BORDER_ISOLATED; + if (bordertype == cv::BORDER_REFLECT || bordertype == cv::BORDER_WRAP) { - CV_Assert((src.cols >= left) && (src.cols >= right) && (src.rows >= top) && (src.rows >= bottom)); + CV_Assert((_src.cols >= left) && (_src.cols >= right) && (_src.rows >= top) && (_src.rows >= bottom)); } else if (bordertype == cv::BORDER_REFLECT_101) { - CV_Assert((src.cols > left) && (src.cols > right) && (src.rows > top) && (src.rows > bottom)); + CV_Assert((_src.cols > left) && (_src.cols > right) && (_src.rows > top) && (_src.rows > bottom)); } - dst.create(src.rows + top + bottom, src.cols + left + right, src.type()); - int srcStep = src.step1() / src.oclchannels(), dstStep = dst.step1() / dst.oclchannels(); - int srcOffset = src.offset / src.elemSize(), dstOffset = dst.offset / dst.elemSize(); - int depth = src.depth(), ochannels = src.oclchannels(); + dst.create(_src.rows + top + bottom, _src.cols + left + right, _src.type()); + int srcStep = _src.step1() / _src.oclchannels(), dstStep = dst.step1() / dst.oclchannels(); + int srcOffset = _src.offset / _src.elemSize(), dstOffset = dst.offset / dst.elemSize(); + int depth = _src.depth(), ochannels = _src.oclchannels(); int __bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_REFLECT_101}; const char *borderstr[] = {"BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP", "BORDER_REFLECT_101"}; @@ -490,12 +499,12 @@ namespace cv size_t globalThreads[3] = { dst.cols, dst.rows, 1 }; vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&_src.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data)); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.cols)); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&src.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&src.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&_src.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&_src.rows)); args.push_back( make_pair( sizeof(cl_int), (void *)&srcStep)); args.push_back( make_pair( sizeof(cl_int), (void *)&srcOffset)); args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep)); diff --git a/modules/ocl/test/test_warp.cpp b/modules/ocl/test/test_warp.cpp index dda6837..6e153fb 100644 --- a/modules/ocl/test/test_warp.cpp +++ b/modules/ocl/test/test_warp.cpp @@ -101,17 +101,10 @@ PARAM_TEST_CASE(WarpTestBase, MatType, int, bool, bool) void Near(double threshold = 0.0) { - Mat whole, roi, diff; + Mat whole, roi; gdst_whole.download(whole); gdst_roi.download(roi); - imshow("OpenCV", dst_whole); - imshow("OpenCL", whole); - - cv::absdiff(whole, dst_whole, diff); - imshow("Diff", diff); - cv::waitKey(); - EXPECT_MAT_NEAR(dst_whole, whole, threshold); EXPECT_MAT_NEAR(dst_roi, roi, threshold); } -- 2.7.4