diff --git a/modules/optflow/include/opencv2/optflow/pcaflow.hpp b/modules/optflow/include/opencv2/optflow/pcaflow.hpp index 34372d4df..b8aeab8e2 100644 --- a/modules/optflow/include/opencv2/optflow/pcaflow.hpp +++ b/modules/optflow/include/opencv2/optflow/pcaflow.hpp @@ -100,6 +100,7 @@ protected: const float occlusionsThreshold; const float dampingFactor; const float claheClip; + bool useOpenCL; public: OpticalFlowPCAFlow( Ptr _prior = Ptr(), const Size _basisSize = Size( 18, 14 ), diff --git a/modules/optflow/samples/optical_flow_evaluation.cpp b/modules/optflow/samples/optical_flow_evaluation.cpp index 2a5c7b3bc..cdd641f77 100644 --- a/modules/optflow/samples/optical_flow_evaluation.cpp +++ b/modules/optflow/samples/optical_flow_evaluation.cpp @@ -283,7 +283,12 @@ int main( int argc, char** argv ) double startTick, time; startTick = (double) getTickCount(); // measure time - algorithm->calc(i1, i2, flow); + + if (useGpu) + algorithm->calc(i1, i2, flow.getUMat(ACCESS_RW)); + else + algorithm->calc(i1, i2, flow); + time = ((double) getTickCount() - startTick) / getTickFrequency(); printf("\nTime [s]: %.3f\n", time); if(display_images) diff --git a/modules/optflow/src/pcaflow.cpp b/modules/optflow/src/pcaflow.cpp index 8a34bd006..c46200368 100644 --- a/modules/optflow/src/pcaflow.cpp +++ b/modules/optflow/src/pcaflow.cpp @@ -321,7 +321,7 @@ void OpticalFlowPCAFlow::getSystem( OutputArray AOut, OutputArray b1Out, OutputA AOut.create( features.size(), basisSize.area(), CV_32F ); b1Out.create( features.size(), 1, CV_32F ); b2Out.create( features.size(), 1, CV_32F ); - if ( ocl::useOpenCL() ) + if ( useOpenCL ) { UMat A = AOut.getUMat(); Mat b1 = b1Out.getMat(); @@ -369,7 +369,7 @@ void OpticalFlowPCAFlow::getSystem( OutputArray A1Out, OutputArray A2Out, Output b1Out.create( features.size() + prior->getPadding(), 1, CV_32F ); b2Out.create( features.size() + prior->getPadding(), 1, CV_32F ); - if ( ocl::useOpenCL() ) + if ( useOpenCL ) { UMat A = A1Out.getUMat(); Mat b1 = b1Out.getMat(); @@ -444,6 +444,7 @@ void OpticalFlowPCAFlow::calc( InputArray I0, InputArray I1, InputOutputArray fl CV_Assert( to.channels() == 1 ); const Mat fromOrig = from.getMat( ACCESS_READ ).clone(); + useOpenCL = flowOut.isUMat() && ocl::useOpenCL(); applyCLAHE( from, claheClip ); applyCLAHE( to, claheClip ); @@ -481,7 +482,7 @@ OpticalFlowPCAFlow::OpticalFlowPCAFlow( Ptr _prior, const Size _ float _dampingFactor, float _claheClip ) : prior( _prior ), basisSize( _basisSize ), sparseRate( _sparseRate ), retainedCornersFraction( _retainedCornersFraction ), occlusionsThreshold( _occlusionsThreshold ), - dampingFactor( _dampingFactor ), claheClip( _claheClip ) + dampingFactor( _dampingFactor ), claheClip( _claheClip ), useOpenCL( false ) { CV_Assert( sparseRate > 0 && sparseRate <= 0.1 ); CV_Assert( retainedCornersFraction >= 0 && retainedCornersFraction <= 1.0 );