diff --git a/modules/ocl/include/opencv2/ocl/matrix_operations.hpp b/modules/ocl/include/opencv2/ocl/matrix_operations.hpp index 4b617ce07..fcd847cb6 100644 --- a/modules/ocl/include/opencv2/ocl/matrix_operations.hpp +++ b/modules/ocl/include/opencv2/ocl/matrix_operations.hpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, 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, @@ -48,9 +49,32 @@ namespace cv namespace ocl { - ////////////////////////////////////OpenCL kernel strings////////////////////////// - //extern const char *convertC3C4; + enum + { + MAT_ADD = 1, + MAT_SUB, + MAT_MUL, + MAT_DIV, + MAT_NOT, + MAT_AND, + MAT_OR, + MAT_XOR + }; + + class CV_EXPORTS oclMatExpr + { + public: + oclMatExpr() : a(oclMat()), b(oclMat()), op(0) {} + oclMatExpr(const oclMat& _a, const oclMat& _b, int _op) + : a(_a), b(_b), op(_op) {} + operator oclMat() const; + void assign(oclMat& m) const; + + protected: + oclMat a, b; + int op; + }; //////////////////////////////////////////////////////////////////////// //////////////////////////////// oclMat //////////////////////////////// //////////////////////////////////////////////////////////////////////// @@ -237,6 +261,12 @@ namespace cv return *this; } + inline oclMat& oclMat::operator = (const oclMatExpr& expr) + { + expr.assign(*this); + return *this; + } + /* Fixme! To be supported in OpenCL later. */ #if 0 template inline oclMat::operator DevMem2D_() const diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index ed672fe0e..bd31c170d 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -125,6 +125,7 @@ namespace cv Impl *impl; }; + class CV_EXPORTS oclMatExpr; //////////////////////////////// oclMat //////////////////////////////// class CV_EXPORTS oclMat { @@ -158,7 +159,7 @@ namespace cv oclMat &operator = (const oclMat &m); //! assignment operator. Perfom blocking upload to device. oclMat &operator = (const Mat &m); - + oclMat &operator = (const oclMatExpr& expr); //! pefroms blocking upload data to oclMat. void upload(const cv::Mat &m); @@ -225,6 +226,11 @@ namespace cv oclMat operator()( Range rowRange, Range colRange ) const; oclMat operator()( const Rect &roi ) const; + oclMat& operator+=( const oclMat& m ); + oclMat& operator-=( const oclMat& m ); + oclMat& operator*=( const oclMat& m ); + oclMat& operator/=( const oclMat& m ); + //! returns true if the oclMatrix data is continuous // (i.e. when there are no gaps between successive rows). // similar to CV_IS_oclMat_CONT(cvoclMat->type) @@ -297,6 +303,7 @@ namespace cv int wholecols; }; + ///////////////////// mat split and merge ///////////////////////////////// //! Compose a multi-channel array from several single-channel arrays // Support all types @@ -460,18 +467,23 @@ namespace cv // supports all types CV_EXPORTS void bitwise_xor(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask = oclMat()); CV_EXPORTS void bitwise_xor(const oclMat &src1, const Scalar &s, oclMat &dst, const oclMat &mask = oclMat()); - //! computes convolution of two images - - //! support only CV_32FC1 type - - CV_EXPORTS void convolve(const oclMat &image, const oclMat &temp1, oclMat &result); - //! Logical operators - CV_EXPORTS oclMat operator ~ (const oclMat &src); - CV_EXPORTS oclMat operator | (const oclMat &src1, const oclMat &src2); - CV_EXPORTS oclMat operator & (const oclMat &src1, const oclMat &src2); - CV_EXPORTS oclMat operator ^ (const oclMat &src1, const oclMat &src2); + CV_EXPORTS oclMatExpr operator ~ (const oclMat &src); + CV_EXPORTS oclMatExpr operator | (const oclMat &src1, const oclMat &src2); + CV_EXPORTS oclMatExpr operator & (const oclMat &src1, const oclMat &src2); + CV_EXPORTS oclMatExpr operator ^ (const oclMat &src1, const oclMat &src2); + + //! Mathematics operators + CV_EXPORTS oclMatExpr operator + (const oclMat &src1, const oclMat &src2); + CV_EXPORTS oclMatExpr operator - (const oclMat &src1, const oclMat &src2); + CV_EXPORTS oclMatExpr operator * (const oclMat &src1, const oclMat &src2); + CV_EXPORTS oclMatExpr operator / (const oclMat &src1, const oclMat &src2); + + //! computes convolution of two images + //! support only CV_32FC1 type + CV_EXPORTS void convolve(const oclMat &image, const oclMat &temp1, oclMat &result); + CV_EXPORTS void cvtColor(const oclMat &src, oclMat &dst, int code , int dcn = 0); //////////////////////////////// Filter Engine //////////////////////////////// diff --git a/modules/ocl/src/arithm.cpp b/modules/ocl/src/arithm.cpp index e9e82b94c..099d07980 100644 --- a/modules/ocl/src/arithm.cpp +++ b/modules/ocl/src/arithm.cpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors @@ -2124,32 +2125,82 @@ void cv::ocl::bitwise_xor(const oclMat &src1, const Scalar &src2, oclMat &dst, c bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_xor_scalar); } -cv::ocl::oclMat cv::ocl::operator ~ (const oclMat &src) +oclMatExpr cv::ocl::operator ~ (const oclMat &src) { - oclMat dst; - bitwise_not(src, dst); - return dst; + return oclMatExpr(src, oclMat(), MAT_NOT); } -cv::ocl::oclMat cv::ocl::operator | (const oclMat &src1, const oclMat &src2) +oclMatExpr cv::ocl::operator | (const oclMat &src1, const oclMat &src2) { - oclMat dst; - bitwise_or(src1, src2, dst); - return dst; + return oclMatExpr(src1, src2, MAT_OR); } -cv::ocl::oclMat cv::ocl::operator & (const oclMat &src1, const oclMat &src2) +oclMatExpr cv::ocl::operator & (const oclMat &src1, const oclMat &src2) { - oclMat dst; - bitwise_and(src1, src2, dst); - return dst; + return oclMatExpr(src1, src2, MAT_AND); } -cv::ocl::oclMat cv::ocl::operator ^ (const oclMat &src1, const oclMat &src2) +oclMatExpr cv::ocl::operator ^ (const oclMat &src1, const oclMat &src2) { - oclMat dst; - bitwise_xor(src1, src2, dst); - return dst; + return oclMatExpr(src1, src2, MAT_XOR); +} + +cv::ocl::oclMatExpr cv::ocl::operator + (const oclMat &src1, const oclMat &src2) +{ + return oclMatExpr(src1, src2, cv::ocl::MAT_ADD); +} + +cv::ocl::oclMatExpr cv::ocl::operator - (const oclMat &src1, const oclMat &src2) +{ + return oclMatExpr(src1, src2, cv::ocl::MAT_SUB); +} + +cv::ocl::oclMatExpr cv::ocl::operator * (const oclMat &src1, const oclMat &src2) +{ + return oclMatExpr(src1, src2, cv::ocl::MAT_MUL); +} + +cv::ocl::oclMatExpr cv::ocl::operator / (const oclMat &src1, const oclMat &src2) +{ + return oclMatExpr(src1, src2, cv::ocl::MAT_DIV); +} + +void oclMatExpr::assign(oclMat& m) const +{ + switch (op) + { + case MAT_ADD: + add(a, b, m); + break; + case MAT_SUB: + subtract(a, b, m); + break; + case MAT_MUL: + multiply(a, b, m); + break; + case MAT_DIV: + divide(a, b, m); + break; + case MAT_NOT: + bitwise_not(a, m); + break; + case MAT_AND: + bitwise_and(a, b, m); + break; + case MAT_OR: + bitwise_or(a, b, m); + break; + case MAT_XOR: + bitwise_xor(a, b, m); + break; + } +} + +oclMatExpr::operator oclMat() const +{ + oclMat m; + assign(m); + return m; } ////////////////////////////////////////////////////////////////////////////// diff --git a/modules/ocl/src/matrix_operations.cpp b/modules/ocl/src/matrix_operations.cpp index b2b8b5ff2..7b90218d9 100644 --- a/modules/ocl/src/matrix_operations.cpp +++ b/modules/ocl/src/matrix_operations.cpp @@ -12,10 +12,12 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors // Niko Li, newlife20080214@gmail.com +// Yao Wang, bitwangyaoyao@gmail.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -1020,4 +1022,27 @@ void cv::ocl::oclMat::release() refcount = 0; } +oclMat& cv::ocl::oclMat::operator+=( const oclMat& m ) +{ + add(*this, m, *this); + return *this; +} + +oclMat& cv::ocl::oclMat::operator-=( const oclMat& m ) +{ + subtract(*this, m, *this); + return *this; +} + +oclMat& cv::ocl::oclMat::operator*=( const oclMat& m ) +{ + multiply(*this, m, *this); + return *this; +} + +oclMat& cv::ocl::oclMat::operator/=( const oclMat& m ) +{ + divide(*this, m, *this); + return *this; +} #endif /* !defined (HAVE_OPENCL) */