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
dec38e59
Commit
dec38e59
authored
Jun 30, 2012
by
Andrey Kamaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Background subtractor GMG: removed flexitype, fixed build errors.
parent
afe11f69
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
33 additions
and
129 deletions
+33
-129
background_segm.hpp
modules/video/include/opencv2/video/background_segm.hpp
+7
-79
bgfg_gmg.cpp
modules/video/src/bgfg_gmg.cpp
+26
-50
test_backgroundsubtractor_gbh.cpp
modules/video/test/test_backgroundsubtractor_gbh.cpp
+0
-0
No files found.
modules/video/include/opencv2/video/background_segm.hpp
View file @
dec38e59
...
@@ -199,75 +199,7 @@ protected:
...
@@ -199,75 +199,7 @@ protected:
*/
*/
class
CV_EXPORTS
BackgroundSubtractorGMG
:
public
cv
::
BackgroundSubtractor
class
CV_EXPORTS
BackgroundSubtractorGMG
:
public
cv
::
BackgroundSubtractor
{
{
private
:
protected
:
/**
* A general flexible datatype.
*
* Used internally to enable background subtraction algorithm to be robust to any input Mat type.
* Datatype can be char, unsigned char, int, unsigned int, long int, float, or double.
*/
union
flexitype
{
char
c
;
uchar
uc
;
int
i
;
unsigned
int
ui
;
long
int
li
;
float
f
;
double
d
;
flexitype
(){
d
=
0.0
;}
//!< Default constructor, set all bits of the union to 0.
flexitype
(
char
cval
){
c
=
cval
;}
//!< Char type constructor
bool
operator
==
(
flexitype
&
rhs
)
{
return
d
==
rhs
.
d
;
}
//! Char type assignment operator
flexitype
&
operator
=
(
char
cval
){
if
(
this
->
c
==
cval
){
return
*
this
;}
c
=
cval
;
return
*
this
;
}
flexitype
(
unsigned
char
ucval
){
uc
=
ucval
;}
//!< unsigned char type constructor
//! unsigned char type assignment operator
flexitype
&
operator
=
(
unsigned
char
ucval
){
if
(
this
->
uc
==
ucval
){
return
*
this
;}
uc
=
ucval
;
return
*
this
;
}
flexitype
(
int
ival
){
i
=
ival
;}
//!< int type constructor
//! int type assignment operator
flexitype
&
operator
=
(
int
ival
){
if
(
this
->
i
==
ival
){
return
*
this
;}
i
=
ival
;
return
*
this
;
}
flexitype
(
unsigned
int
uival
){
ui
=
uival
;}
//!< unsigned int type constructor
//! unsigned int type assignment operator
flexitype
&
operator
=
(
unsigned
int
uival
){
if
(
this
->
ui
==
uival
){
return
*
this
;}
ui
=
uival
;
return
*
this
;
}
flexitype
(
float
fval
){
f
=
fval
;}
//!< float type constructor
//! float type assignment operator
flexitype
&
operator
=
(
float
fval
){
if
(
this
->
f
==
fval
){
return
*
this
;}
f
=
fval
;
return
*
this
;
}
flexitype
(
long
int
lival
){
li
=
lival
;}
//!< long int type constructor
//! long int type assignment operator
flexitype
&
operator
=
(
long
int
lival
){
if
(
this
->
li
==
lival
){
return
*
this
;}
li
=
lival
;
return
*
this
;
}
flexitype
(
double
dval
){
d
=
dval
;}
//!< double type constructor
//! double type assignment operator
flexitype
&
operator
=
(
double
dval
){
if
(
this
->
d
==
dval
){
return
*
this
;}
d
=
dval
;
return
*
this
;
}
};
/**
/**
* Used internally to represent a single feature in a histogram.
* Used internally to represent a single feature in a histogram.
* Feature is a color and an associated likelihood (weight in the histogram).
* Feature is a color and an associated likelihood (weight in the histogram).
...
@@ -387,7 +319,7 @@ public:
...
@@ -387,7 +319,7 @@ public:
* @param min minimum value taken on by pixels in image sequence. Usually 0
* @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
* @param max maximum value taken on by pixels in image sequence. e.g. 1.0 or 255
*/
*/
void
initializeType
(
InputArray
image
,
flexitype
min
,
flexityp
e
max
);
void
initializeType
(
InputArray
image
,
double
min
,
doubl
e
max
);
/**
/**
* Selectively update the background model. Only update background model for pixels identified
* Selectively update the background model. Only update background model for pixels identified
* as background.
* as background.
...
@@ -417,24 +349,20 @@ protected:
...
@@ -417,24 +349,20 @@ protected:
double
decisionThreshold
;
//!< value above which pixel is determined to be FG.
double
decisionThreshold
;
//!< value above which pixel is determined to be FG.
int
smoothingRadius
;
//!< smoothing radius, in pixels, for cleaning up FG image.
int
smoothingRadius
;
//!< smoothing radius, in pixels, for cleaning up FG image.
flexityp
e
maxVal
,
minVal
;
doubl
e
maxVal
,
minVal
;
/*
/*
* General Parameters
* General Parameters
*/
*/
size_
t
imWidth
;
//!< width of image.
in
t
imWidth
;
//!< width of image.
size_
t
imHeight
;
//!< height of image.
in
t
imHeight
;
//!< height of image.
size_t
numPixels
;
size_t
numPixels
;
int
imageDepth
;
//!< Depth of image, e.g. CV_8U
unsigned
int
numChannels
;
//!< Number of channels in image.
unsigned
int
numChannels
;
//!< Number of channels in image.
bool
isDataInitialized
;
bool
isDataInitialized
;
//!< After general parameters are set, data structures must be initialized.
//!< After general parameters are set, data structures must be initialized.
size_t
elemSize
;
//!< store image mat element sizes
size_t
elemSize1
;
/*
/*
* Data Structures
* Data Structures
*/
*/
...
...
modules/video/src/bgfg_gmg.cpp
View file @
dec38e59
...
@@ -67,7 +67,7 @@ BackgroundSubtractorGMG::BackgroundSubtractorGMG()
...
@@ -67,7 +67,7 @@ BackgroundSubtractorGMG::BackgroundSubtractorGMG()
smoothingRadius
=
7
;
smoothingRadius
=
7
;
}
}
void
BackgroundSubtractorGMG
::
initializeType
(
InputArray
_image
,
flexitype
min
,
flexityp
e
max
)
void
BackgroundSubtractorGMG
::
initializeType
(
InputArray
_image
,
double
min
,
doubl
e
max
)
{
{
minVal
=
min
;
minVal
=
min
;
maxVal
=
max
;
maxVal
=
max
;
...
@@ -114,7 +114,6 @@ void BackgroundSubtractorGMG::initializeType(InputArray _image,flexitype min, fl
...
@@ -114,7 +114,6 @@ void BackgroundSubtractorGMG::initializeType(InputArray _image,flexitype min, fl
* Detect and accommodate the image depth
* Detect and accommodate the image depth
*/
*/
Mat
image
=
_image
.
getMat
();
Mat
image
=
_image
.
getMat
();
imageDepth
=
image
.
depth
();
// 32f, 8u, etc.
numChannels
=
image
.
channels
();
numChannels
=
image
.
channels
();
/*
/*
...
@@ -127,16 +126,15 @@ void BackgroundSubtractorGMG::initializeType(InputArray _image,flexitype min, fl
...
@@ -127,16 +126,15 @@ void BackgroundSubtractorGMG::initializeType(InputArray _image,flexitype min, fl
/*
/*
* Data Structure Initialization
* Data Structure Initialization
*/
*/
Size
imsize
=
image
.
size
();
imWidth
=
image
.
cols
;
imWidth
=
imsize
.
width
;
imHeight
=
image
.
rows
;
imHeight
=
imsize
.
height
;
numPixels
=
image
.
total
();
numPixels
=
imWidth
*
imHeight
;
pixels
.
resize
(
numPixels
);
pixels
.
resize
(
numPixels
);
frameNum
=
0
;
frameNum
=
0
;
// used to iterate through matrix of type unknown at compile time
// used to iterate through matrix of type unknown at compile time
elemSize
=
image
.
elemSize
();
//
elemSize = image.elemSize();
elemSize1
=
image
.
elemSize1
();
//
elemSize1 = image.elemSize1();
vector
<
PixelModelGMG
>::
iterator
pixel
;
vector
<
PixelModelGMG
>::
iterator
pixel
;
vector
<
PixelModelGMG
>::
iterator
pixel_end
=
pixels
.
end
();
vector
<
PixelModelGMG
>::
iterator
pixel_end
=
pixels
.
end
();
...
@@ -145,8 +143,8 @@ void BackgroundSubtractorGMG::initializeType(InputArray _image,flexitype min, fl
...
@@ -145,8 +143,8 @@ void BackgroundSubtractorGMG::initializeType(InputArray _image,flexitype min, fl
pixel
->
setMaxFeatures
(
maxFeatures
);
pixel
->
setMaxFeatures
(
maxFeatures
);
}
}
fgMaskImage
=
Mat
::
zeros
(
imHeight
,
imWidth
,
CV_8UC1
);
// 8-bit unsigned mask. 255 for FG, 0 for BG
fgMaskImage
=
Mat
::
zeros
(
imHeight
,
imWidth
,
CV_8UC1
);
// 8-bit unsigned mask. 255 for FG, 0 for BG
posteriorImage
=
Mat
::
zeros
(
imHeight
,
imWidth
,
CV_32FC1
);
// float for storing probabilities. Can be viewed directly with imshow.
posteriorImage
=
Mat
::
zeros
(
imHeight
,
imWidth
,
CV_32FC1
);
// float for storing probabilities. Can be viewed directly with imshow.
isDataInitialized
=
true
;
isDataInitialized
=
true
;
}
}
...
@@ -171,7 +169,7 @@ void BackgroundSubtractorGMG::operator()(InputArray _image, OutputArray _fgmask,
...
@@ -171,7 +169,7 @@ void BackgroundSubtractorGMG::operator()(InputArray _image, OutputArray _fgmask,
Mat
image
=
_image
.
getMat
();
Mat
image
=
_image
.
getMat
();
_fgmask
.
create
(
Size
(
imHeight
,
imWidth
)
,
CV_8U
);
_fgmask
.
create
(
imHeight
,
imWidth
,
CV_8U
);
fgMaskImage
=
_fgmask
.
getMat
();
// 8-bit unsigned mask. 255 for FG, 0 for BG
fgMaskImage
=
_fgmask
.
getMat
();
// 8-bit unsigned mask. 255 for FG, 0 for BG
/*
/*
...
@@ -183,54 +181,32 @@ void BackgroundSubtractorGMG::operator()(InputArray _image, OutputArray _fgmask,
...
@@ -183,54 +181,32 @@ void BackgroundSubtractorGMG::operator()(InputArray _image, OutputArray _fgmask,
vector
<
PixelModelGMG
>::
iterator
pixel
;
vector
<
PixelModelGMG
>::
iterator
pixel
;
vector
<
PixelModelGMG
>::
iterator
pixel_end
=
pixels
.
end
();
vector
<
PixelModelGMG
>::
iterator
pixel_end
=
pixels
.
end
();
size_t
i
;
size_t
i
;
//#pragma omp parallel
//#pragma omp parallel
for
(
i
=
0
,
pixel
=
pixels
.
begin
();
pixel
!=
pixel_end
;
++
i
,
++
pixel
)
for
(
i
=
0
,
pixel
=
pixels
.
begin
();
pixel
!=
pixel_end
;
++
i
,
++
pixel
)
{
{
HistogramFeatureGMG
newFeature
;
HistogramFeatureGMG
newFeature
;
newFeature
.
color
.
clear
();
newFeature
.
color
.
clear
();
int
irow
=
int
(
i
/
imWidth
);
int
icol
=
i
%
imWidth
;
for
(
size_t
c
=
0
;
c
<
numChannels
;
++
c
)
for
(
size_t
c
=
0
;
c
<
numChannels
;
++
c
)
{
{
/*
/*
* Perform quantization. in each channel. (color-min)*(levels)/(max-min).
* Perform quantization. in each channel. (color-min)*(levels)/(max-min).
* Shifts min to 0 and scales, finally casting to an int.
* Shifts min to 0 and scales, finally casting to an int.
*/
*/
size_t
quantizedColor
;
double
color
;
// pixel at data+elemSize*i. Individual channel c at data+elemSize*i+elemSize1*c
switch
(
image
.
depth
())
if
(
imageDepth
==
CV_8U
)
{
uchar
*
color
=
(
uchar
*
)(
image
.
data
+
elemSize
*
i
+
elemSize1
*
c
);
quantizedColor
=
(
size_t
)((
double
)(
*
color
-
minVal
.
uc
)
*
quantizationLevels
/
(
maxVal
.
uc
-
minVal
.
uc
));
}
else
if
(
imageDepth
==
CV_8S
)
{
char
*
color
=
(
char
*
)(
image
.
data
+
elemSize
*
i
+
elemSize1
*
c
);
quantizedColor
=
(
size_t
)((
double
)(
*
color
-
minVal
.
c
)
*
quantizationLevels
/
(
maxVal
.
c
-
minVal
.
c
));
}
else
if
(
imageDepth
==
CV_16U
)
{
unsigned
int
*
color
=
(
unsigned
int
*
)(
image
.
data
+
elemSize
*
i
+
elemSize1
*
c
);
quantizedColor
=
(
size_t
)((
double
)(
*
color
-
minVal
.
ui
)
*
quantizationLevels
/
(
maxVal
.
ui
-
minVal
.
ui
));
}
else
if
(
imageDepth
==
CV_16S
)
{
int
*
color
=
(
int
*
)(
image
.
data
+
elemSize
*
i
+
elemSize1
*
c
);
quantizedColor
=
(
size_t
)((
double
)(
*
color
-
minVal
.
i
)
*
quantizationLevels
/
(
maxVal
.
i
-
minVal
.
i
));
}
else
if
(
imageDepth
==
CV_32F
)
{
float
*
color
=
(
float
*
)
image
.
data
+
elemSize
*
i
+
elemSize1
*
c
;
quantizedColor
=
(
size_t
)((
double
)(
*
color
-
minVal
.
ui
)
*
quantizationLevels
/
(
maxVal
.
ui
-
minVal
.
ui
));
}
else
if
(
imageDepth
==
CV_32S
)
{
long
int
*
color
=
(
long
int
*
)(
image
.
data
+
elemSize
*
i
+
elemSize1
*
c
);
quantizedColor
=
(
size_t
)((
double
)(
*
color
-
minVal
.
li
)
*
quantizationLevels
/
(
maxVal
.
li
-
minVal
.
li
));
}
else
if
(
imageDepth
==
CV_64F
)
{
{
double
*
color
=
(
double
*
)
image
.
data
+
elemSize
*
i
+
elemSize1
*
c
;
case
CV_8U
:
color
=
image
.
ptr
<
uchar
>
(
irow
)[
icol
*
numChannels
+
c
];
break
;
quantizedColor
=
(
size_t
)((
double
)(
*
color
-
minVal
.
d
)
*
quantizationLevels
/
(
maxVal
.
d
-
minVal
.
d
));
case
CV_8S
:
color
=
image
.
ptr
<
schar
>
(
irow
)[
icol
*
numChannels
+
c
];
break
;
case
CV_16U
:
color
=
image
.
ptr
<
ushort
>
(
irow
)[
icol
*
numChannels
+
c
];
break
;
case
CV_16S
:
color
=
image
.
ptr
<
short
>
(
irow
)[
icol
*
numChannels
+
c
];
break
;
case
CV_32S
:
color
=
image
.
ptr
<
int
>
(
irow
)[
icol
*
numChannels
+
c
];
break
;
case
CV_32F
:
color
=
image
.
ptr
<
float
>
(
irow
)[
icol
*
numChannels
+
c
];
break
;
case
CV_64F
:
color
=
image
.
ptr
<
double
>
(
irow
)[
icol
*
numChannels
+
c
];
break
;
default
:
color
=
0
;
break
;
}
}
size_t
quantizedColor
=
(
size_t
)((
color
-
minVal
)
*
quantizationLevels
/
(
maxVal
-
minVal
));
newFeature
.
color
.
push_back
(
quantizedColor
);
newFeature
.
color
.
push_back
(
quantizedColor
);
}
}
// now that the feature is ready for use, put it in the histogram
// now that the feature is ready for use, put it in the histogram
...
@@ -251,7 +227,7 @@ void BackgroundSubtractorGMG::operator()(InputArray _image, OutputArray _fgmask,
...
@@ -251,7 +227,7 @@ void BackgroundSubtractorGMG::operator()(InputArray _image, OutputArray _fgmask,
*/
*/
int
row
,
col
;
int
row
,
col
;
col
=
i
%
imWidth
;
col
=
i
%
imWidth
;
row
=
(
i
-
col
)
/
imWidth
;
row
=
int
(
i
-
col
)
/
imWidth
;
posteriorImage
.
at
<
float
>
(
row
,
col
)
=
(
1.0
f
-
posterior
);
posteriorImage
.
at
<
float
>
(
row
,
col
)
=
(
1.0
f
-
posterior
);
}
}
pixel
->
setLastObservedFeature
(
newFeature
);
pixel
->
setLastObservedFeature
(
newFeature
);
...
@@ -284,10 +260,10 @@ void BackgroundSubtractorGMG::updateBackgroundModel(InputArray _mask)
...
@@ -284,10 +260,10 @@ void BackgroundSubtractorGMG::updateBackgroundModel(InputArray _mask)
Mat
maskImg
=
_mask
.
getMat
();
Mat
maskImg
=
_mask
.
getMat
();
//#pragma omp parallel
//#pragma omp parallel
for
(
size_
t
i
=
0
;
i
<
imHeight
;
++
i
)
for
(
in
t
i
=
0
;
i
<
imHeight
;
++
i
)
{
{
//#pragma omp parallel
//#pragma omp parallel
for
(
size_
t
j
=
0
;
j
<
imWidth
;
++
j
)
for
(
in
t
j
=
0
;
j
<
imWidth
;
++
j
)
{
{
if
(
frameNum
<=
numInitializationFrames
+
1
)
if
(
frameNum
<=
numInitializationFrames
+
1
)
{
{
...
...
modules/video/test/test_backgroundsubtractor_gbh.cpp
View file @
dec38e59
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