Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
9ec96597
Commit
9ec96597
authored
Aug 09, 2012
by
Vladislav Vinogradov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gpu version of GMG Background Subtractor
parent
0ceb9b6a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
211 additions
and
0 deletions
+211
-0
gpu.hpp
modules/gpu/include/opencv2/gpu/gpu.hpp
+65
-0
bgfg_gmg.cpp
modules/gpu/src/bgfg_gmg.cpp
+146
-0
bgfg_gmg.cu
modules/gpu/src/cuda/bgfg_gmg.cu
+0
-0
No files found.
modules/gpu/include/opencv2/gpu/gpu.hpp
View file @
9ec96597
...
...
@@ -2127,6 +2127,71 @@ private:
GpuMat
samples_
;
};
/**
* Background Subtractor module. Takes a series of images and returns a sequence of mask (8UC1)
* images of the same size, where 255 indicates Foreground and 0 represents Background.
* This class implements an algorithm described in "Visual Tracking of Human Visitors under
* Variable-Lighting Conditions for a Responsive Audio Art Installation," A. Godbehere,
* A. Matsukawa, K. Goldberg, American Control Conference, Montreal, June 2012.
*/
class
CV_EXPORTS
GMG_GPU
{
public
:
GMG_GPU
();
/**
* Validate parameters and set up data structures for appropriate frame size.
* @param frameSize Input frame size
* @param min Minimum value taken on by pixels in image sequence. Usually 0
* @param max Maximum value taken on by pixels in image sequence. e.g. 1.0 or 255
*/
void
initialize
(
Size
frameSize
,
float
min
=
0.0
f
,
float
max
=
255.0
f
);
/**
* Performs single-frame background subtraction and builds up a statistical background image
* model.
* @param frame Input frame
* @param fgmask Output mask image representing foreground and background pixels
* @param stream Stream for the asynchronous version
*/
void
operator
()(
const
GpuMat
&
frame
,
GpuMat
&
fgmask
,
float
learningRate
=
-
1.0
f
,
Stream
&
stream
=
Stream
::
Null
());
//! Total number of distinct colors to maintain in histogram.
int
maxFeatures
;
//! Set between 0.0 and 1.0, determines how quickly features are "forgotten" from histograms.
float
learningRate
;
//! Number of frames of video to use to initialize histograms.
int
numInitializationFrames
;
//! Number of discrete levels in each channel to be used in histograms.
int
quantizationLevels
;
//! Prior probability that any given pixel is a background pixel. A sensitivity parameter.
float
backgroundPrior
;
//! value above which pixel is determined to be FG.
float
decisionThreshold
;
//! smoothing radius, in pixels, for cleaning up FG image.
int
smoothingRadius
;
private
:
float
maxVal_
,
minVal_
;
Size
frameSize_
;
int
frameNum_
;
GpuMat
nfeatures_
;
GpuMat
colors_
;
GpuMat
weights_
;
Ptr
<
FilterEngine_GPU
>
boxFilter_
;
GpuMat
buf_
;
};
////////////////////////////////// Video Encoding //////////////////////////////////
// Works only under Windows
...
...
modules/gpu/src/bgfg_gmg.cpp
0 → 100644
View file @
9ec96597
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "precomp.hpp"
#ifndef HAVE_CUDA
cv
::
gpu
::
GMG_GPU
::
GMG_GPU
()
{
throw_nogpu
();
}
void
cv
::
gpu
::
GMG_GPU
::
initialize
(
cv
::
Size
,
float
,
float
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
GMG_GPU
::
operator
()(
const
cv
::
gpu
::
GpuMat
&
,
cv
::
gpu
::
GpuMat
&
,
float
,
cv
::
gpu
::
Stream
&
)
{
throw_nogpu
();
}
#else
namespace
cv
{
namespace
gpu
{
namespace
device
{
namespace
bgfg_gmg
{
void
loadConstants
(
int
width
,
int
height
,
float
minVal
,
float
maxVal
,
int
quantizationLevels
,
float
backgroundPrior
,
float
decisionThreshold
,
int
maxFeatures
,
int
numInitializationFrames
);
template
<
typename
SrcT
>
void
update_gpu
(
DevMem2Db
frame
,
PtrStepb
fgmask
,
DevMem2Di
colors
,
PtrStepf
weights
,
PtrStepi
nfeatures
,
int
frameNum
,
float
learningRate
,
cudaStream_t
stream
);
}
}}}
cv
::
gpu
::
GMG_GPU
::
GMG_GPU
()
{
maxFeatures
=
64
;
learningRate
=
0.025
f
;
numInitializationFrames
=
120
;
quantizationLevels
=
16
;
backgroundPrior
=
0.8
f
;
decisionThreshold
=
0.8
f
;
smoothingRadius
=
7
;
}
void
cv
::
gpu
::
GMG_GPU
::
initialize
(
cv
::
Size
frameSize
,
float
min
,
float
max
)
{
using
namespace
cv
::
gpu
::
device
::
bgfg_gmg
;
CV_Assert
(
min
<
max
);
CV_Assert
(
maxFeatures
>
0
);
CV_Assert
(
learningRate
>=
0.0
f
&&
learningRate
<=
1.0
f
);
CV_Assert
(
numInitializationFrames
>=
1
);
CV_Assert
(
quantizationLevels
>=
1
&&
quantizationLevels
<=
255
);
CV_Assert
(
backgroundPrior
>=
0.0
f
&&
backgroundPrior
<=
1.0
f
);
minVal_
=
min
;
maxVal_
=
max
;
frameSize_
=
frameSize
;
frameNum_
=
0
;
nfeatures_
.
create
(
frameSize_
,
CV_32SC1
);
colors_
.
create
(
maxFeatures
*
frameSize_
.
height
,
frameSize_
.
width
,
CV_32SC1
);
weights_
.
create
(
maxFeatures
*
frameSize_
.
height
,
frameSize_
.
width
,
CV_32FC1
);
nfeatures_
.
setTo
(
cv
::
Scalar
::
all
(
0
));
boxFilter_
=
cv
::
gpu
::
createBoxFilter_GPU
(
CV_8UC1
,
CV_8UC1
,
cv
::
Size
(
smoothingRadius
,
smoothingRadius
));
loadConstants
(
frameSize_
.
width
,
frameSize_
.
height
,
minVal_
,
maxVal_
,
quantizationLevels
,
backgroundPrior
,
decisionThreshold
,
maxFeatures
,
numInitializationFrames
);
}
void
cv
::
gpu
::
GMG_GPU
::
operator
()(
const
cv
::
gpu
::
GpuMat
&
frame
,
cv
::
gpu
::
GpuMat
&
fgmask
,
float
newLearningRate
,
cv
::
gpu
::
Stream
&
stream
)
{
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
);
static
const
func_t
funcs
[
6
][
4
]
=
{
{
update_gpu
<
uchar
>
,
0
,
update_gpu
<
uchar3
>
,
update_gpu
<
uchar4
>
},
{
0
,
0
,
0
,
0
},
{
update_gpu
<
ushort
>
,
0
,
update_gpu
<
ushort3
>
,
update_gpu
<
ushort4
>
},
{
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
},
{
update_gpu
<
float
>
,
0
,
update_gpu
<
float3
>
,
update_gpu
<
float4
>
}
};
CV_Assert
(
frame
.
depth
()
==
CV_8U
||
frame
.
depth
()
==
CV_16U
||
frame
.
depth
()
==
CV_32F
);
CV_Assert
(
frame
.
channels
()
==
1
||
frame
.
channels
()
==
3
||
frame
.
channels
()
==
4
);
if
(
newLearningRate
!=
-
1.0
f
)
{
CV_Assert
(
newLearningRate
>=
0.0
f
&&
newLearningRate
<=
1.0
f
);
learningRate
=
newLearningRate
;
}
if
(
frame
.
size
()
!=
frameSize_
)
initialize
(
frame
.
size
(),
0.0
f
,
frame
.
depth
()
==
CV_8U
?
255.0
f
:
frame
.
depth
()
==
CV_16U
?
std
::
numeric_limits
<
ushort
>::
max
()
:
1.0
f
);
fgmask
.
create
(
frameSize_
,
CV_8UC1
);
funcs
[
frame
.
depth
()][
frame
.
channels
()
-
1
](
frame
,
fgmask
,
colors_
,
weights_
,
nfeatures_
,
frameNum_
,
learningRate
,
cv
::
gpu
::
StreamAccessor
::
getStream
(
stream
));
// medianBlur
boxFilter_
->
apply
(
fgmask
,
buf_
,
cv
::
Rect
(
0
,
0
,
-
1
,
-
1
),
stream
);
int
minCount
=
(
smoothingRadius
*
smoothingRadius
+
1
)
/
2
;
double
thresh
=
255.0
*
minCount
/
(
smoothingRadius
*
smoothingRadius
);
cv
::
gpu
::
threshold
(
buf_
,
fgmask
,
thresh
,
255.0
,
cv
::
THRESH_BINARY
,
stream
);
// keep track of how many frames we have processed
++
frameNum_
;
}
#endif
modules/gpu/src/cuda/bgfg_gmg.cu
0 → 100644
View file @
9ec96597
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment