From bf4f15fb5fd6aaf4e014de2aeef9070c7d858b9a Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 19 Feb 2014 14:00:39 +0400 Subject: [PATCH 1/2] TAPI: fix OpenCL warpers and test --- modules/stitching/src/warpers_ocl.cpp | 18 +++++++++--------- modules/stitching/test/ocl/test_warpers.cpp | 10 ++++++++-- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/modules/stitching/src/warpers_ocl.cpp b/modules/stitching/src/warpers_ocl.cpp index ce4b8946d8..4c7eb27caf 100644 --- a/modules/stitching/src/warpers_ocl.cpp +++ b/modules/stitching/src/warpers_ocl.cpp @@ -64,12 +64,12 @@ Rect PlaneWarperOcl::buildMaps(Size src_size, InputArray K, InputArray R, InputA xmap.create(dsize, CV_32FC1); ymap.create(dsize, CV_32FC1); - Mat r_kinv(1, 9, CV_32FC1, projector_.r_kinv), t(1, 3, CV_32FC1, projector_.t); + Mat k_rinv(1, 9, CV_32FC1, projector_.k_rinv), t(1, 3, CV_32FC1, projector_.t); UMat uxmap = xmap.getUMat(), uymap = ymap.getUMat(), - ur_kinv = r_kinv.getUMat(ACCESS_READ), ut = t.getUMat(ACCESS_READ); + uk_rinv = k_rinv.getUMat(ACCESS_READ), ut = t.getUMat(ACCESS_READ); k.args(ocl::KernelArg::WriteOnlyNoSize(uxmap), ocl::KernelArg::WriteOnly(uymap), - ocl::KernelArg::PtrReadOnly(ur_kinv), ocl::KernelArg::PtrReadOnly(ut), + ocl::KernelArg::PtrReadOnly(uk_rinv), ocl::KernelArg::PtrReadOnly(ut), dst_tl.x, dst_tl.y, projector_.scale); size_t globalsize[2] = { dsize.width, dsize.height }; @@ -111,11 +111,11 @@ Rect SphericalWarperOcl::buildMaps(Size src_size, InputArray K, InputArray R, Ou xmap.create(dsize, CV_32FC1); ymap.create(dsize, CV_32FC1); - Mat r_kinv(1, 9, CV_32FC1, projector_.r_kinv); - UMat uxmap = xmap.getUMat(), uymap = ymap.getUMat(), ur_kinv = r_kinv.getUMat(ACCESS_READ); + Mat k_rinv(1, 9, CV_32FC1, projector_.k_rinv); + UMat uxmap = xmap.getUMat(), uymap = ymap.getUMat(), uk_rinv = k_rinv.getUMat(ACCESS_READ); k.args(ocl::KernelArg::WriteOnlyNoSize(uxmap), ocl::KernelArg::WriteOnly(uymap), - ocl::KernelArg::PtrReadOnly(ur_kinv), dst_tl.x, dst_tl.y, projector_.scale); + ocl::KernelArg::PtrReadOnly(uk_rinv), dst_tl.x, dst_tl.y, projector_.scale); size_t globalsize[2] = { dsize.width, dsize.height }; if (k.run(2, globalsize, NULL, true)) @@ -156,11 +156,11 @@ Rect CylindricalWarperOcl::buildMaps(Size src_size, InputArray K, InputArray R, xmap.create(dsize, CV_32FC1); ymap.create(dsize, CV_32FC1); - Mat r_kinv(1, 9, CV_32FC1, projector_.r_kinv); - UMat uxmap = xmap.getUMat(), uymap = ymap.getUMat(), ur_kinv = r_kinv.getUMat(ACCESS_READ); + Mat k_rinv(1, 9, CV_32FC1, projector_.k_rinv); + UMat uxmap = xmap.getUMat(), uymap = ymap.getUMat(), uk_rinv = k_rinv.getUMat(ACCESS_READ); k.args(ocl::KernelArg::WriteOnlyNoSize(uxmap), ocl::KernelArg::WriteOnly(uymap), - ocl::KernelArg::PtrReadOnly(ur_kinv), dst_tl.x, dst_tl.y, projector_.scale); + ocl::KernelArg::PtrReadOnly(uk_rinv), dst_tl.x, dst_tl.y, projector_.scale); size_t globalsize[2] = { dsize.width, dsize.height }; if (k.run(2, globalsize, NULL, true)) diff --git a/modules/stitching/test/ocl/test_warpers.cpp b/modules/stitching/test/ocl/test_warpers.cpp index d2f5dc0091..94050e9661 100644 --- a/modules/stitching/test/ocl/test_warpers.cpp +++ b/modules/stitching/test/ocl/test_warpers.cpp @@ -64,7 +64,13 @@ struct WarperTestBase : src = randomMat(size, CV_32FC1, -500, 500); K = Mat::eye(3, 3, CV_32FC1); - R = Mat::eye(3, 3, CV_32FC1); + float angle = (float)(30.0 * CV_PI / 180.0); + float rotationMatrix[9] = { + (float)cos(angle), (float)sin(angle), 0, + (float)-sin(angle), (float)cos(angle), 0, + 0, 0, 1 + }; + Mat(3, 3, CV_32FC1, rotationMatrix).copyTo(R); } void Near(double threshold = 0.) @@ -140,7 +146,7 @@ OCL_TEST_F(PlaneWarperOclTest, Mat) OCL_OFF(warper->warp(src, K, R, INTER_LINEAR, BORDER_REPLICATE, dst)); OCL_ON(warper->warp(src, K, R, INTER_LINEAR, BORDER_REPLICATE, udst)); - Near(1e-5); + Near(1e-4); } } From ddd3c062b55c03bb95aa40d230543ccd2912f7b2 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 19 Feb 2014 20:30:27 +0400 Subject: [PATCH 2/2] TAPI: fix perf test for warpers --- .../stitching/perf/opencl/perf_warpers.cpp | 44 +++++++++++++++---- modules/stitching/src/warpers_ocl.cpp | 2 +- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/modules/stitching/perf/opencl/perf_warpers.cpp b/modules/stitching/perf/opencl/perf_warpers.cpp index 8563bc8209..21fe22da77 100644 --- a/modules/stitching/perf/opencl/perf_warpers.cpp +++ b/modules/stitching/perf/opencl/perf_warpers.cpp @@ -60,7 +60,7 @@ enum class WarperBase { public: - explicit WarperBase(int type) + explicit WarperBase(int type, Size srcSize) { Ptr creator; if (cv::ocl::useOpenCL()) @@ -83,10 +83,16 @@ public: } CV_Assert(!creator.empty()); - warper = creator->create(2.0); - K = Mat::eye(3, 3, CV_32FC1); + K.at(0,0) = (float)srcSize.width; + K.at(0,2) = (float)srcSize.width/2; + K.at(1,1) = (float)srcSize.height; + K.at(1,2) = (float)srcSize.height/2; + K.at(2,2) = 1.0f; R = Mat::eye(3, 3, CV_32FC1); + float scale = (float)srcSize.width; + + warper = creator->create(scale); } Rect buildMaps(Size src_size, OutputArray xmap, OutputArray ymap) const @@ -109,15 +115,25 @@ CV_ENUM(WarperType, SphericalWarperType, CylindricalWarperType, PlaneWarperType) typedef tuple StitchingWarpersParams; typedef TestBaseWithParam StitchingWarpersFixture; +static void prepareWarperSrc(InputOutputArray src, Size srcSize) +{ + src.create(srcSize, CV_8UC1); + src.setTo(Scalar::all(64)); + ellipse(src, Point(srcSize.width/2, srcSize.height/2), Size(srcSize.width/2, srcSize.height/2), + 360, 0, 360, Scalar::all(255), 2); + ellipse(src, Point(srcSize.width/2, srcSize.height/2), Size(srcSize.width/3, srcSize.height/3), + 360, 0, 360, Scalar::all(128), 2); + rectangle(src, Point(10, 10), Point(srcSize.width - 10, srcSize.height - 10), Scalar::all(128), 2); +} + OCL_PERF_TEST_P(StitchingWarpersFixture, StitchingWarpers_BuildMaps, ::testing::Combine(OCL_TEST_SIZES, WarperType::all())) { const StitchingWarpersParams params = GetParam(); const Size srcSize = get<0>(params); - const WarperBase warper(get<1>(params)); + const WarperBase warper(get<1>(params), srcSize); - UMat src(srcSize, CV_32FC1), xmap(srcSize, CV_32FC1), ymap(srcSize, CV_32FC1); - declare.in(src, WARMUP_RNG).out(xmap, ymap); + UMat xmap, ymap; OCL_TEST_CYCLE() warper.buildMaps(srcSize, xmap, ymap); @@ -130,13 +146,23 @@ OCL_PERF_TEST_P(StitchingWarpersFixture, StitchingWarpers_Warp, { const StitchingWarpersParams params = GetParam(); const Size srcSize = get<0>(params); - const WarperBase warper(get<1>(params)); + const WarperBase warper(get<1>(params), srcSize); - UMat src(srcSize, CV_32FC1), dst(srcSize, CV_32FC1); - declare.in(src, WARMUP_RNG).out(dst); + UMat src, dst; + prepareWarperSrc(src, srcSize); + declare.in(src, WARMUP_READ); OCL_TEST_CYCLE() warper.warp(src, INTER_LINEAR, BORDER_REPLICATE, dst); +#if 0 + namedWindow("src", WINDOW_NORMAL); + namedWindow("dst", WINDOW_NORMAL); + imshow("src", src); + imshow("dst", dst); + std::cout << dst.size() << " " << dst.size().area() << std::endl; + cv::waitKey(); +#endif + SANITY_CHECK(dst, 1e-5); } diff --git a/modules/stitching/src/warpers_ocl.cpp b/modules/stitching/src/warpers_ocl.cpp index 4c7eb27caf..ef8f31677e 100644 --- a/modules/stitching/src/warpers_ocl.cpp +++ b/modules/stitching/src/warpers_ocl.cpp @@ -50,7 +50,7 @@ namespace detail { Rect PlaneWarperOcl::buildMaps(Size src_size, InputArray K, InputArray R, InputArray T, OutputArray xmap, OutputArray ymap) { - projector_.setCameraParams(K, R); + projector_.setCameraParams(K, R, T); Point dst_tl, dst_br; detectResultRoi(src_size, dst_tl, dst_br);