From 60e572bbcf5dcae7b4ff38d2e0a6fa38007932e1 Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev Date: Tue, 28 Sep 2010 08:45:44 +0000 Subject: [PATCH] fixed gpu morphology: now kernel in gpu is passed to npp functions. warnings in cxcore added graphcut wrapper --- modules/core/src/matop.cpp | 20 ++++---- modules/gpu/include/opencv2/gpu/gpu.hpp | 6 +++ modules/gpu/src/filtering_npp.cpp | 9 ++-- modules/gpu/src/graphcuts.cpp | 83 +++++++++++++++++++++++++++++++++ tests/gpu/src/morf_filters.cpp | 6 +-- 5 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 modules/gpu/src/graphcuts.cpp diff --git a/modules/core/src/matop.cpp b/modules/core/src/matop.cpp index f249992..6406eba 100644 --- a/modules/core/src/matop.cpp +++ b/modules/core/src/matop.cpp @@ -57,7 +57,7 @@ public: MatOp_Identity() {} virtual ~MatOp_Identity() {} - bool elementWise(const MatExpr& expr) const { return true; } + bool elementWise(const MatExpr& /*expr*/) const { return true; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; static void makeExpr(MatExpr& res, const Mat& m); @@ -71,7 +71,7 @@ public: MatOp_AddEx() {} virtual ~MatOp_AddEx() {} - bool elementWise(const MatExpr& expr) const { return true; } + bool elementWise(const MatExpr& /*expr*/) const { return true; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; void add(const MatExpr& e1, const Scalar& s, MatExpr& res) const; @@ -93,7 +93,7 @@ public: MatOp_Bin() {} virtual ~MatOp_Bin() {} - bool elementWise(const MatExpr& expr) const { return true; } + bool elementWise(const MatExpr& /*expr*/) const { return true; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; void multiply(const MatExpr& e1, double s, MatExpr& res) const; @@ -111,7 +111,7 @@ public: MatOp_Cmp() {} virtual ~MatOp_Cmp() {} - bool elementWise(const MatExpr& expr) const { return true; } + bool elementWise(const MatExpr& /*expr*/) const { return true; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; static void makeExpr(MatExpr& res, int cmpop, const Mat& a, const Mat& b); @@ -126,7 +126,7 @@ public: MatOp_GEMM() {} virtual ~MatOp_GEMM() {} - bool elementWise(const MatExpr& expr) const { return false; } + bool elementWise(const MatExpr& /*expr*/) const { return false; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; void add(const MatExpr& e1, const MatExpr& e2, MatExpr& res) const; @@ -147,7 +147,7 @@ public: MatOp_Invert() {} virtual ~MatOp_Invert() {} - bool elementWise(const MatExpr& expr) const { return false; } + bool elementWise(const MatExpr& /*expr*/) const { return false; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; void matmul(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const; @@ -163,7 +163,7 @@ public: MatOp_T() {} virtual ~MatOp_T() {} - bool elementWise(const MatExpr& expr) const { return false; } + bool elementWise(const MatExpr& /*expr*/) const { return false; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; void multiply(const MatExpr& e1, double s, MatExpr& res) const; @@ -180,7 +180,7 @@ public: MatOp_Solve() {} virtual ~MatOp_Solve() {} - bool elementWise(const MatExpr& expr) const { return false; } + bool elementWise(const MatExpr& /*expr*/) const { return false; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; static void makeExpr(MatExpr& res, int method, const Mat& a, const Mat& b); @@ -194,7 +194,7 @@ public: MatOp_Initializer() {} virtual ~MatOp_Initializer() {} - bool elementWise(const MatExpr& expr) const { return false; } + bool elementWise(const MatExpr& /*expr*/) const { return false; } void assign(const MatExpr& expr, Mat& m, int type=-1) const; void multiply(const MatExpr& e, double s, MatExpr& res) const; @@ -217,7 +217,7 @@ static inline bool isInitializer(const MatExpr& e) { return e.op == &g_MatOp_Ini ///////////////////////////////////////////////////////////////////////////////////////////////////// -bool MatOp::elementWise(const MatExpr& expr) const +bool MatOp::elementWise(const MatExpr& /*expr*/) const { return false; } diff --git a/modules/gpu/include/opencv2/gpu/gpu.hpp b/modules/gpu/include/opencv2/gpu/gpu.hpp index 314a8c2..8c9614d 100644 --- a/modules/gpu/include/opencv2/gpu/gpu.hpp +++ b/modules/gpu/include/opencv2/gpu/gpu.hpp @@ -533,6 +533,12 @@ namespace cv //! applies an advanced morphological operation to the image CV_EXPORTS void morphologyEx( const GpuMat& src, GpuMat& dst, int op, const Mat& kernel, Point anchor, int iterations); + + //////////////////////////////// Image Labeling //////////////////////////////// + + //!performs labeling via graph cuts + CV_EXPORTS void graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTransp, GpuMat& top, GpuMat& bottom, GpuMat& labels, GpuMat& buf); + //////////////////////////////// StereoBM_GPU //////////////////////////////// class CV_EXPORTS StereoBM_GPU diff --git a/modules/gpu/src/filtering_npp.cpp b/modules/gpu/src/filtering_npp.cpp index e8163d4..8ceb44e 100644 --- a/modules/gpu/src/filtering_npp.cpp +++ b/modules/gpu/src/filtering_npp.cpp @@ -62,11 +62,14 @@ namespace void morphoogy_caller(npp_morf_func func, const GpuMat& src, GpuMat& dst, const Mat& kernel, Point anchor, int iterations) { CV_Assert(src.type() == CV_8U || src.type() == CV_8UC4); - CV_Assert(kernel.isContinuous() && kernel.type() == CV_8U && (kernel.cols & 1) != 0 && (kernel.rows & 1) != 0); + CV_Assert(kernel.type() == CV_8U && (kernel.cols & 1) != 0 && (kernel.rows & 1) != 0); // in NPP for Cuda 3.1 only such anchor is supported. CV_Assert(anchor.x == kernel.cols/2 && anchor.y == kernel.rows/2); - + + const Mat& cont_krnl = (kernel.isContinuous() ? kernel : kernel.clone()).reshape(1, 1); + GpuMat gpu_krnl(cont_krnl); + NppiSize sz; sz.width = src.cols; sz.height = src.rows; @@ -82,7 +85,7 @@ namespace dst.create(src.size(), src.type()); for(int i = 0; i < iterations; ++i) - nppSafeCall( func(src.ptr(), src.step, dst.ptr(), dst.step, sz, kernel.ptr(), mask_sz, anc) ); + nppSafeCall( func(src.ptr(), src.step, dst.ptr(), dst.step, sz, gpu_krnl.ptr(), mask_sz, anc) ); } } diff --git a/modules/gpu/src/graphcuts.cpp b/modules/gpu/src/graphcuts.cpp new file mode 100644 index 0000000..6b29af1 --- /dev/null +++ b/modules/gpu/src/graphcuts.cpp @@ -0,0 +1,83 @@ +/*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 GpuMaterials 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 bpied warranties, including, but not limited to, the bpied +// 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" + +#if !defined (HAVE_CUDA) + +void cv::gpu::graphcut(GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&) { throw_nogpu(); } + +#else /* !defined (HAVE_CUDA) */ + +void cv::gpu::graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTransp, GpuMat& top, GpuMat& bottom, GpuMat& labels, GpuMat& buf) +{ + CV_Assert(leftTransp.type() == CV_32S && rightTransp.type() == CV_32S); + CV_Assert(terminals.type() == CV_32S && bottom.type() == CV_32S && top.type() == CV_32S); + CV_Assert(terminals.size() == leftTransp.size()); + CV_Assert(terminals.size() == rightTransp.size()); + CV_Assert(terminals.size() == top.size() && terminals.size() == bottom.size()); + CV_Assert(top.step == bottom.step && top.step == terminals.step && rightTransp.step == leftTransp.step); + + labels.create(terminals.size(), CV_8U); + + NppiSize sznpp; + sznpp.width = terminals.cols; + sznpp.height = terminals.rows; + + int bufsz; + nppSafeCall( nppiGraphcutGetSize(sznpp, &bufsz) ); + + if ((size_t)bufsz > buf.cols * buf.rows * buf.elemSize()) + buf.create(1, bufsz, CV_8U); + + nppSafeCall( nppiGraphcut_32s8u(terminals.ptr(), leftTransp.ptr(), rightTransp.ptr(), top.ptr(), bottom.ptr(), + terminals.step, leftTransp.step, sznpp, labels.ptr(), labels.step, buf.ptr()) ); +} + + +#endif /* !defined (HAVE_CUDA) */ + + + + + + diff --git a/tests/gpu/src/morf_filters.cpp b/tests/gpu/src/morf_filters.cpp index 617430a..1f5c5a7 100644 --- a/tests/gpu/src/morf_filters.cpp +++ b/tests/gpu/src/morf_filters.cpp @@ -133,7 +133,7 @@ public: protected: virtual int test(const Mat& img) { - Mat kernel(3, 3, CV_8U, Scalar(1)); + GpuMat kernel(Mat::ones(3, 3, CV_8U)); Point anchor(1,1); int iters = 3; @@ -157,7 +157,7 @@ public: protected: virtual int test(const Mat& img) { - Mat kernel(3, 3, CV_8U, Scalar(1)); + GpuMat kernel(Mat::ones(3, 3, CV_8U)); Point anchor(1,1); int iters = 3; @@ -185,7 +185,7 @@ protected: const char *names[] = { "MORPH_OPEN", "CV_MOP_CLOSE", "CV_MOP_GRADIENT", "CV_MOP_TOPHAT", "CV_MOP_BLACKHAT"}; int num = sizeof(ops)/sizeof(ops[0]); - Mat kernel(3, 3, CV_8U, Scalar(1)); + GpuMat kernel(Mat::ones(3, 3, CV_8U)); Point anchor(1,1); int iters = 3; -- 2.7.4