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
acc031aa
Commit
acc031aa
authored
Jun 25, 2012
by
Vladislav Vinogradov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added MOG_GPU and MOG2_GPU (Gaussian Mixture background subtraction)
parent
d49c697f
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
952 additions
and
9 deletions
+952
-9
gpu.hpp
modules/gpu/include/opencv2/gpu/gpu.hpp
+128
-0
perf_video.cpp
modules/gpu/perf/perf_video.cpp
+185
-0
perf_video.cpp
modules/gpu/perf_cpu/perf_video.cpp
+163
-0
bgfg_mog.cpp
modules/gpu/src/bgfg_mog.cpp
+241
-0
bgfg_mog.cu
modules/gpu/src/cuda/bgfg_mog.cu
+0
-0
fgd_bgfg.cu
modules/gpu/src/cuda/fgd_bgfg.cu
+42
-0
test_video.cpp
modules/gpu/test/test_video.cpp
+193
-9
No files found.
modules/gpu/include/opencv2/gpu/gpu.hpp
View file @
acc031aa
...
...
@@ -1963,6 +1963,134 @@ private:
std
::
auto_ptr
<
Impl
>
impl_
;
};
/*!
Gaussian Mixture-based Backbround/Foreground Segmentation Algorithm
The class implements the following algorithm:
"An improved adaptive background mixture model for real-time tracking with shadow detection"
P. KadewTraKuPong and R. Bowden,
Proc. 2nd European Workshp on Advanced Video-Based Surveillance Systems, 2001."
http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf
*/
class
CV_EXPORTS
MOG_GPU
{
public
:
//! the default constructor
MOG_GPU
(
int
nmixtures
=
-
1
);
//! re-initiaization method
void
initialize
(
Size
frameSize
,
int
frameType
);
//! the update operator
void
operator
()(
const
GpuMat
&
frame
,
GpuMat
&
fgmask
,
float
learningRate
=
0.0
f
,
Stream
&
stream
=
Stream
::
Null
());
int
history
;
float
varThreshold
;
float
backgroundRatio
;
float
noiseSigma
;
private
:
int
nmixtures_
;
Size
frameSize_
;
int
nframes_
;
GpuMat
weight_
;
GpuMat
sortKey_
;
GpuMat
mean_
;
GpuMat
var_
;
};
/*!
The class implements the following algorithm:
"Improved adaptive Gausian mixture model for background subtraction"
Z.Zivkovic
International Conference Pattern Recognition, UK, August, 2004.
http://www.zoranz.net/Publications/zivkovic2004ICPR.pdf
*/
class
CV_EXPORTS
MOG2_GPU
{
public
:
//! the default constructor
MOG2_GPU
(
int
nmixtures
=
-
1
);
//! re-initiaization method
void
initialize
(
Size
frameSize
,
int
frameType
);
//! the update operator
void
operator
()(
const
GpuMat
&
frame
,
GpuMat
&
fgmask
,
float
learningRate
=
-
1.0
f
,
Stream
&
stream
=
Stream
::
Null
());
//! computes a background image which are the mean of all background gaussians
void
getBackgroundImage
(
GpuMat
&
backgroundImage
,
Stream
&
stream
=
Stream
::
Null
())
const
;
// parameters
// you should call initialize after parameters changes
int
history
;
//! here it is the maximum allowed number of mixture components.
//! Actual number is determined dynamically per pixel
float
varThreshold
;
// threshold on the squared Mahalanobis distance to decide if it is well described
// by the background model or not. Related to Cthr from the paper.
// This does not influence the update of the background. A typical value could be 4 sigma
// and that is varThreshold=4*4=16; Corresponds to Tb in the paper.
/////////////////////////
// less important parameters - things you might change but be carefull
////////////////////////
float
backgroundRatio
;
// corresponds to fTB=1-cf from the paper
// TB - threshold when the component becomes significant enough to be included into
// the background model. It is the TB=1-cf from the paper. So I use cf=0.1 => TB=0.
// For alpha=0.001 it means that the mode should exist for approximately 105 frames before
// it is considered foreground
// float noiseSigma;
float
varThresholdGen
;
//correspondts to Tg - threshold on the squared Mahalan. dist. to decide
//when a sample is close to the existing components. If it is not close
//to any a new component will be generated. I use 3 sigma => Tg=3*3=9.
//Smaller Tg leads to more generated components and higher Tg might make
//lead to small number of components but they can grow too large
float
fVarInit
;
float
fVarMin
;
float
fVarMax
;
//initial variance for the newly generated components.
//It will will influence the speed of adaptation. A good guess should be made.
//A simple way is to estimate the typical standard deviation from the images.
//I used here 10 as a reasonable value
// min and max can be used to further control the variance
float
fCT
;
//CT - complexity reduction prior
//this is related to the number of samples needed to accept that a component
//actually exists. We use CT=0.05 of all the samples. By setting CT=0 you get
//the standard Stauffer&Grimson algorithm (maybe not exact but very similar)
//shadow detection parameters
bool
bShadowDetection
;
//default 1 - do shadow detection
unsigned
char
nShadowDetection
;
//do shadow detection - insert this value as the detection result - 127 default value
float
fTau
;
// Tau - shadow threshold. The shadow is detected if the pixel is darker
//version of the background. Tau is a threshold on how much darker the shadow can be.
//Tau= 0.5 means that if pixel is more than 2 times darker then it is not shadow
//See: Prati,Mikic,Trivedi,Cucchiarra,"Detecting Moving Shadows...",IEEE PAMI,2003.
private
:
int
nmixtures_
;
Size
frameSize_
;
int
frameType_
;
int
nframes_
;
GpuMat
weight_
;
GpuMat
variance_
;
GpuMat
mean_
;
GpuMat
bgmodelUsedModes_
;
//keep track of number of modes per pixel
};
////////////////////////////////// Video Encoding //////////////////////////////////
// Works only under Windows
...
...
modules/gpu/perf/perf_video.cpp
View file @
acc031aa
...
...
@@ -331,6 +331,191 @@ INSTANTIATE_TEST_CASE_P(Video, FGDStatModel, testing::Combine(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
))));
//////////////////////////////////////////////////////
// MOG
IMPLEMENT_PARAM_CLASS
(
LearningRate
,
double
)
GPU_PERF_TEST
(
MOG
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
Channels
,
LearningRate
)
{
cv
::
gpu
::
DeviceInfo
devInfo
=
GET_PARAM
(
0
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
std
::
string
inputFile
=
perf
::
TestBase
::
getDataPath
(
std
::
string
(
"gpu/video/"
)
+
GET_PARAM
(
1
));
int
cn
=
GET_PARAM
(
2
);
double
learningRate
=
GET_PARAM
(
3
);
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cv
::
gpu
::
GpuMat
d_frame
;
cv
::
gpu
::
MOG_GPU
mog
;
cv
::
gpu
::
GpuMat
foreground
;
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
d_frame
.
upload
(
frame
);
mog
(
d_frame
,
foreground
,
learningRate
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
d_frame
.
upload
(
frame
);
startTimer
();
next
();
mog
(
d_frame
,
foreground
,
learningRate
);
stopTimer
();
}
}
INSTANTIATE_TEST_CASE_P
(
Video
,
MOG
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
)),
testing
::
Values
(
Channels
(
1
),
Channels
(
3
),
Channels
(
4
)),
testing
::
Values
(
LearningRate
(
0.0
),
LearningRate
(
0.01
))));
//////////////////////////////////////////////////////
// MOG2
GPU_PERF_TEST
(
MOG2_update
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
Channels
)
{
cv
::
gpu
::
DeviceInfo
devInfo
=
GET_PARAM
(
0
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
std
::
string
inputFile
=
perf
::
TestBase
::
getDataPath
(
std
::
string
(
"gpu/video/"
)
+
GET_PARAM
(
1
));
int
cn
=
GET_PARAM
(
2
);
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cv
::
gpu
::
GpuMat
d_frame
;
cv
::
gpu
::
MOG2_GPU
mog2
;
cv
::
gpu
::
GpuMat
foreground
;
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
d_frame
.
upload
(
frame
);
mog2
(
d_frame
,
foreground
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
d_frame
.
upload
(
frame
);
startTimer
();
next
();
mog2
(
d_frame
,
foreground
);
stopTimer
();
}
}
INSTANTIATE_TEST_CASE_P
(
Video
,
MOG2_update
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
)),
testing
::
Values
(
Channels
(
1
),
Channels
(
3
),
Channels
(
4
))));
GPU_PERF_TEST
(
MOG2_getBackgroundImage
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
Channels
)
{
cv
::
gpu
::
DeviceInfo
devInfo
=
GET_PARAM
(
0
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
std
::
string
inputFile
=
perf
::
TestBase
::
getDataPath
(
std
::
string
(
"gpu/video/"
)
+
GET_PARAM
(
1
));
int
cn
=
GET_PARAM
(
2
);
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cv
::
gpu
::
GpuMat
d_frame
;
cv
::
gpu
::
MOG2_GPU
mog2
;
cv
::
gpu
::
GpuMat
foreground
;
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
d_frame
.
upload
(
frame
);
mog2
(
d_frame
,
foreground
);
}
cv
::
gpu
::
GpuMat
background
;
mog2
.
getBackgroundImage
(
background
);
TEST_CYCLE
()
{
mog2
.
getBackgroundImage
(
background
);
}
}
INSTANTIATE_TEST_CASE_P
(
Video
,
MOG2_getBackgroundImage
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
)),
testing
::
Values
(
Channels
(
1
),
Channels
(
3
),
Channels
(
4
))));
//////////////////////////////////////////////////////
// VideoWriter
...
...
modules/gpu/perf_cpu/perf_video.cpp
View file @
acc031aa
...
...
@@ -165,6 +165,169 @@ INSTANTIATE_TEST_CASE_P(Video, FGDStatModel, testing::Combine(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
))));
//////////////////////////////////////////////////////
// MOG
IMPLEMENT_PARAM_CLASS
(
LearningRate
,
double
)
GPU_PERF_TEST
(
MOG
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
Channels
,
LearningRate
)
{
std
::
string
inputFile
=
perf
::
TestBase
::
getDataPath
(
std
::
string
(
"gpu/video/"
)
+
GET_PARAM
(
1
));
int
cn
=
GET_PARAM
(
2
);
double
learningRate
=
GET_PARAM
(
3
);
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cv
::
BackgroundSubtractorMOG
mog
;
cv
::
Mat
foreground
;
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
mog
(
frame
,
foreground
,
learningRate
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
startTimer
();
next
();
mog
(
frame
,
foreground
,
learningRate
);
stopTimer
();
}
}
INSTANTIATE_TEST_CASE_P
(
Video
,
MOG
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
)),
testing
::
Values
(
Channels
(
1
),
Channels
(
3
)
/*, Channels(4)*/
),
testing
::
Values
(
LearningRate
(
0.0
),
LearningRate
(
0.01
))));
//////////////////////////////////////////////////////
// MOG2
GPU_PERF_TEST
(
MOG2_update
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
Channels
)
{
std
::
string
inputFile
=
perf
::
TestBase
::
getDataPath
(
std
::
string
(
"gpu/video/"
)
+
GET_PARAM
(
1
));
int
cn
=
GET_PARAM
(
2
);
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cv
::
BackgroundSubtractorMOG2
mog2
;
cv
::
Mat
foreground
;
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
mog2
(
frame
,
foreground
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
startTimer
();
next
();
mog2
(
frame
,
foreground
);
stopTimer
();
}
}
INSTANTIATE_TEST_CASE_P
(
Video
,
MOG2_update
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
)),
testing
::
Values
(
Channels
(
1
),
Channels
(
3
)
/*, Channels(4)*/
)));
GPU_PERF_TEST
(
MOG2_getBackgroundImage
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
Channels
)
{
std
::
string
inputFile
=
perf
::
TestBase
::
getDataPath
(
std
::
string
(
"gpu/video/"
)
+
GET_PARAM
(
1
));
int
cn
=
GET_PARAM
(
2
);
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cv
::
BackgroundSubtractorMOG2
mog2
;
cv
::
Mat
foreground
;
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
cn
!=
3
)
{
cv
::
Mat
temp
;
if
(
cn
==
1
)
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
else
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2BGRA
);
cv
::
swap
(
temp
,
frame
);
}
mog2
(
frame
,
foreground
);
}
cv
::
Mat
background
;
mog2
.
getBackgroundImage
(
background
);
TEST_CYCLE
()
{
mog2
.
getBackgroundImage
(
background
);
}
}
INSTANTIATE_TEST_CASE_P
(
Video
,
MOG2_getBackgroundImage
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
),
std
::
string
(
"1920x1080.avi"
)),
testing
::
Values
(
/*Channels(1),*/
Channels
(
3
)
/*, Channels(4)*/
)));
//////////////////////////////////////////////////////
// VideoWriter
...
...
modules/gpu/src/bgfg_mog.cpp
0 → 100644
View file @
acc031aa
/*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
::
MOG_GPU
::
MOG_GPU
(
int
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
MOG_GPU
::
initialize
(
cv
::
Size
,
int
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
MOG_GPU
::
operator
()(
const
cv
::
gpu
::
GpuMat
&
,
cv
::
gpu
::
GpuMat
&
,
float
,
Stream
&
)
{
throw_nogpu
();
}
cv
::
gpu
::
MOG2_GPU
::
MOG2_GPU
(
int
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
MOG2_GPU
::
initialize
(
cv
::
Size
,
int
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
MOG2_GPU
::
operator
()(
const
GpuMat
&
,
GpuMat
&
,
float
,
Stream
&
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
MOG2_GPU
::
getBackgroundImage
(
GpuMat
&
,
Stream
&
)
const
{
throw_nogpu
();
}
#else
namespace
cv
{
namespace
gpu
{
namespace
device
{
namespace
mog
{
void
mog_gpu
(
DevMem2Db
frame
,
int
cn
,
DevMem2Db
fgmask
,
DevMem2Df
weight
,
DevMem2Df
sortKey
,
DevMem2Db
mean
,
DevMem2Db
var
,
int
nmixtures
,
float
varThreshold
,
float
learningRate
,
float
backgroundRatio
,
float
noiseSigma
,
cudaStream_t
stream
);
void
loadConstants
(
int
nmixtures
,
float
Tb
,
float
TB
,
float
Tg
,
float
varInit
,
float
varMin
,
float
varMax
,
float
tau
,
unsigned
char
shadowVal
);
void
mog2_gpu
(
DevMem2Db
frame
,
int
cn
,
DevMem2Db
fgmask
,
DevMem2Db
modesUsed
,
DevMem2Df
weight
,
DevMem2Df
variance
,
DevMem2Db
mean
,
float
alphaT
,
float
prune
,
bool
detectShadows
,
cudaStream_t
stream
);
void
getBackgroundImage_gpu
(
int
cn
,
DevMem2Db
modesUsed
,
DevMem2Df
weight
,
DevMem2Db
mean
,
DevMem2Db
dst
,
cudaStream_t
stream
);
}
}}}
namespace
mog
{
const
int
defaultNMixtures
=
5
;
const
int
defaultHistory
=
200
;
const
float
defaultBackgroundRatio
=
0.7
f
;
const
float
defaultVarThreshold
=
2.5
f
*
2.5
f
;
const
float
defaultNoiseSigma
=
30.0
f
*
0.5
f
;
const
float
defaultInitialWeight
=
0.05
f
;
}
cv
::
gpu
::
MOG_GPU
::
MOG_GPU
(
int
nmixtures
)
:
frameSize_
(
0
,
0
),
nframes_
(
0
)
{
nmixtures_
=
std
::
min
(
nmixtures
>
0
?
nmixtures
:
mog
::
defaultNMixtures
,
8
);
history
=
mog
::
defaultHistory
;
varThreshold
=
mog
::
defaultVarThreshold
;
backgroundRatio
=
mog
::
defaultBackgroundRatio
;
noiseSigma
=
mog
::
defaultNoiseSigma
;
}
void
cv
::
gpu
::
MOG_GPU
::
initialize
(
cv
::
Size
frameSize
,
int
frameType
)
{
CV_Assert
(
frameType
==
CV_8UC1
||
frameType
==
CV_8UC3
||
frameType
==
CV_8UC4
);
frameSize_
=
frameSize
;
int
ch
=
CV_MAT_CN
(
frameType
);
int
work_ch
=
ch
;
// for each gaussian mixture of each pixel bg model we store
// the mixture sort key (w/sum_of_variances), the mixture weight (w),
// the mean (nchannels values) and
// the diagonal covariance matrix (another nchannels values)
weight_
.
create
(
frameSize
.
height
*
nmixtures_
,
frameSize_
.
width
,
CV_32FC1
);
sortKey_
.
create
(
frameSize
.
height
*
nmixtures_
,
frameSize_
.
width
,
CV_32FC1
);
mean_
.
create
(
frameSize
.
height
*
nmixtures_
,
frameSize_
.
width
,
CV_32FC
(
work_ch
));
var_
.
create
(
frameSize
.
height
*
nmixtures_
,
frameSize_
.
width
,
CV_32FC
(
work_ch
));
weight_
.
setTo
(
cv
::
Scalar
::
all
(
0
));
sortKey_
.
setTo
(
cv
::
Scalar
::
all
(
0
));
mean_
.
setTo
(
cv
::
Scalar
::
all
(
0
));
var_
.
setTo
(
cv
::
Scalar
::
all
(
0
));
nframes_
=
0
;
}
void
cv
::
gpu
::
MOG_GPU
::
operator
()(
const
cv
::
gpu
::
GpuMat
&
frame
,
cv
::
gpu
::
GpuMat
&
fgmask
,
float
learningRate
,
Stream
&
stream
)
{
using
namespace
cv
::
gpu
::
device
::
mog
;
CV_Assert
(
frame
.
depth
()
==
CV_8U
);
int
ch
=
frame
.
channels
();
int
work_ch
=
ch
;
if
(
nframes_
==
0
||
learningRate
>=
1.0
||
frame
.
size
()
!=
frameSize_
||
work_ch
!=
mean_
.
channels
())
initialize
(
frame
.
size
(),
frame
.
type
());
fgmask
.
create
(
frameSize_
,
CV_8UC1
);
++
nframes_
;
learningRate
=
learningRate
>=
0.0
f
&&
nframes_
>
1
?
learningRate
:
1.0
f
/
std
::
min
(
nframes_
,
history
);
CV_Assert
(
learningRate
>=
0.0
f
);
mog_gpu
(
frame
,
ch
,
fgmask
,
weight_
,
sortKey_
,
mean_
,
var_
,
nmixtures_
,
varThreshold
,
learningRate
,
backgroundRatio
,
noiseSigma
,
StreamAccessor
::
getStream
(
stream
));
}
/////////////////////////////////////////////////////////////////
// MOG2
namespace
mog2
{
// default parameters of gaussian background detection algorithm
const
int
defaultHistory
=
500
;
// Learning rate; alpha = 1/defaultHistory2
const
float
defaultVarThreshold
=
4.0
f
*
4.0
f
;
const
int
defaultNMixtures
=
5
;
// maximal number of Gaussians in mixture
const
float
defaultBackgroundRatio
=
0.9
f
;
// threshold sum of weights for background test
const
float
defaultVarThresholdGen
=
3.0
f
*
3.0
f
;
const
float
defaultVarInit
=
15.0
f
;
// initial variance for new components
const
float
defaultVarMax
=
5.0
f
*
defaultVarInit
;
const
float
defaultVarMin
=
4.0
f
;
// additional parameters
const
float
defaultfCT
=
0.05
f
;
// complexity reduction prior constant 0 - no reduction of number of components
const
unsigned
char
defaultnShadowDetection
=
127
;
// value to use in the segmentation mask for shadows, set 0 not to do shadow detection
const
float
defaultfTau
=
0.5
f
;
// Tau - shadow threshold, see the paper for explanation
}
cv
::
gpu
::
MOG2_GPU
::
MOG2_GPU
(
int
nmixtures
)
:
frameSize_
(
0
,
0
),
frameType_
(
0
),
nframes_
(
0
)
{
nmixtures_
=
nmixtures
>
0
?
nmixtures
:
mog2
::
defaultNMixtures
;
history
=
mog2
::
defaultHistory
;
varThreshold
=
mog2
::
defaultVarThreshold
;
bShadowDetection
=
true
;
backgroundRatio
=
mog2
::
defaultBackgroundRatio
;
fVarInit
=
mog2
::
defaultVarInit
;
fVarMax
=
mog2
::
defaultVarMax
;
fVarMin
=
mog2
::
defaultVarMin
;
varThresholdGen
=
mog2
::
defaultVarThresholdGen
;
fCT
=
mog2
::
defaultfCT
;
nShadowDetection
=
mog2
::
defaultnShadowDetection
;
fTau
=
mog2
::
defaultfTau
;
}
void
cv
::
gpu
::
MOG2_GPU
::
initialize
(
cv
::
Size
frameSize
,
int
frameType
)
{
using
namespace
cv
::
gpu
::
device
::
mog
;
CV_Assert
(
frameType
==
CV_8UC1
||
frameType
==
CV_8UC3
||
frameType
==
CV_8UC4
);
frameSize_
=
frameSize
;
frameType_
=
frameType
;
nframes_
=
0
;
int
ch
=
CV_MAT_CN
(
frameType
);
int
work_ch
=
ch
;
// for each gaussian mixture of each pixel bg model we store ...
// the mixture weight (w),
// the mean (nchannels values) and
// the covariance
weight_
.
create
(
frameSize
.
height
*
nmixtures_
,
frameSize_
.
width
,
CV_32FC1
);
variance_
.
create
(
frameSize
.
height
*
nmixtures_
,
frameSize_
.
width
,
CV_32FC1
);
mean_
.
create
(
frameSize
.
height
*
nmixtures_
,
frameSize_
.
width
,
CV_32FC
(
work_ch
));
//make the array for keeping track of the used modes per pixel - all zeros at start
bgmodelUsedModes_
.
create
(
frameSize_
,
CV_8UC1
);
bgmodelUsedModes_
.
setTo
(
cv
::
Scalar
::
all
(
0
));
loadConstants
(
nmixtures_
,
varThreshold
,
backgroundRatio
,
varThresholdGen
,
fVarInit
,
fVarMin
,
fVarMax
,
fTau
,
nShadowDetection
);
}
void
cv
::
gpu
::
MOG2_GPU
::
operator
()(
const
GpuMat
&
frame
,
GpuMat
&
fgmask
,
float
learningRate
,
Stream
&
stream
)
{
using
namespace
cv
::
gpu
::
device
::
mog
;
int
ch
=
frame
.
channels
();
int
work_ch
=
ch
;
if
(
nframes_
==
0
||
learningRate
>=
1.0
f
||
frame
.
size
()
!=
frameSize_
||
work_ch
!=
mean_
.
channels
())
initialize
(
frame
.
size
(),
frame
.
type
());
fgmask
.
create
(
frameSize_
,
CV_8UC1
);
fgmask
.
setTo
(
cv
::
Scalar
::
all
(
0
));
++
nframes_
;
learningRate
=
learningRate
>=
0.0
f
&&
nframes_
>
1
?
learningRate
:
1.0
f
/
std
::
min
(
2
*
nframes_
,
history
);
CV_Assert
(
learningRate
>=
0.0
f
);
if
(
learningRate
>
0.0
f
)
mog2_gpu
(
frame
,
frame
.
channels
(),
fgmask
,
bgmodelUsedModes_
,
weight_
,
variance_
,
mean_
,
learningRate
,
-
learningRate
*
fCT
,
bShadowDetection
,
StreamAccessor
::
getStream
(
stream
));
}
void
cv
::
gpu
::
MOG2_GPU
::
getBackgroundImage
(
GpuMat
&
backgroundImage
,
Stream
&
stream
)
const
{
using
namespace
cv
::
gpu
::
device
::
mog
;
backgroundImage
.
create
(
frameSize_
,
frameType_
);
getBackgroundImage_gpu
(
backgroundImage
.
channels
(),
bgmodelUsedModes_
,
weight_
,
mean_
,
backgroundImage
,
StreamAccessor
::
getStream
(
stream
));
}
#endif
modules/gpu/src/cuda/bgfg_mog.cu
0 → 100644
View file @
acc031aa
This diff is collapsed.
Click to expand it.
modules/gpu/src/cuda/fgd_bgfg.cu
View file @
acc031aa
/*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 bpied warranties, including, but not limited to, the bpied
// 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 "opencv2/gpu/device/common.hpp"
#include "opencv2/gpu/device/vec_math.hpp"
#include "opencv2/gpu/device/limits.hpp"
...
...
modules/gpu/test/test_video.cpp
View file @
acc031aa
...
...
@@ -416,16 +416,23 @@ namespace cv
PARAM_TEST_CASE
(
FGDStatModel
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
Channels
)
{
};
cv
::
gpu
::
DeviceInfo
devInfo
;
std
::
string
inputFile
;
int
out_cn
;
TEST_P
(
FGDStatModel
,
Accuracy
)
{
cv
::
gpu
::
DeviceInfo
devInfo
=
GET_PARAM
(
0
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
virtual
void
SetUp
(
)
{
devInfo
=
GET_PARAM
(
0
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
std
::
string
inputFile
=
std
::
string
(
cvtest
::
TS
::
ptr
()
->
get_data_path
())
+
"video/"
+
GET_PARAM
(
1
);
int
out_cn
=
GET_PARAM
(
2
);
inputFile
=
std
::
string
(
cvtest
::
TS
::
ptr
()
->
get_data_path
())
+
"video/"
+
GET_PARAM
(
1
);
out_cn
=
GET_PARAM
(
2
);
}
};
TEST_P
(
FGDStatModel
,
Update
)
{
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
...
...
@@ -473,8 +480,8 @@ TEST_P(FGDStatModel, Accuracy)
}
d_model
.
foreground
.
download
(
h_foreground
);
EXPEC
T_MAT_NEAR
(
gold_background
,
h_background3
,
1.0
);
EXPEC
T_MAT_NEAR
(
gold_foreground
,
h_foreground
,
0.0
);
ASSER
T_MAT_NEAR
(
gold_background
,
h_background3
,
1.0
);
ASSER
T_MAT_NEAR
(
gold_foreground
,
h_foreground
,
0.0
);
}
}
...
...
@@ -483,6 +490,183 @@ INSTANTIATE_TEST_CASE_P(GPU_Video, FGDStatModel, testing::Combine(
testing
::
Values
(
std
::
string
(
"768x576.avi"
)),
testing
::
Values
(
Channels
(
3
),
Channels
(
4
))));
//////////////////////////////////////////////////////
// MOG
IMPLEMENT_PARAM_CLASS
(
LearningRate
,
double
)
PARAM_TEST_CASE
(
MOG
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
UseGray
,
LearningRate
,
UseRoi
)
{
cv
::
gpu
::
DeviceInfo
devInfo
;
std
::
string
inputFile
;
bool
useGray
;
double
learningRate
;
bool
useRoi
;
virtual
void
SetUp
()
{
devInfo
=
GET_PARAM
(
0
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
inputFile
=
std
::
string
(
cvtest
::
TS
::
ptr
()
->
get_data_path
())
+
"video/"
+
GET_PARAM
(
1
);
useGray
=
GET_PARAM
(
2
);
learningRate
=
GET_PARAM
(
3
);
useRoi
=
GET_PARAM
(
4
);
}
};
TEST_P
(
MOG
,
Update
)
{
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
cv
::
gpu
::
MOG_GPU
mog
;
cv
::
gpu
::
GpuMat
foreground
=
createMat
(
frame
.
size
(),
CV_8UC1
,
useRoi
);
cv
::
BackgroundSubtractorMOG
mog_gold
;
cv
::
Mat
foreground_gold
;
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
useGray
)
{
cv
::
Mat
temp
;
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
cv
::
swap
(
temp
,
frame
);
}
mog
(
loadMat
(
frame
,
useRoi
),
foreground
,
learningRate
);
mog_gold
(
frame
,
foreground_gold
,
learningRate
);
ASSERT_MAT_NEAR
(
foreground_gold
,
foreground
,
0.0
);
}
}
INSTANTIATE_TEST_CASE_P
(
GPU_Video
,
MOG
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
)),
testing
::
Values
(
UseGray
(
true
),
UseGray
(
false
)),
testing
::
Values
(
LearningRate
(
0.0
),
LearningRate
(
0.01
)),
WHOLE_SUBMAT
));
//////////////////////////////////////////////////////
// MOG2
PARAM_TEST_CASE
(
MOG2
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
UseGray
,
UseRoi
)
{
cv
::
gpu
::
DeviceInfo
devInfo
;
std
::
string
inputFile
;
bool
useGray
;
bool
useRoi
;
virtual
void
SetUp
()
{
devInfo
=
GET_PARAM
(
0
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
inputFile
=
std
::
string
(
cvtest
::
TS
::
ptr
()
->
get_data_path
())
+
"video/"
+
GET_PARAM
(
1
);
useGray
=
GET_PARAM
(
2
);
useRoi
=
GET_PARAM
(
3
);
}
};
TEST_P
(
MOG2
,
Update
)
{
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
cv
::
gpu
::
MOG2_GPU
mog2
;
cv
::
gpu
::
GpuMat
foreground
=
createMat
(
frame
.
size
(),
CV_8UC1
,
useRoi
);
cv
::
BackgroundSubtractorMOG2
mog2_gold
;
cv
::
Mat
foreground_gold
;
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
if
(
useGray
)
{
cv
::
Mat
temp
;
cv
::
cvtColor
(
frame
,
temp
,
cv
::
COLOR_BGR2GRAY
);
cv
::
swap
(
temp
,
frame
);
}
mog2
(
loadMat
(
frame
,
useRoi
),
foreground
);
mog2_gold
(
frame
,
foreground_gold
);
double
norm
=
cv
::
norm
(
foreground_gold
,
cv
::
Mat
(
foreground
),
cv
::
NORM_L1
);
norm
/=
foreground_gold
.
size
().
area
();
ASSERT_LE
(
norm
,
0.09
);
}
}
TEST_P
(
MOG2
,
getBackgroundImage
)
{
cv
::
VideoCapture
cap
(
inputFile
);
ASSERT_TRUE
(
cap
.
isOpened
());
cv
::
Mat
frame
;
cv
::
gpu
::
MOG2_GPU
mog2
;
cv
::
gpu
::
GpuMat
foreground
;
cv
::
BackgroundSubtractorMOG2
mog2_gold
;
cv
::
Mat
foreground_gold
;
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cap
>>
frame
;
ASSERT_FALSE
(
frame
.
empty
());
// if (useGray)
// {
// cv::Mat temp;
// cv::cvtColor(frame, temp, cv::COLOR_BGR2GRAY);
// cv::swap(temp, frame);
// }
mog2
(
loadMat
(
frame
,
useRoi
),
foreground
);
mog2_gold
(
frame
,
foreground_gold
);
}
cv
::
gpu
::
GpuMat
background
=
createMat
(
frame
.
size
(),
frame
.
type
(),
useRoi
);
mog2
.
getBackgroundImage
(
background
);
cv
::
Mat
background_gold
;
mog2_gold
.
getBackgroundImage
(
background_gold
);
ASSERT_MAT_NEAR
(
background_gold
,
background
,
0
);
}
INSTANTIATE_TEST_CASE_P
(
GPU_Video
,
MOG2
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"768x576.avi"
)),
testing
::
Values
(
UseGray
(
true
),
UseGray
(
false
)),
WHOLE_SUBMAT
));
//////////////////////////////////////////////////////
// VideoWriter
...
...
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