From 4cc7b0a74f75e6e75d3cbbe265c2d2f4071f1134 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Wed, 24 Dec 2014 16:05:47 +0300 Subject: [PATCH 1/4] move ImagePyramid to cudalegacy --- .../cudalegacy/include/opencv2/cudalegacy.hpp | 13 ++ modules/cudalegacy/src/image_pyramid.cpp | 147 ++++++++++++++++++ modules/cudawarping/CMakeLists.txt | 2 +- .../include/opencv2/cudawarping.hpp | 8 - modules/cudawarping/perf/perf_warping.cpp | 37 ----- modules/cudawarping/src/precomp.hpp | 7 - modules/cudawarping/src/pyramids.cpp | 110 ------------- 7 files changed, 161 insertions(+), 163 deletions(-) create mode 100644 modules/cudalegacy/src/image_pyramid.cpp diff --git a/modules/cudalegacy/include/opencv2/cudalegacy.hpp b/modules/cudalegacy/include/opencv2/cudalegacy.hpp index a72ef09c7..5e5773385 100644 --- a/modules/cudalegacy/include/opencv2/cudalegacy.hpp +++ b/modules/cudalegacy/include/opencv2/cudalegacy.hpp @@ -43,6 +43,7 @@ #ifndef __OPENCV_CUDALEGACY_HPP__ #define __OPENCV_CUDALEGACY_HPP__ +#include "opencv2/core/cuda.hpp" #include "opencv2/cudalegacy/NCV.hpp" #include "opencv2/cudalegacy/NPP_staging.hpp" #include "opencv2/cudalegacy/NCVPyramid.hpp" @@ -56,4 +57,16 @@ @} */ +namespace cv { namespace cuda { + +class CV_EXPORTS ImagePyramid : public Algorithm +{ +public: + virtual void getLayer(OutputArray outImg, Size outRoi, Stream& stream = Stream::Null()) const = 0; +}; + +CV_EXPORTS Ptr createImagePyramid(InputArray img, int nLayers = -1, Stream& stream = Stream::Null()); + +}} + #endif /* __OPENCV_CUDALEGACY_HPP__ */ diff --git a/modules/cudalegacy/src/image_pyramid.cpp b/modules/cudalegacy/src/image_pyramid.cpp new file mode 100644 index 000000000..938ffea5d --- /dev/null +++ b/modules/cudalegacy/src/image_pyramid.cpp @@ -0,0 +1,147 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "precomp.hpp" + +using namespace cv; +using namespace cv::cuda; + +#if !defined HAVE_CUDA || defined(CUDA_DISABLER) + +Ptr cv::cuda::createImagePyramid(InputArray, int, Stream&) { throw_no_cuda(); return Ptr(); } + +#else // HAVE_CUDA + +namespace +{ + class ImagePyramidImpl : public ImagePyramid + { + public: + ImagePyramidImpl(InputArray img, int nLayers, Stream& stream); + + void getLayer(OutputArray outImg, Size outRoi, Stream& stream = Stream::Null()) const; + + private: + GpuMat layer0_; + std::vector pyramid_; + int nLayers_; + }; + + ImagePyramidImpl::ImagePyramidImpl(InputArray _img, int numLayers, Stream& stream) + { + GpuMat img = _img.getGpuMat(); + + CV_Assert( img.depth() <= CV_32F && img.channels() <= 4 ); + + img.copyTo(layer0_, stream); + + Size szLastLayer = img.size(); + nLayers_ = 1; + + if (numLayers <= 0) + numLayers = 255; // it will cut-off when any of the dimensions goes 1 + + pyramid_.resize(numLayers); + + for (int i = 0; i < numLayers - 1; ++i) + { + Size szCurLayer(szLastLayer.width / 2, szLastLayer.height / 2); + + if (szCurLayer.width == 0 || szCurLayer.height == 0) + break; + + ensureSizeIsEnough(szCurLayer, img.type(), pyramid_[i]); + nLayers_++; + + const GpuMat& prevLayer = i == 0 ? layer0_ : pyramid_[i - 1]; + + cv::cuda::device::pyramid::downsampleX2(prevLayer, pyramid_[i], img.depth(), img.channels(), StreamAccessor::getStream(stream)); + + szLastLayer = szCurLayer; + } + } + + void ImagePyramidImpl::getLayer(OutputArray _outImg, Size outRoi, Stream& stream) const + { + CV_Assert( outRoi.width <= layer0_.cols && outRoi.height <= layer0_.rows && outRoi.width > 0 && outRoi.height > 0 ); + + ensureSizeIsEnough(outRoi, layer0_.type(), _outImg); + GpuMat outImg = _outImg.getGpuMat(); + + if (outRoi.width == layer0_.cols && outRoi.height == layer0_.rows) + { + layer0_.copyTo(outImg, stream); + return; + } + + float lastScale = 1.0f; + float curScale; + GpuMat lastLayer = layer0_; + GpuMat curLayer; + + for (int i = 0; i < nLayers_ - 1; ++i) + { + curScale = lastScale * 0.5f; + curLayer = pyramid_[i]; + + if (outRoi.width == curLayer.cols && outRoi.height == curLayer.rows) + { + curLayer.copyTo(outImg, stream); + } + + if (outRoi.width >= curLayer.cols && outRoi.height >= curLayer.rows) + break; + + lastScale = curScale; + lastLayer = curLayer; + } + + cv::cuda::device::pyramid::interpolateFrom1(lastLayer, outImg, outImg.depth(), outImg.channels(), StreamAccessor::getStream(stream)); + } +} + +Ptr cv::cuda::createImagePyramid(InputArray img, int nLayers, Stream& stream) +{ + return Ptr(new ImagePyramidImpl(img, nLayers, stream)); +} + +#endif diff --git a/modules/cudawarping/CMakeLists.txt b/modules/cudawarping/CMakeLists.txt index 231e24e69..fa99e9d04 100644 --- a/modules/cudawarping/CMakeLists.txt +++ b/modules/cudawarping/CMakeLists.txt @@ -6,4 +6,4 @@ set(the_description "CUDA-accelerated Image Warping") ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127 /wd4324 /wd4512 -Wundef -Wmissing-declarations -Wshadow) -ocv_define_module(cudawarping opencv_imgproc OPTIONAL opencv_cudalegacy) +ocv_define_module(cudawarping opencv_core opencv_imgproc OPTIONAL opencv_cudev) diff --git a/modules/cudawarping/include/opencv2/cudawarping.hpp b/modules/cudawarping/include/opencv2/cudawarping.hpp index ca877d50c..fbd63873b 100644 --- a/modules/cudawarping/include/opencv2/cudawarping.hpp +++ b/modules/cudawarping/include/opencv2/cudawarping.hpp @@ -224,14 +224,6 @@ src . */ CV_EXPORTS void pyrUp(InputArray src, OutputArray dst, Stream& stream = Stream::Null()); -class CV_EXPORTS ImagePyramid : public Algorithm -{ -public: - virtual void getLayer(OutputArray outImg, Size outRoi, Stream& stream = Stream::Null()) const = 0; -}; - -CV_EXPORTS Ptr createImagePyramid(InputArray img, int nLayers = -1, Stream& stream = Stream::Null()); - //! @} }} // namespace cv { namespace cuda { diff --git a/modules/cudawarping/perf/perf_warping.cpp b/modules/cudawarping/perf/perf_warping.cpp index dfb11075a..1096d3f44 100644 --- a/modules/cudawarping/perf/perf_warping.cpp +++ b/modules/cudawarping/perf/perf_warping.cpp @@ -514,40 +514,3 @@ PERF_TEST_P(Sz_Depth_Cn, PyrUp, CPU_SANITY_CHECK(dst); } } - -////////////////////////////////////////////////////////////////////// -// ImagePyramidGetLayer - -PERF_TEST_P(Sz_Depth_Cn, ImagePyramidGetLayer, - Combine(CUDA_TYPICAL_MAT_SIZES, - Values(CV_8U, CV_16U, CV_32F), - CUDA_CHANNELS_1_3_4)) -{ - const cv::Size size = GET_PARAM(0); - const int depth = GET_PARAM(1); - const int channels = GET_PARAM(2); - - const int type = CV_MAKE_TYPE(depth, channels); - - cv::Mat src(size, type); - declare.in(src, WARMUP_RNG); - - const int nLayers = 3; - const cv::Size dstSize(size.width / 2 + 10, size.height / 2 + 10); - - if (PERF_RUN_CUDA()) - { - const cv::cuda::GpuMat d_src(src); - cv::cuda::GpuMat dst; - - cv::Ptr d_pyr = cv::cuda::createImagePyramid(d_src, nLayers); - - TEST_CYCLE() d_pyr->getLayer(dst, dstSize); - - CUDA_SANITY_CHECK(dst); - } - else - { - FAIL_NO_CPU(); - } -} diff --git a/modules/cudawarping/src/precomp.hpp b/modules/cudawarping/src/precomp.hpp index 9f5b0c152..a59a4e925 100644 --- a/modules/cudawarping/src/precomp.hpp +++ b/modules/cudawarping/src/precomp.hpp @@ -47,11 +47,4 @@ #include "opencv2/core/private.cuda.hpp" -#include "opencv2/opencv_modules.hpp" - -#ifdef HAVE_OPENCV_CUDALEGACY -# include "opencv2/cudalegacy.hpp" -# include "opencv2/cudalegacy/private.hpp" -#endif - #endif /* __OPENCV_PRECOMP_H__ */ diff --git a/modules/cudawarping/src/pyramids.cpp b/modules/cudawarping/src/pyramids.cpp index 3d942fc6a..0cb0f5de5 100644 --- a/modules/cudawarping/src/pyramids.cpp +++ b/modules/cudawarping/src/pyramids.cpp @@ -50,8 +50,6 @@ using namespace cv::cuda; void cv::cuda::pyrDown(InputArray, OutputArray, Stream&) { throw_no_cuda(); } void cv::cuda::pyrUp(InputArray, OutputArray, Stream&) { throw_no_cuda(); } -Ptr cv::cuda::createImagePyramid(InputArray, int, Stream&) { throw_no_cuda(); return Ptr(); } - #else // HAVE_CUDA ////////////////////////////////////////////////////////////////////////////// @@ -133,112 +131,4 @@ void cv::cuda::pyrUp(InputArray _src, OutputArray _dst, Stream& stream) func(src, dst, StreamAccessor::getStream(stream)); } -////////////////////////////////////////////////////////////////////////////// -// ImagePyramid - -#ifdef HAVE_OPENCV_CUDALEGACY - -namespace -{ - class ImagePyramidImpl : public ImagePyramid - { - public: - ImagePyramidImpl(InputArray img, int nLayers, Stream& stream); - - void getLayer(OutputArray outImg, Size outRoi, Stream& stream = Stream::Null()) const; - - private: - GpuMat layer0_; - std::vector pyramid_; - int nLayers_; - }; - - ImagePyramidImpl::ImagePyramidImpl(InputArray _img, int numLayers, Stream& stream) - { - GpuMat img = _img.getGpuMat(); - - CV_Assert( img.depth() <= CV_32F && img.channels() <= 4 ); - - img.copyTo(layer0_, stream); - - Size szLastLayer = img.size(); - nLayers_ = 1; - - if (numLayers <= 0) - numLayers = 255; // it will cut-off when any of the dimensions goes 1 - - pyramid_.resize(numLayers); - - for (int i = 0; i < numLayers - 1; ++i) - { - Size szCurLayer(szLastLayer.width / 2, szLastLayer.height / 2); - - if (szCurLayer.width == 0 || szCurLayer.height == 0) - break; - - ensureSizeIsEnough(szCurLayer, img.type(), pyramid_[i]); - nLayers_++; - - const GpuMat& prevLayer = i == 0 ? layer0_ : pyramid_[i - 1]; - - cv::cuda::device::pyramid::downsampleX2(prevLayer, pyramid_[i], img.depth(), img.channels(), StreamAccessor::getStream(stream)); - - szLastLayer = szCurLayer; - } - } - - void ImagePyramidImpl::getLayer(OutputArray _outImg, Size outRoi, Stream& stream) const - { - CV_Assert( outRoi.width <= layer0_.cols && outRoi.height <= layer0_.rows && outRoi.width > 0 && outRoi.height > 0 ); - - ensureSizeIsEnough(outRoi, layer0_.type(), _outImg); - GpuMat outImg = _outImg.getGpuMat(); - - if (outRoi.width == layer0_.cols && outRoi.height == layer0_.rows) - { - layer0_.copyTo(outImg, stream); - return; - } - - float lastScale = 1.0f; - float curScale; - GpuMat lastLayer = layer0_; - GpuMat curLayer; - - for (int i = 0; i < nLayers_ - 1; ++i) - { - curScale = lastScale * 0.5f; - curLayer = pyramid_[i]; - - if (outRoi.width == curLayer.cols && outRoi.height == curLayer.rows) - { - curLayer.copyTo(outImg, stream); - } - - if (outRoi.width >= curLayer.cols && outRoi.height >= curLayer.rows) - break; - - lastScale = curScale; - lastLayer = curLayer; - } - - cv::cuda::device::pyramid::interpolateFrom1(lastLayer, outImg, outImg.depth(), outImg.channels(), StreamAccessor::getStream(stream)); - } -} - #endif - -Ptr cv::cuda::createImagePyramid(InputArray img, int nLayers, Stream& stream) -{ -#ifndef HAVE_OPENCV_CUDALEGACY - (void) img; - (void) nLayers; - (void) stream; - throw_no_cuda(); - return Ptr(); -#else - return Ptr(new ImagePyramidImpl(img, nLayers, stream)); -#endif -} - -#endif // HAVE_CUDA From ecee388236cdfd737def724c3f9fca6ad6e0a4aa Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Wed, 24 Dec 2014 16:06:09 +0300 Subject: [PATCH 2/4] move buildWarp*Maps to stitching --- .../include/opencv2/cudawarping.hpp | 15 - modules/cudawarping/perf/perf_warping.cpp | 82 ----- modules/cudawarping/src/warp.cpp | 122 -------- modules/stitching/CMakeLists.txt | 5 + .../opencv2/stitching/detail/warpers.hpp | 2 - .../src/cuda/build_warp_maps.cu | 0 modules/stitching/src/warpers.cpp | 85 ------ modules/stitching/src/warpers_cuda.cpp | 283 ++++++++++++++++++ 8 files changed, 288 insertions(+), 306 deletions(-) rename modules/{cudawarping => stitching}/src/cuda/build_warp_maps.cu (100%) create mode 100644 modules/stitching/src/warpers_cuda.cpp diff --git a/modules/cudawarping/include/opencv2/cudawarping.hpp b/modules/cudawarping/include/opencv2/cudawarping.hpp index fbd63873b..66c41ccef 100644 --- a/modules/cudawarping/include/opencv2/cudawarping.hpp +++ b/modules/cudawarping/include/opencv2/cudawarping.hpp @@ -171,21 +171,6 @@ CV_EXPORTS void warpPerspective(InputArray src, OutputArray dst, InputArray M, S */ CV_EXPORTS void buildWarpPerspectiveMaps(InputArray M, bool inverse, Size dsize, OutputArray xmap, OutputArray ymap, Stream& stream = Stream::Null()); -/** @brief Builds plane warping maps. - */ -CV_EXPORTS void buildWarpPlaneMaps(Size src_size, Rect dst_roi, InputArray K, InputArray R, InputArray T, float scale, - OutputArray map_x, OutputArray map_y, Stream& stream = Stream::Null()); - -/** @brief Builds cylindrical warping maps. - */ -CV_EXPORTS void buildWarpCylindricalMaps(Size src_size, Rect dst_roi, InputArray K, InputArray R, float scale, - OutputArray map_x, OutputArray map_y, Stream& stream = Stream::Null()); - -/** @brief Builds spherical warping maps. - */ -CV_EXPORTS void buildWarpSphericalMaps(Size src_size, Rect dst_roi, InputArray K, InputArray R, float scale, - OutputArray map_x, OutputArray map_y, Stream& stream = Stream::Null()); - /** @brief Rotates an image around the origin (0,0) and then shifts it. @param src Source image. Supports 1, 3 or 4 channels images with CV_8U , CV_16U or CV_32F diff --git a/modules/cudawarping/perf/perf_warping.cpp b/modules/cudawarping/perf/perf_warping.cpp index 1096d3f44..36662418c 100644 --- a/modules/cudawarping/perf/perf_warping.cpp +++ b/modules/cudawarping/perf/perf_warping.cpp @@ -325,88 +325,6 @@ PERF_TEST_P(Sz_Depth_Cn_Inter_Border, WarpPerspective, } } -////////////////////////////////////////////////////////////////////// -// BuildWarpPlaneMaps - -PERF_TEST_P(Sz, BuildWarpPlaneMaps, - CUDA_TYPICAL_MAT_SIZES) -{ - const cv::Size size = GetParam(); - - const cv::Mat K = cv::Mat::eye(3, 3, CV_32FC1); - const cv::Mat R = cv::Mat::ones(3, 3, CV_32FC1); - const cv::Mat T = cv::Mat::zeros(1, 3, CV_32F); - - if (PERF_RUN_CUDA()) - { - cv::cuda::GpuMat map_x; - cv::cuda::GpuMat map_y; - - TEST_CYCLE() cv::cuda::buildWarpPlaneMaps(size, cv::Rect(0, 0, size.width, size.height), K, R, T, 1.0, map_x, map_y); - - CUDA_SANITY_CHECK(map_x); - CUDA_SANITY_CHECK(map_y); - } - else - { - FAIL_NO_CPU(); - } -} - -////////////////////////////////////////////////////////////////////// -// BuildWarpCylindricalMaps - -PERF_TEST_P(Sz, BuildWarpCylindricalMaps, - CUDA_TYPICAL_MAT_SIZES) -{ - const cv::Size size = GetParam(); - - const cv::Mat K = cv::Mat::eye(3, 3, CV_32FC1); - const cv::Mat R = cv::Mat::ones(3, 3, CV_32FC1); - - if (PERF_RUN_CUDA()) - { - cv::cuda::GpuMat map_x; - cv::cuda::GpuMat map_y; - - TEST_CYCLE() cv::cuda::buildWarpCylindricalMaps(size, cv::Rect(0, 0, size.width, size.height), K, R, 1.0, map_x, map_y); - - CUDA_SANITY_CHECK(map_x); - CUDA_SANITY_CHECK(map_y); - } - else - { - FAIL_NO_CPU(); - } -} - -////////////////////////////////////////////////////////////////////// -// BuildWarpSphericalMaps - -PERF_TEST_P(Sz, BuildWarpSphericalMaps, - CUDA_TYPICAL_MAT_SIZES) -{ - const cv::Size size = GetParam(); - - const cv::Mat K = cv::Mat::eye(3, 3, CV_32FC1); - const cv::Mat R = cv::Mat::ones(3, 3, CV_32FC1); - - if (PERF_RUN_CUDA()) - { - cv::cuda::GpuMat map_x; - cv::cuda::GpuMat map_y; - - TEST_CYCLE() cv::cuda::buildWarpSphericalMaps(size, cv::Rect(0, 0, size.width, size.height), K, R, 1.0, map_x, map_y); - - CUDA_SANITY_CHECK(map_x); - CUDA_SANITY_CHECK(map_y); - } - else - { - FAIL_NO_CPU(); - } -} - ////////////////////////////////////////////////////////////////////// // Rotate diff --git a/modules/cudawarping/src/warp.cpp b/modules/cudawarping/src/warp.cpp index 121ea5c01..99554e312 100644 --- a/modules/cudawarping/src/warp.cpp +++ b/modules/cudawarping/src/warp.cpp @@ -53,10 +53,6 @@ void cv::cuda::buildWarpAffineMaps(InputArray, bool, Size, OutputArray, OutputAr void cv::cuda::warpPerspective(InputArray, OutputArray, InputArray, Size, int, int, Scalar, Stream&) { throw_no_cuda(); } void cv::cuda::buildWarpPerspectiveMaps(InputArray, bool, Size, OutputArray, OutputArray, Stream&) { throw_no_cuda(); } -void cv::cuda::buildWarpPlaneMaps(Size, Rect, InputArray, InputArray, InputArray, float, OutputArray, OutputArray, Stream&) { throw_no_cuda(); } -void cv::cuda::buildWarpCylindricalMaps(Size, Rect, InputArray, InputArray, float, OutputArray, OutputArray, Stream&) { throw_no_cuda(); } -void cv::cuda::buildWarpSphericalMaps(Size, Rect, InputArray, InputArray, float, OutputArray, OutputArray, Stream&) { throw_no_cuda(); } - void cv::cuda::rotate(InputArray, OutputArray, Size, double, double, double, int, Stream&) { throw_no_cuda(); } #else // HAVE_CUDA @@ -462,124 +458,6 @@ void cv::cuda::warpPerspective(InputArray _src, OutputArray _dst, InputArray _M, } } -////////////////////////////////////////////////////////////////////////////// -// buildWarpPlaneMaps - -namespace cv { namespace cuda { namespace device -{ - namespace imgproc - { - void buildWarpPlaneMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, - const float k_rinv[9], const float r_kinv[9], const float t[3], float scale, - cudaStream_t stream); - } -}}} - -void cv::cuda::buildWarpPlaneMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, InputArray _T, - float scale, OutputArray _map_x, OutputArray _map_y, Stream& stream) -{ - (void) src_size; - - Mat K = _K.getMat(); - Mat R = _R.getMat(); - Mat T = _T.getMat(); - - CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); - CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); - CV_Assert( (T.size() == Size(3,1) || T.size() == Size(1,3)) && T.type() == CV_32FC1 && T.isContinuous() ); - - Mat K_Rinv = K * R.t(); - Mat R_Kinv = R * K.inv(); - CV_Assert( K_Rinv.isContinuous() ); - CV_Assert( R_Kinv.isContinuous() ); - - _map_x.create(dst_roi.size(), CV_32FC1); - _map_y.create(dst_roi.size(), CV_32FC1); - - GpuMat map_x = _map_x.getGpuMat(); - GpuMat map_y = _map_y.getGpuMat(); - - device::imgproc::buildWarpPlaneMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), - T.ptr(), scale, StreamAccessor::getStream(stream)); -} - -////////////////////////////////////////////////////////////////////////////// -// buildWarpCylyndricalMaps - -namespace cv { namespace cuda { namespace device -{ - namespace imgproc - { - void buildWarpCylindricalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, - const float k_rinv[9], const float r_kinv[9], float scale, - cudaStream_t stream); - } -}}} - -void cv::cuda::buildWarpCylindricalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, - OutputArray _map_x, OutputArray _map_y, Stream& stream) -{ - (void) src_size; - - Mat K = _K.getMat(); - Mat R = _R.getMat(); - - CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); - CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); - - Mat K_Rinv = K * R.t(); - Mat R_Kinv = R * K.inv(); - CV_Assert( K_Rinv.isContinuous() ); - CV_Assert( R_Kinv.isContinuous() ); - - _map_x.create(dst_roi.size(), CV_32FC1); - _map_y.create(dst_roi.size(), CV_32FC1); - - GpuMat map_x = _map_x.getGpuMat(); - GpuMat map_y = _map_y.getGpuMat(); - - device::imgproc::buildWarpCylindricalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); -} - - -////////////////////////////////////////////////////////////////////////////// -// buildWarpSphericalMaps - -namespace cv { namespace cuda { namespace device -{ - namespace imgproc - { - void buildWarpSphericalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, - const float k_rinv[9], const float r_kinv[9], float scale, - cudaStream_t stream); - } -}}} - -void cv::cuda::buildWarpSphericalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, - OutputArray _map_x, OutputArray _map_y, Stream& stream) -{ - (void) src_size; - - Mat K = _K.getMat(); - Mat R = _R.getMat(); - - CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); - CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); - - Mat K_Rinv = K * R.t(); - Mat R_Kinv = R * K.inv(); - CV_Assert( K_Rinv.isContinuous() ); - CV_Assert( R_Kinv.isContinuous() ); - - _map_x.create(dst_roi.size(), CV_32FC1); - _map_y.create(dst_roi.size(), CV_32FC1); - - GpuMat map_x = _map_x.getGpuMat(); - GpuMat map_y = _map_y.getGpuMat(); - - device::imgproc::buildWarpSphericalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); -} - //////////////////////////////////////////////////////////////////////// // rotate diff --git a/modules/stitching/CMakeLists.txt b/modules/stitching/CMakeLists.txt index 73db4a031..8d11491be 100644 --- a/modules/stitching/CMakeLists.txt +++ b/modules/stitching/CMakeLists.txt @@ -1,3 +1,8 @@ set(the_description "Images stitching") + +if(HAVE_CUDA) + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations) +endif() + ocv_define_module(stitching opencv_imgproc opencv_features2d opencv_calib3d opencv_objdetect OPTIONAL opencv_cuda opencv_cudaarithm opencv_cudafilters opencv_cudafeatures2d opencv_xfeatures2d) diff --git a/modules/stitching/include/opencv2/stitching/detail/warpers.hpp b/modules/stitching/include/opencv2/stitching/detail/warpers.hpp index 79f387cc2..19dff8e1f 100644 --- a/modules/stitching/include/opencv2/stitching/detail/warpers.hpp +++ b/modules/stitching/include/opencv2/stitching/detail/warpers.hpp @@ -398,7 +398,6 @@ public: }; -#ifdef HAVE_OPENCV_CUDAWARPING class CV_EXPORTS PlaneWarperGpu : public PlaneWarper { public: @@ -515,7 +514,6 @@ public: private: cuda::GpuMat d_xmap_, d_ymap_, d_src_, d_dst_; }; -#endif struct SphericalPortraitProjector : ProjectorBase diff --git a/modules/cudawarping/src/cuda/build_warp_maps.cu b/modules/stitching/src/cuda/build_warp_maps.cu similarity index 100% rename from modules/cudawarping/src/cuda/build_warp_maps.cu rename to modules/stitching/src/cuda/build_warp_maps.cu diff --git a/modules/stitching/src/warpers.cpp b/modules/stitching/src/warpers.cpp index 744474ba6..4b6185f4e 100644 --- a/modules/stitching/src/warpers.cpp +++ b/modules/stitching/src/warpers.cpp @@ -242,91 +242,6 @@ void SphericalWarper::detectResultRoi(Size src_size, Point &dst_tl, Point &dst_b dst_br.y = static_cast(br_vf); } - -#ifdef HAVE_OPENCV_CUDAWARPING -Rect PlaneWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap) -{ - return buildMaps(src_size, K, R, Mat::zeros(3, 1, CV_32F), xmap, ymap); -} - -Rect PlaneWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, InputArray T, cuda::GpuMat & xmap, cuda::GpuMat & ymap) -{ - projector_.setCameraParams(K, R, T); - - Point dst_tl, dst_br; - detectResultRoi(src_size, dst_tl, dst_br); - - cuda::buildWarpPlaneMaps(src_size, Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1)), - K, R, T, projector_.scale, xmap, ymap); - - return Rect(dst_tl, dst_br); -} - -Point PlaneWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, int interp_mode, int border_mode, - cuda::GpuMat & dst) -{ - return warp(src, K, R, Mat::zeros(3, 1, CV_32F), interp_mode, border_mode, dst); -} - - -Point PlaneWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, InputArray T, int interp_mode, int border_mode, - cuda::GpuMat & dst) -{ - Rect dst_roi = buildMaps(src.size(), K, R, T, d_xmap_, d_ymap_); - dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); - cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); - return dst_roi.tl(); -} - - -Rect SphericalWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap) -{ - projector_.setCameraParams(K, R); - - Point dst_tl, dst_br; - detectResultRoi(src_size, dst_tl, dst_br); - - cuda::buildWarpSphericalMaps(src_size, Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1)), - K, R, projector_.scale, xmap, ymap); - - return Rect(dst_tl, dst_br); -} - - -Point SphericalWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, int interp_mode, int border_mode, - cuda::GpuMat & dst) -{ - Rect dst_roi = buildMaps(src.size(), K, R, d_xmap_, d_ymap_); - dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); - cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); - return dst_roi.tl(); -} - - -Rect CylindricalWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap) -{ - projector_.setCameraParams(K, R); - - Point dst_tl, dst_br; - detectResultRoi(src_size, dst_tl, dst_br); - - cuda::buildWarpCylindricalMaps(src_size, Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1)), - K, R, projector_.scale, xmap, ymap); - - return Rect(dst_tl, dst_br); -} - - -Point CylindricalWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, int interp_mode, int border_mode, - cuda::GpuMat & dst) -{ - Rect dst_roi = buildMaps(src.size(), K, R, d_xmap_, d_ymap_); - dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); - cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); - return dst_roi.tl(); -} -#endif - void SphericalPortraitWarper::detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) { detectResultRoiByBorder(src_size, dst_tl, dst_br); diff --git a/modules/stitching/src/warpers_cuda.cpp b/modules/stitching/src/warpers_cuda.cpp new file mode 100644 index 000000000..0593e6d9e --- /dev/null +++ b/modules/stitching/src/warpers_cuda.cpp @@ -0,0 +1,283 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "precomp.hpp" +#include "opencv2/core/private.cuda.hpp" + +using namespace cv; +using namespace cv::cuda; + +Rect cv::detail::PlaneWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, + cuda::GpuMat & xmap, cuda::GpuMat & ymap) +{ + return buildMaps(src_size, K, R, Mat::zeros(3, 1, CV_32F), xmap, ymap); +} + +#ifdef HAVE_CUDA + +namespace cv { namespace cuda { namespace device +{ + namespace imgproc + { + void buildWarpPlaneMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, + const float k_rinv[9], const float r_kinv[9], const float t[3], float scale, + cudaStream_t stream); + } +}}} + +static void buildWarpPlaneMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, InputArray _T, + float scale, OutputArray _map_x, OutputArray _map_y, Stream& stream = Stream::Null()) +{ + (void) src_size; + + Mat K = _K.getMat(); + Mat R = _R.getMat(); + Mat T = _T.getMat(); + + CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); + CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); + CV_Assert( (T.size() == Size(3,1) || T.size() == Size(1,3)) && T.type() == CV_32FC1 && T.isContinuous() ); + + Mat K_Rinv = K * R.t(); + Mat R_Kinv = R * K.inv(); + CV_Assert( K_Rinv.isContinuous() ); + CV_Assert( R_Kinv.isContinuous() ); + + _map_x.create(dst_roi.size(), CV_32FC1); + _map_y.create(dst_roi.size(), CV_32FC1); + + GpuMat map_x = _map_x.getGpuMat(); + GpuMat map_y = _map_y.getGpuMat(); + + device::imgproc::buildWarpPlaneMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), + T.ptr(), scale, StreamAccessor::getStream(stream)); +} + +#endif + +Rect cv::detail::PlaneWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, InputArray T, + cuda::GpuMat & xmap, cuda::GpuMat & ymap) +{ +#ifndef HAVE_CUDA + (void)src_size; + (void)K; + (void)R; + (void)T; + (void)xmap; + (void)ymap; + throw_no_cuda(); + return Rect(); +#else + projector_.setCameraParams(K, R, T); + + Point dst_tl, dst_br; + detectResultRoi(src_size, dst_tl, dst_br); + + ::buildWarpPlaneMaps(src_size, Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1)), + K, R, T, projector_.scale, xmap, ymap); + + return Rect(dst_tl, dst_br); +#endif +} + +Point cv::detail::PlaneWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, + int interp_mode, int border_mode, + cuda::GpuMat & dst) +{ + return warp(src, K, R, Mat::zeros(3, 1, CV_32F), interp_mode, border_mode, dst); +} + + +Point cv::detail::PlaneWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, InputArray T, + int interp_mode, int border_mode, + cuda::GpuMat & dst) +{ + Rect dst_roi = buildMaps(src.size(), K, R, T, d_xmap_, d_ymap_); + dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); + cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); + return dst_roi.tl(); +} + +#ifdef HAVE_CUDA + +namespace cv { namespace cuda { namespace device +{ + namespace imgproc + { + void buildWarpSphericalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, + const float k_rinv[9], const float r_kinv[9], float scale, + cudaStream_t stream); + } +}}} + +static void buildWarpSphericalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, + OutputArray _map_x, OutputArray _map_y, Stream& stream = Stream::Null()) +{ + (void) src_size; + + Mat K = _K.getMat(); + Mat R = _R.getMat(); + + CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); + CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); + + Mat K_Rinv = K * R.t(); + Mat R_Kinv = R * K.inv(); + CV_Assert( K_Rinv.isContinuous() ); + CV_Assert( R_Kinv.isContinuous() ); + + _map_x.create(dst_roi.size(), CV_32FC1); + _map_y.create(dst_roi.size(), CV_32FC1); + + GpuMat map_x = _map_x.getGpuMat(); + GpuMat map_y = _map_y.getGpuMat(); + + device::imgproc::buildWarpSphericalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); +} + +#endif + +Rect cv::detail::SphericalWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap) +{ +#ifndef HAVE_CUDA + (void)src_size; + (void)K; + (void)R; + (void)xmap; + (void)ymap; + throw_no_cuda(); + return Rect(); +#else + projector_.setCameraParams(K, R); + + Point dst_tl, dst_br; + detectResultRoi(src_size, dst_tl, dst_br); + + ::buildWarpSphericalMaps(src_size, Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1)), + K, R, projector_.scale, xmap, ymap); + + return Rect(dst_tl, dst_br); +#endif +} + +Point cv::detail::SphericalWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, + int interp_mode, int border_mode, + cuda::GpuMat & dst) +{ + Rect dst_roi = buildMaps(src.size(), K, R, d_xmap_, d_ymap_); + dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); + cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); + return dst_roi.tl(); +} + +#ifdef HAVE_CUDA + +namespace cv { namespace cuda { namespace device +{ + namespace imgproc + { + void buildWarpCylindricalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, + const float k_rinv[9], const float r_kinv[9], float scale, + cudaStream_t stream); + } +}}} + +static void buildWarpCylindricalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, + OutputArray _map_x, OutputArray _map_y, Stream& stream = Stream::Null()) +{ + (void) src_size; + + Mat K = _K.getMat(); + Mat R = _R.getMat(); + + CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); + CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); + + Mat K_Rinv = K * R.t(); + Mat R_Kinv = R * K.inv(); + CV_Assert( K_Rinv.isContinuous() ); + CV_Assert( R_Kinv.isContinuous() ); + + _map_x.create(dst_roi.size(), CV_32FC1); + _map_y.create(dst_roi.size(), CV_32FC1); + + GpuMat map_x = _map_x.getGpuMat(); + GpuMat map_y = _map_y.getGpuMat(); + + device::imgproc::buildWarpCylindricalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); +} + +#endif + +Rect cv::detail::CylindricalWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, + cuda::GpuMat & xmap, cuda::GpuMat & ymap) +{ +#ifndef HAVE_CUDA + (void)src_size; + (void)K; + (void)R; + (void)xmap; + (void)ymap; + throw_no_cuda(); + return Rect(); +#else + projector_.setCameraParams(K, R); + + Point dst_tl, dst_br; + detectResultRoi(src_size, dst_tl, dst_br); + + ::buildWarpCylindricalMaps(src_size, Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1)), + K, R, projector_.scale, xmap, ymap); + + return Rect(dst_tl, dst_br); +#endif +} + +Point cv::detail::CylindricalWarperGpu::warp(const cuda::GpuMat & src, InputArray K, InputArray R, + int interp_mode, int border_mode, + cuda::GpuMat & dst) +{ + Rect dst_roi = buildMaps(src.size(), K, R, d_xmap_, d_ymap_); + dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); + cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); + return dst_roi.tl(); +} From 1421e306fb9498b9039e92c55e9df989779a8ec7 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Wed, 24 Dec 2014 17:24:38 +0300 Subject: [PATCH 3/4] fix compilation without CUDA --- modules/stitching/src/warpers_cuda.cpp | 183 +++++++++++++------------ 1 file changed, 99 insertions(+), 84 deletions(-) diff --git a/modules/stitching/src/warpers_cuda.cpp b/modules/stitching/src/warpers_cuda.cpp index 0593e6d9e..d1fe8739b 100644 --- a/modules/stitching/src/warpers_cuda.cpp +++ b/modules/stitching/src/warpers_cuda.cpp @@ -46,12 +46,6 @@ using namespace cv; using namespace cv::cuda; -Rect cv::detail::PlaneWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, - cuda::GpuMat & xmap, cuda::GpuMat & ymap) -{ - return buildMaps(src_size, K, R, Mat::zeros(3, 1, CV_32F), xmap, ymap); -} - #ifdef HAVE_CUDA namespace cv { namespace cuda { namespace device @@ -61,6 +55,14 @@ namespace cv { namespace cuda { namespace device void buildWarpPlaneMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, const float k_rinv[9], const float r_kinv[9], const float t[3], float scale, cudaStream_t stream); + + void buildWarpSphericalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, + const float k_rinv[9], const float r_kinv[9], float scale, + cudaStream_t stream); + + void buildWarpCylindricalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, + const float k_rinv[9], const float r_kinv[9], float scale, + cudaStream_t stream); } }}} @@ -92,8 +94,64 @@ static void buildWarpPlaneMaps(Size src_size, Rect dst_roi, InputArray _K, Input T.ptr(), scale, StreamAccessor::getStream(stream)); } +static void buildWarpSphericalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, + OutputArray _map_x, OutputArray _map_y, Stream& stream = Stream::Null()) +{ + (void) src_size; + + Mat K = _K.getMat(); + Mat R = _R.getMat(); + + CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); + CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); + + Mat K_Rinv = K * R.t(); + Mat R_Kinv = R * K.inv(); + CV_Assert( K_Rinv.isContinuous() ); + CV_Assert( R_Kinv.isContinuous() ); + + _map_x.create(dst_roi.size(), CV_32FC1); + _map_y.create(dst_roi.size(), CV_32FC1); + + GpuMat map_x = _map_x.getGpuMat(); + GpuMat map_y = _map_y.getGpuMat(); + + device::imgproc::buildWarpSphericalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); +} + +static void buildWarpCylindricalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, + OutputArray _map_x, OutputArray _map_y, Stream& stream = Stream::Null()) +{ + (void) src_size; + + Mat K = _K.getMat(); + Mat R = _R.getMat(); + + CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); + CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); + + Mat K_Rinv = K * R.t(); + Mat R_Kinv = R * K.inv(); + CV_Assert( K_Rinv.isContinuous() ); + CV_Assert( R_Kinv.isContinuous() ); + + _map_x.create(dst_roi.size(), CV_32FC1); + _map_y.create(dst_roi.size(), CV_32FC1); + + GpuMat map_x = _map_x.getGpuMat(); + GpuMat map_y = _map_y.getGpuMat(); + + device::imgproc::buildWarpCylindricalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); +} + #endif +Rect cv::detail::PlaneWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, + cuda::GpuMat & xmap, cuda::GpuMat & ymap) +{ + return buildMaps(src_size, K, R, Mat::zeros(3, 1, CV_32F), xmap, ymap); +} + Rect cv::detail::PlaneWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, InputArray T, cuda::GpuMat & xmap, cuda::GpuMat & ymap) { @@ -131,50 +189,23 @@ Point cv::detail::PlaneWarperGpu::warp(const cuda::GpuMat & src, InputArray K, I int interp_mode, int border_mode, cuda::GpuMat & dst) { +#ifndef HAVE_OPENCV_CUDAWARPING + (void)src; + (void)K; + (void)R; + (void)T; + (void)interp_mode; + (void)border_mode; + (void)dst; + throw_no_cuda(); + return Point(); +#else Rect dst_roi = buildMaps(src.size(), K, R, T, d_xmap_, d_ymap_); dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); return dst_roi.tl(); -} - -#ifdef HAVE_CUDA - -namespace cv { namespace cuda { namespace device -{ - namespace imgproc - { - void buildWarpSphericalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, - const float k_rinv[9], const float r_kinv[9], float scale, - cudaStream_t stream); - } -}}} - -static void buildWarpSphericalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, - OutputArray _map_x, OutputArray _map_y, Stream& stream = Stream::Null()) -{ - (void) src_size; - - Mat K = _K.getMat(); - Mat R = _R.getMat(); - - CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); - CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); - - Mat K_Rinv = K * R.t(); - Mat R_Kinv = R * K.inv(); - CV_Assert( K_Rinv.isContinuous() ); - CV_Assert( R_Kinv.isContinuous() ); - - _map_x.create(dst_roi.size(), CV_32FC1); - _map_y.create(dst_roi.size(), CV_32FC1); - - GpuMat map_x = _map_x.getGpuMat(); - GpuMat map_y = _map_y.getGpuMat(); - - device::imgproc::buildWarpSphericalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); -} - #endif +} Rect cv::detail::SphericalWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap) { @@ -203,50 +234,23 @@ Point cv::detail::SphericalWarperGpu::warp(const cuda::GpuMat & src, InputArray int interp_mode, int border_mode, cuda::GpuMat & dst) { +#ifndef HAVE_OPENCV_CUDAWARPING + (void)src; + (void)K; + (void)R; + (void)interp_mode; + (void)border_mode; + (void)dst; + throw_no_cuda(); + return Point(); +#else Rect dst_roi = buildMaps(src.size(), K, R, d_xmap_, d_ymap_); dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); return dst_roi.tl(); -} - -#ifdef HAVE_CUDA - -namespace cv { namespace cuda { namespace device -{ - namespace imgproc - { - void buildWarpCylindricalMaps(int tl_u, int tl_v, PtrStepSzf map_x, PtrStepSzf map_y, - const float k_rinv[9], const float r_kinv[9], float scale, - cudaStream_t stream); - } -}}} - -static void buildWarpCylindricalMaps(Size src_size, Rect dst_roi, InputArray _K, InputArray _R, float scale, - OutputArray _map_x, OutputArray _map_y, Stream& stream = Stream::Null()) -{ - (void) src_size; - - Mat K = _K.getMat(); - Mat R = _R.getMat(); - - CV_Assert( K.size() == Size(3,3) && K.type() == CV_32FC1 ); - CV_Assert( R.size() == Size(3,3) && R.type() == CV_32FC1 ); - - Mat K_Rinv = K * R.t(); - Mat R_Kinv = R * K.inv(); - CV_Assert( K_Rinv.isContinuous() ); - CV_Assert( R_Kinv.isContinuous() ); - - _map_x.create(dst_roi.size(), CV_32FC1); - _map_y.create(dst_roi.size(), CV_32FC1); - - GpuMat map_x = _map_x.getGpuMat(); - GpuMat map_y = _map_y.getGpuMat(); - - device::imgproc::buildWarpCylindricalMaps(dst_roi.tl().x, dst_roi.tl().y, map_x, map_y, K_Rinv.ptr(), R_Kinv.ptr(), scale, StreamAccessor::getStream(stream)); -} - #endif +} + Rect cv::detail::CylindricalWarperGpu::buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap) @@ -276,8 +280,19 @@ Point cv::detail::CylindricalWarperGpu::warp(const cuda::GpuMat & src, InputArra int interp_mode, int border_mode, cuda::GpuMat & dst) { +#ifndef HAVE_OPENCV_CUDAWARPING + (void)src; + (void)K; + (void)R; + (void)interp_mode; + (void)border_mode; + (void)dst; + throw_no_cuda(); + return Point(); +#else Rect dst_roi = buildMaps(src.size(), K, R, d_xmap_, d_ymap_); dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); cuda::remap(src, dst, d_xmap_, d_ymap_, interp_mode, border_mode); return dst_roi.tl(); +#endif } From a524a677e45e90a925d9edf5cc8e7efde3e70e19 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 15 Jan 2015 17:20:35 +0300 Subject: [PATCH 4/4] disable warnings caused by CUDA headers --- modules/stitching/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/stitching/CMakeLists.txt b/modules/stitching/CMakeLists.txt index 8d11491be..36d4452c7 100644 --- a/modules/stitching/CMakeLists.txt +++ b/modules/stitching/CMakeLists.txt @@ -1,7 +1,7 @@ set(the_description "Images stitching") if(HAVE_CUDA) - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations) + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations -Wshadow) endif() ocv_define_module(stitching opencv_imgproc opencv_features2d opencv_calib3d opencv_objdetect