mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
Merge pull request #5340 from alalek:ocl_off
This commit is contained in:
@@ -142,8 +142,9 @@ public:
|
||||
fCT = defaultfCT2;
|
||||
nShadowDetection = defaultnShadowDetection2;
|
||||
fTau = defaultfTau;
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
opencl_ON = true;
|
||||
#endif
|
||||
}
|
||||
//! the full constructor that takes the length of the history,
|
||||
// the number of gaussian mixtures, the background ratio parameter and the noise strength
|
||||
@@ -168,8 +169,9 @@ public:
|
||||
nShadowDetection = defaultnShadowDetection2;
|
||||
fTau = defaultfTau;
|
||||
name_ = "BackgroundSubtractor.MOG2";
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
opencl_ON = true;
|
||||
#endif
|
||||
}
|
||||
//! the destructor
|
||||
~BackgroundSubtractorMOG2Impl() {}
|
||||
@@ -190,6 +192,7 @@ public:
|
||||
CV_Assert( nchannels <= CV_CN_MAX );
|
||||
CV_Assert( nmixtures <= 255);
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
if (ocl::useOpenCL() && opencl_ON)
|
||||
{
|
||||
create_ocl_apply_kernel();
|
||||
@@ -218,6 +221,7 @@ public:
|
||||
u_bgmodelUsedModes.setTo(cv::Scalar::all(0));
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// for each gaussian mixture of each pixel bg model we store ...
|
||||
// the mixture weight (w),
|
||||
@@ -263,11 +267,13 @@ public:
|
||||
if ((bShadowDetection && detectshadows) || (!bShadowDetection && !detectshadows))
|
||||
return;
|
||||
bShadowDetection = detectshadows;
|
||||
#ifdef HAVE_OPENCL
|
||||
if (!kernel_apply.empty())
|
||||
{
|
||||
create_ocl_apply_kernel();
|
||||
CV_Assert( !kernel_apply.empty() );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual int getShadowValue() const { return nShadowDetection; }
|
||||
@@ -316,6 +322,7 @@ protected:
|
||||
Mat bgmodel;
|
||||
Mat bgmodelUsedModes;//keep track of number of modes per pixel
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
//for OCL
|
||||
|
||||
mutable bool opencl_ON;
|
||||
@@ -327,6 +334,7 @@ protected:
|
||||
|
||||
mutable ocl::Kernel kernel_apply;
|
||||
mutable ocl::Kernel kernel_getBg;
|
||||
#endif
|
||||
|
||||
int nframes;
|
||||
int history;
|
||||
@@ -379,9 +387,11 @@ protected:
|
||||
|
||||
String name_;
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
bool ocl_getBackgroundImage(OutputArray backgroundImage) const;
|
||||
bool ocl_apply(InputArray _image, OutputArray _fgmask, double learningRate=-1);
|
||||
void create_ocl_apply_kernel();
|
||||
#endif
|
||||
};
|
||||
|
||||
struct GaussBGStatModel2Params
|
||||
@@ -810,8 +820,6 @@ bool BackgroundSubtractorMOG2Impl::ocl_getBackgroundImage(OutputArray _backgroun
|
||||
return kernel_getBg.run(2, globalsize, NULL, false);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void BackgroundSubtractorMOG2Impl::create_ocl_apply_kernel()
|
||||
{
|
||||
int nchannels = CV_MAT_CN(frameType);
|
||||
@@ -819,6 +827,8 @@ void BackgroundSubtractorMOG2Impl::create_ocl_apply_kernel()
|
||||
kernel_apply.create("mog2_kernel", ocl::video::bgfg_mog2_oclsrc, opts);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void BackgroundSubtractorMOG2Impl::apply(InputArray _image, OutputArray _fgmask, double learningRate)
|
||||
{
|
||||
bool needToInitialize = nframes == 0 || learningRate >= 1 || _image.size() != frameSize || _image.type() != frameType;
|
||||
@@ -826,6 +836,7 @@ void BackgroundSubtractorMOG2Impl::apply(InputArray _image, OutputArray _fgmask,
|
||||
if( needToInitialize )
|
||||
initialize(_image.size(), _image.type());
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
if (opencl_ON)
|
||||
{
|
||||
CV_OCL_RUN(opencl_ON, ocl_apply(_image, _fgmask, learningRate))
|
||||
@@ -833,6 +844,7 @@ void BackgroundSubtractorMOG2Impl::apply(InputArray _image, OutputArray _fgmask,
|
||||
opencl_ON = false;
|
||||
initialize(_image.size(), _image.type());
|
||||
}
|
||||
#endif
|
||||
|
||||
Mat image = _image.getMat();
|
||||
_fgmask.create( image.size(), CV_8U );
|
||||
@@ -856,6 +868,7 @@ void BackgroundSubtractorMOG2Impl::apply(InputArray _image, OutputArray _fgmask,
|
||||
|
||||
void BackgroundSubtractorMOG2Impl::getBackgroundImage(OutputArray backgroundImage) const
|
||||
{
|
||||
#ifdef HAVE_OPENCL
|
||||
if (opencl_ON)
|
||||
{
|
||||
CV_OCL_RUN(opencl_ON, ocl_getBackgroundImage(backgroundImage))
|
||||
@@ -863,6 +876,7 @@ void BackgroundSubtractorMOG2Impl::getBackgroundImage(OutputArray backgroundImag
|
||||
opencl_ON = false;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
int nchannels = CV_MAT_CN(frameType);
|
||||
CV_Assert(nchannels == 1 || nchannels == 3);
|
||||
|
||||
@@ -837,6 +837,7 @@ int cv::buildOpticalFlowPyramid(InputArray _img, OutputArrayOfArrays pyramid, Si
|
||||
return maxLevel;
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
namespace cv
|
||||
{
|
||||
class PyrLKOpticalFlow
|
||||
@@ -1084,6 +1085,7 @@ namespace cv
|
||||
return opticalFlow.sparse(_prevImg.getUMat(), _nextImg.getUMat(), _prevPts.getUMat(), umatNextPts, umatStatus, umatErr);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
void cv::calcOpticalFlowPyrLK( InputArray _prevImg, InputArray _nextImg,
|
||||
InputArray _prevPts, InputOutputArray _nextPts,
|
||||
@@ -1092,6 +1094,7 @@ void cv::calcOpticalFlowPyrLK( InputArray _prevImg, InputArray _nextImg,
|
||||
TermCriteria criteria,
|
||||
int flags, double minEigThreshold )
|
||||
{
|
||||
#ifdef HAVE_OPENCL
|
||||
bool use_opencl = ocl::useOpenCL() &&
|
||||
(_prevImg.isUMat() || _nextImg.isUMat()) &&
|
||||
ocl::Image2D::isFormatSupported(CV_32F, 1, false);
|
||||
@@ -1100,6 +1103,7 @@ void cv::calcOpticalFlowPyrLK( InputArray _prevImg, InputArray _nextImg,
|
||||
CV_IMPL_ADD(CV_IMPL_OCL);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
Mat prevPtsMat = _prevPts.getMat();
|
||||
const int derivDepth = DataType<cv::detail::deriv_type>::depth;
|
||||
|
||||
@@ -583,6 +583,7 @@ FarnebackUpdateFlow_GaussianBlur( const Mat& _R0, const Mat& _R1,
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
namespace cv
|
||||
{
|
||||
class FarnebackOpticalFlow
|
||||
@@ -1074,17 +1075,20 @@ static bool ocl_calcOpticalFlowFarneback( InputArray _prev0, InputArray _next0,
|
||||
return true;
|
||||
}
|
||||
}
|
||||
#endif // HAVE_OPENCL
|
||||
|
||||
void cv::calcOpticalFlowFarneback( InputArray _prev0, InputArray _next0,
|
||||
InputOutputArray _flow0, double pyr_scale, int levels, int winsize,
|
||||
int iterations, int poly_n, double poly_sigma, int flags )
|
||||
{
|
||||
#ifdef HAVE_OPENCL
|
||||
bool use_opencl = ocl::useOpenCL() && _flow0.isUMat();
|
||||
if( use_opencl && ocl_calcOpticalFlowFarneback(_prev0, _next0, _flow0, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags))
|
||||
{
|
||||
CV_IMPL_ADD(CV_IMPL_OCL);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
Mat prev0 = _prev0.getMat(), next0 = _next0.getMat();
|
||||
const int min_size = 32;
|
||||
|
||||
@@ -122,11 +122,13 @@ protected:
|
||||
int medianFiltering;
|
||||
|
||||
private:
|
||||
void procOneScale(const Mat_<float>& I0, const Mat_<float>& I1, Mat_<float>& u1, Mat_<float>& u2, Mat_<float>& u3);
|
||||
void procOneScale(const Mat_<float>& I0, const Mat_<float>& I1, Mat_<float>& u1, Mat_<float>& u2, Mat_<float>& u3);
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
bool procOneScale_ocl(const UMat& I0, const UMat& I1, UMat& u1, UMat& u2);
|
||||
|
||||
bool calc_ocl(InputArray I0, InputArray I1, InputOutputArray flow);
|
||||
#endif
|
||||
struct dataMat
|
||||
{
|
||||
std::vector<Mat_<float> > I0s;
|
||||
@@ -170,6 +172,8 @@ private:
|
||||
Mat_<float> u3x_buf;
|
||||
Mat_<float> u3y_buf;
|
||||
} dm;
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
struct dataUMat
|
||||
{
|
||||
std::vector<UMat> I0s;
|
||||
@@ -195,8 +199,10 @@ private:
|
||||
UMat diff_buf;
|
||||
UMat norm_buf;
|
||||
} dum;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
namespace cv_ocl_tvl1flow
|
||||
{
|
||||
bool centeredGradient(const UMat &src, UMat &dx, UMat &dy);
|
||||
@@ -353,6 +359,7 @@ bool cv_ocl_tvl1flow::estimateDualVariables(UMat &u1, UMat &u2,
|
||||
return kernel.run(2, globalsize, NULL, false);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
OpticalFlowDual_TVL1::OpticalFlowDual_TVL1()
|
||||
{
|
||||
@@ -499,6 +506,7 @@ void OpticalFlowDual_TVL1::calc(InputArray _I0, InputArray _I1, InputOutputArray
|
||||
merge(uxy, 2, _flow);
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
bool OpticalFlowDual_TVL1::calc_ocl(InputArray _I0, InputArray _I1, InputOutputArray _flow)
|
||||
{
|
||||
UMat I0 = _I0.getUMat();
|
||||
@@ -598,6 +606,7 @@ bool OpticalFlowDual_TVL1::calc_ocl(InputArray _I0, InputArray _I1, InputOutputA
|
||||
merge(uxy, _flow);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// buildFlowMap
|
||||
@@ -1180,6 +1189,7 @@ void estimateDualVariables(const Mat_<float>& u1x, const Mat_<float>& u1y,
|
||||
parallel_for_(Range(0, u1x.rows), body);
|
||||
}
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
bool OpticalFlowDual_TVL1::procOneScale_ocl(const UMat& I0, const UMat& I1, UMat& u1, UMat& u2)
|
||||
{
|
||||
using namespace cv_ocl_tvl1flow;
|
||||
@@ -1267,6 +1277,7 @@ bool OpticalFlowDual_TVL1::procOneScale_ocl(const UMat& I0, const UMat& I1, UMat
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
void OpticalFlowDual_TVL1::procOneScale(const Mat_<float>& I0, const Mat_<float>& I1, Mat_<float>& u1, Mat_<float>& u2, Mat_<float>& u3)
|
||||
{
|
||||
@@ -1402,6 +1413,7 @@ void OpticalFlowDual_TVL1::collectGarbage()
|
||||
dm.u2x_buf.release();
|
||||
dm.u2y_buf.release();
|
||||
|
||||
#ifdef HAVE_OPENCL
|
||||
//dataUMat structure dum
|
||||
dum.I0s.clear();
|
||||
dum.I1s.clear();
|
||||
@@ -1425,6 +1437,7 @@ void OpticalFlowDual_TVL1::collectGarbage()
|
||||
|
||||
dum.diff_buf.release();
|
||||
dum.norm_buf.release();
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user