diff --git a/modules/imgproc/src/histogram.cpp b/modules/imgproc/src/histogram.cpp index 61fc09820f7725ec530039fb5c35451051be03e7..7f46bc2d0329665ad05acd4d0160fa14cadbfc66 100644 --- a/modules/imgproc/src/histogram.cpp +++ b/modules/imgproc/src/histogram.cpp @@ -42,6 +42,12 @@ #include "precomp.hpp" #include "opencl_kernels_imgproc.hpp" +#ifdef HAVE_OPENVX +#define IVX_USE_OPENCV +#define IVX_HIDE_INFO_WARNINGS +#include "ivx.hpp" +#endif + namespace cv { @@ -3700,6 +3706,45 @@ static bool ocl_equalizeHist(InputArray _src, OutputArray _dst) #endif +#ifdef HAVE_OPENVX +namespace cv +{ +static bool openvx_equalize_hist(Mat srcMat, Mat dstMat) +{ + using namespace ivx; + + try + { + Context context = Context::create(); + Image srcImage = Image::createFromHandle(context, Image::matTypeToFormat(srcMat.type()), + Image::createAddressing(srcMat), srcMat.data); + Image dstImage = Image::createFromHandle(context, Image::matTypeToFormat(dstMat.type()), + Image::createAddressing(dstMat), dstMat.data); + + IVX_CHECK_STATUS(vxuEqualizeHist(context, srcImage, dstImage)); + +#ifdef VX_VERSION_1_1 + //we should take user memory back before release + //(it's not done automatically according to standard) + srcImage.swapHandle(); dstImage.swapHandle(); +#endif + } + catch (RuntimeError & e) + { + CV_Error(CV_StsInternal, e.what()); + return false; + } + catch (WrapperError & e) + { + CV_Error(CV_StsInternal, e.what()); + return false; + } + + return true; +} +} +#endif + void cv::equalizeHist( InputArray _src, OutputArray _dst ) { CV_INSTRUMENT_REGION() @@ -3716,6 +3761,13 @@ void cv::equalizeHist( InputArray _src, OutputArray _dst ) _dst.create( src.size(), src.type() ); Mat dst = _dst.getMat(); +#ifdef HAVE_OPENVX + if(openvx_equalize_hist(src, dst)) + { + return; + } +#endif + Mutex histogramLockInstance; const int hist_sz = EqualizeHistCalcHist_Invoker::HIST_SZ;