fixed ocl::copyMakeBorder
This commit is contained in:
parent
36342eb425
commit
3fe74ad124
@ -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)
|
void copyMakeBorder(const oclMat &src, oclMat &dst, int top, int bottom, int left, int right, int bordertype, const Scalar &scalar)
|
||||||
{
|
{
|
||||||
CV_Assert(top >= 0 && bottom >= 0 && left >= 0 && right >= 0);
|
oclMat _src = src;
|
||||||
if ((dst.cols != dst.wholecols) || (dst.rows != dst.wholerows)) //has roi
|
|
||||||
{
|
|
||||||
if (((bordertype & cv::BORDER_ISOLATED) == 0) &&
|
|
||||||
(bordertype != cv::BORDER_CONSTANT) &&
|
|
||||||
(bordertype != cv::BORDER_REPLICATE))
|
|
||||||
{
|
|
||||||
CV_Error(CV_StsBadArg, "Unsupported border type");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
CV_Assert(top >= 0 && bottom >= 0 && left >= 0 && right >= 0);
|
||||||
|
|
||||||
|
if( _src.offset != 0 && (bordertype & BORDER_ISOLATED) == 0 )
|
||||||
|
{
|
||||||
|
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;
|
bordertype &= ~cv::BORDER_ISOLATED;
|
||||||
|
|
||||||
if (bordertype == cv::BORDER_REFLECT || bordertype == cv::BORDER_WRAP)
|
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)
|
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());
|
dst.create(_src.rows + top + bottom, _src.cols + left + right, _src.type());
|
||||||
int srcStep = src.step1() / src.oclchannels(), dstStep = dst.step1() / dst.oclchannels();
|
int srcStep = _src.step1() / _src.oclchannels(), dstStep = dst.step1() / dst.oclchannels();
|
||||||
int srcOffset = src.offset / src.elemSize(), dstOffset = dst.offset / dst.elemSize();
|
int srcOffset = _src.offset / _src.elemSize(), dstOffset = dst.offset / dst.elemSize();
|
||||||
int depth = src.depth(), ochannels = src.oclchannels();
|
int depth = _src.depth(), ochannels = _src.oclchannels();
|
||||||
|
|
||||||
int __bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_REFLECT_101};
|
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"};
|
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 };
|
size_t globalThreads[3] = { dst.cols, dst.rows, 1 };
|
||||||
|
|
||||||
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));
|
||||||
args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.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.cols));
|
||||||
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.rows));
|
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.cols));
|
||||||
args.push_back( make_pair( sizeof(cl_int), (void *)&src.rows));
|
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 *)&srcStep));
|
||||||
args.push_back( make_pair( sizeof(cl_int), (void *)&srcOffset));
|
args.push_back( make_pair( sizeof(cl_int), (void *)&srcOffset));
|
||||||
args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep));
|
args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep));
|
||||||
|
@ -101,17 +101,10 @@ PARAM_TEST_CASE(WarpTestBase, MatType, int, bool, bool)
|
|||||||
|
|
||||||
void Near(double threshold = 0.0)
|
void Near(double threshold = 0.0)
|
||||||
{
|
{
|
||||||
Mat whole, roi, diff;
|
Mat whole, roi;
|
||||||
gdst_whole.download(whole);
|
gdst_whole.download(whole);
|
||||||
gdst_roi.download(roi);
|
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_whole, whole, threshold);
|
||||||
EXPECT_MAT_NEAR(dst_roi, roi, threshold);
|
EXPECT_MAT_NEAR(dst_roi, roi, threshold);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user