From 1ecf491373db7066571eeb5c40ebd5fb9716f15d Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 9 Aug 2012 14:46:27 +0400 Subject: [PATCH] added updateBackgroundModel parameter --- modules/gpu/include/opencv2/gpu/gpu.hpp | 9 +++-- modules/gpu/src/bgfg_gmg.cpp | 8 +++-- modules/gpu/src/cuda/bgfg_gmg.cu | 45 ++++++++++++++----------- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/modules/gpu/include/opencv2/gpu/gpu.hpp b/modules/gpu/include/opencv2/gpu/gpu.hpp index c6b9371238..ca9ad89889 100644 --- a/modules/gpu/include/opencv2/gpu/gpu.hpp +++ b/modules/gpu/include/opencv2/gpu/gpu.hpp @@ -2156,7 +2156,7 @@ public: */ void operator ()(const GpuMat& frame, GpuMat& fgmask, float learningRate = -1.0f, Stream& stream = Stream::Null()); - //! releases all inner buffers + //! Releases all inner buffers void release(); //! Total number of distinct colors to maintain in histogram. @@ -2174,12 +2174,15 @@ public: //! Prior probability that any given pixel is a background pixel. A sensitivity parameter. float backgroundPrior; - //! value above which pixel is determined to be FG. + //! Value above which pixel is determined to be FG. float decisionThreshold; - //! smoothing radius, in pixels, for cleaning up FG image. + //! Smoothing radius, in pixels, for cleaning up FG image. int smoothingRadius; + //! Perform background model update. + bool updateBackgroundModel; + private: float maxVal_, minVal_; diff --git a/modules/gpu/src/bgfg_gmg.cpp b/modules/gpu/src/bgfg_gmg.cpp index 8dae99fb17..6e0ed9e631 100644 --- a/modules/gpu/src/bgfg_gmg.cpp +++ b/modules/gpu/src/bgfg_gmg.cpp @@ -58,7 +58,8 @@ namespace cv { namespace gpu { namespace device { float decisionThreshold, int maxFeatures, int numInitializationFrames); template - void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); + void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, + int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); } }}} @@ -71,6 +72,7 @@ cv::gpu::GMG_GPU::GMG_GPU() backgroundPrior = 0.8f; decisionThreshold = 0.8f; smoothingRadius = 7; + updateBackgroundModel = true; } void cv::gpu::GMG_GPU::initialize(cv::Size frameSize, float min, float max) @@ -108,7 +110,7 @@ void cv::gpu::GMG_GPU::operator ()(const cv::gpu::GpuMat& frame, cv::gpu::GpuMat using namespace cv::gpu::device::bgfg_gmg; typedef void (*func_t)(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, - int frameNum, float learningRate, cudaStream_t stream); + int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); static const func_t funcs[6][4] = { {update_gpu, 0, update_gpu, update_gpu}, @@ -137,7 +139,7 @@ void cv::gpu::GMG_GPU::operator ()(const cv::gpu::GpuMat& frame, cv::gpu::GpuMat else fgmask.setTo(cv::Scalar::all(0)); - funcs[frame.depth()][frame.channels() - 1](frame, fgmask, colors_, weights_, nfeatures_, frameNum_, learningRate, cv::gpu::StreamAccessor::getStream(stream)); + funcs[frame.depth()][frame.channels() - 1](frame, fgmask, colors_, weights_, nfeatures_, frameNum_, learningRate, updateBackgroundModel, cv::gpu::StreamAccessor::getStream(stream)); // medianBlur if (smoothingRadius > 0) diff --git a/modules/gpu/src/cuda/bgfg_gmg.cu b/modules/gpu/src/cuda/bgfg_gmg.cu index 26a04bb09a..76ebb2da09 100644 --- a/modules/gpu/src/cuda/bgfg_gmg.cu +++ b/modules/gpu/src/cuda/bgfg_gmg.cu @@ -168,7 +168,8 @@ namespace cv { namespace gpu { namespace device { template struct Quantization : detail::Quantization::cn> {}; template - __global__ void update(const PtrStep_ frame, PtrStepb fgmask, PtrStepi colors_, PtrStepf weights_, PtrStepi nfeatures_, const int frameNum, const float learningRate) + __global__ void update(const PtrStep_ frame, PtrStepb fgmask, PtrStepi colors_, PtrStepf weights_, PtrStepi nfeatures_, + const int frameNum, const float learningRate, const bool updateBackgroundModel) { const int x = blockIdx.x * blockDim.x + threadIdx.x; const int y = blockIdx.y * blockDim.y + threadIdx.y; @@ -195,18 +196,21 @@ namespace cv { namespace gpu { namespace device { // update histogram. - for (int i = 0, fy = y; i < nfeatures; ++i, fy += c_height) - weights_(fy, x) *= 1.0f - learningRate; + if (updateBackgroundModel) + { + for (int i = 0, fy = y; i < nfeatures; ++i, fy += c_height) + weights_(fy, x) *= 1.0f - learningRate; - bool inserted = insertFeature(newFeatureColor, learningRate, colors_, weights_, x, y, nfeatures); + bool inserted = insertFeature(newFeatureColor, learningRate, colors_, weights_, x, y, nfeatures); - if (inserted) - { - normalizeHistogram(weights_, x, y, nfeatures); - nfeatures_(y, x) = nfeatures; + if (inserted) + { + normalizeHistogram(weights_, x, y, nfeatures); + nfeatures_(y, x) = nfeatures; + } } } - else + else if (updateBackgroundModel) { // training-mode update @@ -218,14 +222,15 @@ namespace cv { namespace gpu { namespace device { } template - void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream) + void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, + int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream) { const dim3 block(32, 8); const dim3 grid(divUp(frame.cols, block.x), divUp(frame.rows, block.y)); cudaSafeCall( cudaFuncSetCacheConfig(update, cudaFuncCachePreferL1) ); - update<<>>((DevMem2D_) frame, fgmask, colors, weights, nfeatures, frameNum, learningRate); + update<<>>((DevMem2D_) frame, fgmask, colors, weights, nfeatures, frameNum, learningRate, updateBackgroundModel); cudaSafeCall( cudaGetLastError() ); @@ -233,16 +238,16 @@ namespace cv { namespace gpu { namespace device { cudaSafeCall( cudaDeviceSynchronize() ); } - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); - template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); + template void update_gpu(DevMem2Db frame, PtrStepb fgmask, DevMem2Di colors, PtrStepf weights, PtrStepi nfeatures, int frameNum, float learningRate, bool updateBackgroundModel, cudaStream_t stream); } }}}