diff --git a/modules/stitching/perf/opencl/perf_warpers.cpp b/modules/stitching/perf/opencl/perf_warpers.cpp index 8563bc820..21fe22da7 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 4c7eb27ca..ef8f31677 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);