diff --git a/modules/gpuimgproc/include/opencv2/gpuimgproc.hpp b/modules/gpuimgproc/include/opencv2/gpuimgproc.hpp index 2fd17d9b35..24b8b64f0a 100644 --- a/modules/gpuimgproc/include/opencv2/gpuimgproc.hpp +++ b/modules/gpuimgproc/include/opencv2/gpuimgproc.hpp @@ -409,17 +409,17 @@ CV_EXPORTS Ptr createGoodFeaturesToTrackDetector(int srcType, i ///////////////////////////// Mean Shift ////////////////////////////// //! Does mean shift filtering on GPU. -CV_EXPORTS void meanShiftFiltering(const GpuMat& src, GpuMat& dst, int sp, int sr, +CV_EXPORTS void meanShiftFiltering(InputArray src, OutputArray dst, int sp, int sr, TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1), Stream& stream = Stream::Null()); //! Does mean shift procedure on GPU. -CV_EXPORTS void meanShiftProc(const GpuMat& src, GpuMat& dstr, GpuMat& dstsp, int sp, int sr, +CV_EXPORTS void meanShiftProc(InputArray src, OutputArray dstr, OutputArray dstsp, int sp, int sr, TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1), Stream& stream = Stream::Null()); //! Does mean shift segmentation with elimination of small regions. -CV_EXPORTS void meanShiftSegmentation(const GpuMat& src, Mat& dst, int sp, int sr, int minsize, +CV_EXPORTS void meanShiftSegmentation(InputArray src, OutputArray dst, int sp, int sr, int minsize, TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, 1)); /////////////////////////// Match Template //////////////////////////// diff --git a/modules/gpuimgproc/src/mean_shift.cpp b/modules/gpuimgproc/src/mean_shift.cpp index e30f95bf98..26368ca5ac 100644 --- a/modules/gpuimgproc/src/mean_shift.cpp +++ b/modules/gpuimgproc/src/mean_shift.cpp @@ -47,13 +47,13 @@ using namespace cv::gpu; #if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) -void cv::gpu::meanShiftFiltering(const GpuMat&, GpuMat&, int, int, TermCriteria, Stream&) { throw_no_cuda(); } -void cv::gpu::meanShiftProc(const GpuMat&, GpuMat&, GpuMat&, int, int, TermCriteria, Stream&) { throw_no_cuda(); } +void cv::gpu::meanShiftFiltering(InputArray, OutputArray, int, int, TermCriteria, Stream&) { throw_no_cuda(); } +void cv::gpu::meanShiftProc(InputArray, OutputArray, OutputArray, int, int, TermCriteria, Stream&) { throw_no_cuda(); } #else /* !defined (HAVE_CUDA) */ //////////////////////////////////////////////////////////////////////// -// meanShiftFiltering_GPU +// meanShiftFiltering namespace cv { namespace gpu { namespace cudev { @@ -63,27 +63,26 @@ namespace cv { namespace gpu { namespace cudev } }}} -void cv::gpu::meanShiftFiltering(const GpuMat& src, GpuMat& dst, int sp, int sr, TermCriteria criteria, Stream& stream) +void cv::gpu::meanShiftFiltering(InputArray _src, OutputArray _dst, int sp, int sr, TermCriteria criteria, Stream& stream) { using namespace ::cv::gpu::cudev::imgproc; - if( src.empty() ) - CV_Error( cv::Error::StsBadArg, "The input image is empty" ); + GpuMat src = _src.getGpuMat(); - if( src.depth() != CV_8U || src.channels() != 4 ) - CV_Error( cv::Error::StsUnsupportedFormat, "Only 8-bit, 4-channel images are supported" ); + CV_Assert( src.type() == CV_8UC4 ); - dst.create( src.size(), CV_8UC4 ); + _dst.create(src.size(), CV_8UC4); + GpuMat dst = _dst.getGpuMat(); - if( !(criteria.type & TermCriteria::MAX_ITER) ) + if (!(criteria.type & TermCriteria::MAX_ITER)) criteria.maxCount = 5; int maxIter = std::min(std::max(criteria.maxCount, 1), 100); - float eps; - if( !(criteria.type & TermCriteria::EPS) ) - eps = 1.f; - eps = (float)std::max(criteria.epsilon, 0.0); + if (!(criteria.type & TermCriteria::EPS)) + criteria.epsilon = 1.f; + + float eps = (float) std::max(criteria.epsilon, 0.0); meanShiftFiltering_gpu(src, dst, sp, sr, maxIter, eps, StreamAccessor::getStream(stream)); } @@ -99,28 +98,29 @@ namespace cv { namespace gpu { namespace cudev } }}} -void cv::gpu::meanShiftProc(const GpuMat& src, GpuMat& dstr, GpuMat& dstsp, int sp, int sr, TermCriteria criteria, Stream& stream) +void cv::gpu::meanShiftProc(InputArray _src, OutputArray _dstr, OutputArray _dstsp, int sp, int sr, TermCriteria criteria, Stream& stream) { using namespace ::cv::gpu::cudev::imgproc; - if( src.empty() ) - CV_Error( cv::Error::StsBadArg, "The input image is empty" ); + GpuMat src = _src.getGpuMat(); + + CV_Assert( src.type() == CV_8UC4 ); - if( src.depth() != CV_8U || src.channels() != 4 ) - CV_Error( cv::Error::StsUnsupportedFormat, "Only 8-bit, 4-channel images are supported" ); + _dstr.create(src.size(), CV_8UC4); + _dstsp.create(src.size(), CV_16SC2); - dstr.create( src.size(), CV_8UC4 ); - dstsp.create( src.size(), CV_16SC2 ); + GpuMat dstr = _dstr.getGpuMat(); + GpuMat dstsp = _dstsp.getGpuMat(); - if( !(criteria.type & TermCriteria::MAX_ITER) ) + if (!(criteria.type & TermCriteria::MAX_ITER)) criteria.maxCount = 5; int maxIter = std::min(std::max(criteria.maxCount, 1), 100); - float eps; - if( !(criteria.type & TermCriteria::EPS) ) - eps = 1.f; - eps = (float)std::max(criteria.epsilon, 0.0); + if (!(criteria.type & TermCriteria::EPS)) + criteria.epsilon = 1.f; + + float eps = (float) std::max(criteria.epsilon, 0.0); meanShiftProc_gpu(src, dstr, dstsp, sp, sr, maxIter, eps, StreamAccessor::getStream(stream)); } diff --git a/modules/gpuimgproc/src/mssegmentation.cpp b/modules/gpuimgproc/src/mssegmentation.cpp index 7f02168e1a..ec1c5feb4b 100644 --- a/modules/gpuimgproc/src/mssegmentation.cpp +++ b/modules/gpuimgproc/src/mssegmentation.cpp @@ -43,7 +43,7 @@ #if !defined HAVE_CUDA || defined(CUDA_DISABLER) -void cv::gpu::meanShiftSegmentation(const GpuMat&, Mat&, int, int, int, TermCriteria) { throw_no_cuda(); } +void cv::gpu::meanShiftSegmentation(InputArray, OutputArray, int, int, int, TermCriteria) { throw_no_cuda(); } #else @@ -222,9 +222,12 @@ inline int dist2(const cv::Vec2s& lhs, const cv::Vec2s& rhs) } // anonymous namespace -void cv::gpu::meanShiftSegmentation(const GpuMat& src, Mat& dst, int sp, int sr, int minsize, TermCriteria criteria) +void cv::gpu::meanShiftSegmentation(InputArray _src, OutputArray _dst, int sp, int sr, int minsize, TermCriteria criteria) { - CV_Assert(src.type() == CV_8UC4); + GpuMat src = _src.getGpuMat(); + + CV_Assert( src.type() == CV_8UC4 ); + const int nrows = src.rows; const int ncols = src.cols; const int hr = sr; @@ -232,7 +235,7 @@ void cv::gpu::meanShiftSegmentation(const GpuMat& src, Mat& dst, int sp, int sr, // Perform mean shift procedure and obtain region and spatial maps GpuMat d_rmap, d_spmap; - meanShiftProc(src, d_rmap, d_spmap, sp, sr, criteria); + gpu::meanShiftProc(src, d_rmap, d_spmap, sp, sr, criteria); Mat rmap(d_rmap); Mat spmap(d_spmap); @@ -337,7 +340,7 @@ void cv::gpu::meanShiftSegmentation(const GpuMat& src, Mat& dst, int sp, int sr, } // Sort all graph's edges connecting differnet components (in asceding order) - sort(edges.begin(), edges.end()); + std::sort(edges.begin(), edges.end()); // Exclude small components (starting from the nearest couple) for (size_t i = 0; i < edges.size(); ++i) @@ -366,7 +369,8 @@ void cv::gpu::meanShiftSegmentation(const GpuMat& src, Mat& dst, int sp, int sr, } // Create final image, color of each segment is the average color of its pixels - dst.create(src.size(), src.type()); + _dst.create(src.size(), src.type()); + Mat dst = _dst.getMat(); for (int y = 0; y < nrows; ++y) {