Commit 290078e0 authored by Dmitry Budnikov's avatar Dmitry Budnikov

copy kernels

parent 95eb199f
...@@ -440,6 +440,12 @@ namespace core { ...@@ -440,6 +440,12 @@ namespace core {
} }
}; };
G_TYPED_KERNEL(GCopy, <GMat(GMat)>, "org.opencv.core.transform.copy") {
static GMatDesc outMeta(GMatDesc in) {
return in;
}
};
G_TYPED_KERNEL(GConcatHor, <GMat(GMat, GMat)>, "org.opencv.imgproc.transform.concatHor") { G_TYPED_KERNEL(GConcatHor, <GMat(GMat, GMat)>, "org.opencv.imgproc.transform.concatHor") {
static GMatDesc outMeta(GMatDesc l, GMatDesc r) { static GMatDesc outMeta(GMatDesc l, GMatDesc r) {
return l.withSizeDelta(+r.size.width, 0); return l.withSizeDelta(+r.size.width, 0);
...@@ -1497,6 +1503,19 @@ Output matrix must be of the same depth as input one, size is specified by given ...@@ -1497,6 +1503,19 @@ Output matrix must be of the same depth as input one, size is specified by given
*/ */
GAPI_EXPORTS GMat crop(const GMat& src, const Rect& rect); GAPI_EXPORTS GMat crop(const GMat& src, const Rect& rect);
/** @brief Copies a 2D matrix.
The function copies the matrix.
Output matrix must be of the same size and depth as input one.
@note Function textual ID is "org.opencv.core.transform.copy"
@param src input matrix.
@sa crop
*/
GAPI_EXPORTS GMat copy(const GMat& src);
/** @brief Applies horizontal concatenation to given matrices. /** @brief Applies horizontal concatenation to given matrices.
The function horizontally concatenates two GMat matrices (with the same number of rows). The function horizontally concatenates two GMat matrices (with the same number of rows).
......
...@@ -323,6 +323,11 @@ GMat crop(const GMat& src, const Rect& rect) ...@@ -323,6 +323,11 @@ GMat crop(const GMat& src, const Rect& rect)
return core::GCrop::on(src, rect); return core::GCrop::on(src, rect);
} }
GMat copy(const GMat& src)
{
return core::GCopy::on(src);
}
GMat concatHor(const GMat& src1, const GMat& src2) GMat concatHor(const GMat& src1, const GMat& src2)
{ {
return core::GConcatHor::on(src1, src2); return core::GConcatHor::on(src1, src2);
......
...@@ -501,6 +501,14 @@ GAPI_OCV_KERNEL(GCPUCrop, cv::gapi::core::GCrop) ...@@ -501,6 +501,14 @@ GAPI_OCV_KERNEL(GCPUCrop, cv::gapi::core::GCrop)
} }
}; };
GAPI_OCV_KERNEL(GCPUCopy, cv::gapi::core::GCopy)
{
static void run(const cv::Mat& in, cv::Mat& out)
{
cv::Mat(in).copyTo(out);
}
};
GAPI_OCV_KERNEL(GCPUConcatHor, cv::gapi::core::GConcatHor) GAPI_OCV_KERNEL(GCPUConcatHor, cv::gapi::core::GConcatHor)
{ {
static void run(const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out) static void run(const cv::Mat& in1, const cv::Mat& in2, cv::Mat& out)
...@@ -611,6 +619,7 @@ cv::gapi::GKernelPackage cv::gapi::core::cpu::kernels() ...@@ -611,6 +619,7 @@ cv::gapi::GKernelPackage cv::gapi::core::cpu::kernels()
, GCPURemap , GCPURemap
, GCPUFlip , GCPUFlip
, GCPUCrop , GCPUCrop
, GCPUCopy
, GCPUConcatHor , GCPUConcatHor
, GCPUConcatVert , GCPUConcatVert
, GCPULUT , GCPULUT
......
...@@ -2117,6 +2117,40 @@ GAPI_FLUID_KERNEL(GFluidSqrt, cv::gapi::core::GSqrt, false) ...@@ -2117,6 +2117,40 @@ GAPI_FLUID_KERNEL(GFluidSqrt, cv::gapi::core::GSqrt, false)
} }
}; };
GAPI_FLUID_KERNEL(GFluidCopy, cv::gapi::core::GCopy, false)
{
static const int Window = 1;
static void run(const View &src, Buffer &dst)
{
const auto *in = src.InLine<uchar>(0);
auto *out = dst.OutLine<uchar>();
GAPI_DbgAssert(dst.length() == src.length());
GAPI_DbgAssert(dst.meta().chan == src.meta().chan);
GAPI_DbgAssert(dst.meta().depth == src.meta().depth);
int width = src.length();
int elem_size = CV_ELEM_SIZE(CV_MAKETYPE(src.meta().depth, src.meta().chan));
int w = 0; // cycle counter
#if CV_SIMD128
for (; w <= width*elem_size-16; w+=16)
{
v_uint8x16 a;
a = v_load(&in[w]);
v_store(&out[w], a);
}
#endif
for (; w < width*elem_size; w++)
{
out[w] = in[w];
}
}
};
} // namespace fliud } // namespace fliud
} // namespace gapi } // namespace gapi
} // namespace cv } // namespace cv
...@@ -2172,6 +2206,7 @@ cv::gapi::GKernelPackage cv::gapi::core::fluid::kernels() ...@@ -2172,6 +2206,7 @@ cv::gapi::GKernelPackage cv::gapi::core::fluid::kernels()
,GFluidInRange ,GFluidInRange
,GFluidResize ,GFluidResize
,GFluidSqrt ,GFluidSqrt
,GFluidCopy
#if 0 #if 0
,GFluidMean -- not fluid ,GFluidMean -- not fluid
,GFluidSum -- not fluid ,GFluidSum -- not fluid
......
...@@ -482,6 +482,14 @@ GAPI_OCL_KERNEL(GOCLCrop, cv::gapi::core::GCrop) ...@@ -482,6 +482,14 @@ GAPI_OCL_KERNEL(GOCLCrop, cv::gapi::core::GCrop)
} }
}; };
GAPI_OCL_KERNEL(GOCLCopy, cv::gapi::core::GCopy)
{
static void run(const cv::UMat& in, cv::UMat& out)
{
cv::UMat(in).copyTo(out);
}
};
GAPI_OCL_KERNEL(GOCLConcatHor, cv::gapi::core::GConcatHor) GAPI_OCL_KERNEL(GOCLConcatHor, cv::gapi::core::GConcatHor)
{ {
static void run(const cv::UMat& in1, const cv::UMat& in2, cv::UMat& out) static void run(const cv::UMat& in1, const cv::UMat& in2, cv::UMat& out)
...@@ -573,6 +581,7 @@ cv::gapi::GKernelPackage cv::gapi::core::ocl::kernels() ...@@ -573,6 +581,7 @@ cv::gapi::GKernelPackage cv::gapi::core::ocl::kernels()
, GOCLRemap , GOCLRemap
, GOCLFlip , GOCLFlip
, GOCLCrop , GOCLCrop
, GOCLCopy
, GOCLConcatHor , GOCLConcatHor
, GOCLConcatVert , GOCLConcatVert
, GOCLLUT , GOCLLUT
......
...@@ -100,6 +100,7 @@ GAPI_TEST_FIXTURE(Merge4Test, initMatsRandU, <>, 0) ...@@ -100,6 +100,7 @@ GAPI_TEST_FIXTURE(Merge4Test, initMatsRandU, <>, 0)
GAPI_TEST_FIXTURE(RemapTest, initMatrixRandU, <>, 0) GAPI_TEST_FIXTURE(RemapTest, initMatrixRandU, <>, 0)
GAPI_TEST_FIXTURE(FlipTest, initMatrixRandU, FIXTURE_API(int), 1, flipCode) GAPI_TEST_FIXTURE(FlipTest, initMatrixRandU, FIXTURE_API(int), 1, flipCode)
GAPI_TEST_FIXTURE(CropTest, initMatrixRandU, FIXTURE_API(cv::Rect), 1, rect_to) GAPI_TEST_FIXTURE(CropTest, initMatrixRandU, FIXTURE_API(cv::Rect), 1, rect_to)
GAPI_TEST_FIXTURE(CopyTest, initMatrixRandU, <>, 0)
GAPI_TEST_FIXTURE(ConcatHorTest, initNothing, <>, 0) GAPI_TEST_FIXTURE(ConcatHorTest, initNothing, <>, 0)
GAPI_TEST_FIXTURE(ConcatVertTest, initNothing, <>, 0) GAPI_TEST_FIXTURE(ConcatVertTest, initNothing, <>, 0)
GAPI_TEST_FIXTURE(ConcatVertVecTest, initNothing, <>, 0) GAPI_TEST_FIXTURE(ConcatVertVecTest, initNothing, <>, 0)
......
...@@ -1002,6 +1002,32 @@ TEST_P(CropTest, AccuracyTest) ...@@ -1002,6 +1002,32 @@ TEST_P(CropTest, AccuracyTest)
} }
} }
TEST_P(CopyTest, AccuracyTest)
{
cv::Size sz_out = sz;
if (dtype != -1)
{
out_mat_gapi = cv::Mat(sz_out, dtype);
out_mat_ocv = cv::Mat(sz_out, dtype);
}
// G-API code //////////////////////////////////////////////////////////////
cv::GMat in;
auto out = cv::gapi::copy(in);
cv::GComputation c(in, out);
c.apply(in_mat1, out_mat_gapi, getCompileArgs());
// OpenCV code /////////////////////////////////////////////////////////////
{
cv::Mat(in_mat1).copyTo(out_mat_ocv);
}
// Comparison //////////////////////////////////////////////////////////////
{
EXPECT_EQ(0, cv::countNonZero(out_mat_ocv != out_mat_gapi));
EXPECT_EQ(out_mat_gapi.size(), sz_out);
}
}
TEST_P(ConcatHorTest, AccuracyTest) TEST_P(ConcatHorTest, AccuracyTest)
{ {
cv::Size sz_out = sz; cv::Size sz_out = sz;
......
...@@ -365,6 +365,14 @@ INSTANTIATE_TEST_CASE_P(CropTestCPU, CropTest, ...@@ -365,6 +365,14 @@ INSTANTIATE_TEST_CASE_P(CropTestCPU, CropTest,
Values(CORE_CPU), Values(CORE_CPU),
Values(cv::Rect(10, 8, 20, 35), cv::Rect(4, 10, 37, 50)))); Values(cv::Rect(10, 8, 20, 35), cv::Rect(4, 10, 37, 50))));
INSTANTIATE_TEST_CASE_P(CopyTestCPU, CopyTest,
Combine(Values( CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1 ),
Values(cv::Size(1280, 720),
cv::Size(640, 480),
cv::Size(128, 128)),
Values(-1),
Values(CORE_CPU)));
INSTANTIATE_TEST_CASE_P(LUTTestCPU, LUTTest, INSTANTIATE_TEST_CASE_P(LUTTestCPU, LUTTest,
Combine(Values(CV_8UC1, CV_8UC3), Combine(Values(CV_8UC1, CV_8UC3),
Values(cv::Size(1280, 720), Values(cv::Size(1280, 720),
......
...@@ -275,6 +275,14 @@ INSTANTIATE_TEST_CASE_P(ReInitOutTestFluid, ReInitOutTest, ...@@ -275,6 +275,14 @@ INSTANTIATE_TEST_CASE_P(ReInitOutTestFluid, ReInitOutTest,
Values(cv::Size(640, 400), Values(cv::Size(640, 400),
cv::Size(10, 480)))); cv::Size(10, 480))));
INSTANTIATE_TEST_CASE_P(CopyTestFluid, CopyTest,
Combine(Values( CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1 ),
Values(cv::Size(1280, 720),
cv::Size(640, 480),
cv::Size(128, 128)),
Values(-1),
Values(CORE_FLUID)));
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// FIXME: Clean-up test configurations which are enabled already // FIXME: Clean-up test configurations which are enabled already
#if 0 #if 0
......
...@@ -336,6 +336,14 @@ INSTANTIATE_TEST_CASE_P(CropTestGPU, CropTest, ...@@ -336,6 +336,14 @@ INSTANTIATE_TEST_CASE_P(CropTestGPU, CropTest,
Values(CORE_GPU), Values(CORE_GPU),
Values(cv::Rect(10, 8, 20, 35), cv::Rect(4, 10, 37, 50)))); Values(cv::Rect(10, 8, 20, 35), cv::Rect(4, 10, 37, 50))));
INSTANTIATE_TEST_CASE_P(CopyTestGPU, CopyTest,
Combine(Values( CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1 ),
Values(cv::Size(1280, 720),
cv::Size(640, 480),
cv::Size(128, 128)),
Values(-1),
Values(CORE_GPU)));
INSTANTIATE_TEST_CASE_P(LUTTestGPU, LUTTest, INSTANTIATE_TEST_CASE_P(LUTTestGPU, LUTTest,
Combine(Values(CV_8UC1, CV_8UC3), Combine(Values(CV_8UC1, CV_8UC3),
Values(cv::Size(1280, 720), Values(cv::Size(1280, 720),
......
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