From fc8b385ff6c6e02fb3c696dda65c244878fdab0a Mon Sep 17 00:00:00 2001 From: vbystricky Date: Tue, 14 Jan 2014 17:53:28 +0400 Subject: [PATCH] Return false if ocl version not properly worked --- modules/video/src/optflowgf.cpp | 57 ++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/modules/video/src/optflowgf.cpp b/modules/video/src/optflowgf.cpp index 9d156e9..b237e54 100644 --- a/modules/video/src/optflowgf.cpp +++ b/modules/video/src/optflowgf.cpp @@ -605,7 +605,7 @@ public: double polySigma; int flags; - void operator ()(const UMat &frame0, const UMat &frame1, UMat &flowx, UMat &flowy) + bool operator ()(const UMat &frame0, const UMat &frame1, UMat &flowx, UMat &flowy) { CV_Assert(frame0.channels() == 1 && frame1.channels() == 1); CV_Assert(frame0.size() == frame1.size()); @@ -714,8 +714,10 @@ public: if (fastPyramids) { - polynomialExpansionOcl(pyramid0_[k], R[0]); - polynomialExpansionOcl(pyramid1_[k], R[1]); + if (!polynomialExpansionOcl(pyramid0_[k], R[0])) + return false; + if (!polynomialExpansionOcl(pyramid1_[k], R[1])) + return false; } else { @@ -734,22 +736,31 @@ public: for (int i = 0; i < 2; i++) { - gaussianBlurOcl(frames_[i], smoothSize/2, blurredFrame[i]); + if (!gaussianBlurOcl(frames_[i], smoothSize/2, blurredFrame[i])) + return false; resize(blurredFrame[i], pyrLevel[i], Size(width, height), INTER_LINEAR); - polynomialExpansionOcl(pyrLevel[i], R[i]); + if (!polynomialExpansionOcl(pyrLevel[i], R[i])) + return false; } } - updateMatricesOcl(curFlowX, curFlowY, R[0], R[1], M); + if (!updateMatricesOcl(curFlowX, curFlowY, R[0], R[1], M)) + return false; if (flags & OPTFLOW_FARNEBACK_GAUSSIAN) setGaussianBlurKernel(winSize, winSize/2*0.3f); for (int i = 0; i < numIters; i++) { if (flags & OPTFLOW_FARNEBACK_GAUSSIAN) - updateFlow_gaussianBlur(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1); + { + if (!updateFlow_gaussianBlur(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1)) + return false; + } else - updateFlow_boxFilter(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1); + { + if (!updateFlow_boxFilter(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1)) + return false; + } } prevFlowX = curFlowX; @@ -758,6 +769,7 @@ public: flowx = curFlowX; flowy = curFlowY; + return true; } void releaseMemory() @@ -884,7 +896,7 @@ private: size_t globalsize[2] = { DIVUP(src.cols, localsize[0] - 2*polyN) * localsize[0], src.rows}; const cv::ocl::Device &device = cv::ocl::Device::getDefault(); - int useDouble = (0 != device.doubleFPConfig()); + bool useDouble = (0 != device.doubleFPConfig()); cv::String build_options = cv::format("-D polyN=%d -D USE_DOUBLE=%d", polyN, useDouble ? 1 : 0); ocl::Kernel kernel; @@ -990,25 +1002,33 @@ private: return kernel.run(2, globalsize, localsize, false); } - void updateFlow_boxFilter( + bool updateFlow_boxFilter( const UMat& R0, const UMat& R1, UMat& flowx, UMat &flowy, UMat& M, UMat &bufM, int blockSize, bool updateMatrices) { - boxFilter5Ocl(M, blockSize/2, bufM); + if (!boxFilter5Ocl(M, blockSize/2, bufM)) + return false; swap(M, bufM); - updateFlowOcl(M, flowx, flowy); + if (!updateFlowOcl(M, flowx, flowy)) + return false; if (updateMatrices) - updateMatricesOcl(flowx, flowy, R0, R1, M); + if (!updateMatricesOcl(flowx, flowy, R0, R1, M)) + return false; + return true; } - void updateFlow_gaussianBlur( + bool updateFlow_gaussianBlur( const UMat& R0, const UMat& R1, UMat& flowx, UMat& flowy, UMat& M, UMat &bufM, int blockSize, bool updateMatrices) { - gaussianBlur5Ocl(M, blockSize/2, bufM); + if (!gaussianBlur5Ocl(M, blockSize/2, bufM)) + return false; swap(M, bufM); - updateFlowOcl(M, flowx, flowy); + if (!updateFlowOcl(M, flowx, flowy)) + return false; if (updateMatrices) - updateMatricesOcl(flowx, flowy, R0, R1, M); + if (!updateMatricesOcl(flowx, flowy, R0, R1, M)) + return false; + return true; } }; @@ -1043,7 +1063,8 @@ static bool ocl_calcOpticalFlowFarneback( InputArray _prev0, InputArray _next0, flowar.push_back(UMat()); flowar.push_back(UMat()); } - opticalFlow(_prev0.getUMat(), _next0.getUMat(), flowar[0], flowar[1]); + if (!opticalFlow(_prev0.getUMat(), _next0.getUMat(), flowar[0], flowar[1])) + return false; merge(flowar, _flow0); return true; } -- 2.7.4