• Aucun résultat trouvé

Challenges and Benchmarks: Evaluation of Background Subtraction Algorithms

N/A
N/A
Protected

Academic year: 2021

Partager "Challenges and Benchmarks: Evaluation of Background Subtraction Algorithms"

Copied!
74
0
0

Texte intégral

(1)

Challenges and Benchmarks

Evaluation of Background Subtraction Algorithms

Benjamin Laugraud and Thierry Bouwmans

Montefiore Institute, University of Liège, Belgium MIA Laboratory, University of La Rochelle, France

August 28th, 2018

IAPR Summer School on Machine and Vision Intelligence (VISMAC 2018)

(2)

Purpose

Modern background subtraction (BGS) algorithms must be evaluated rigorously!

Such an evaluation should consider all the challenges associated with the field.

Important to convince reviewers and readers of the efficacy of a method.

How to perform a rigorous evaluation in practice?

(3)

Important Topics to Study

ChangeDetection.NET (CDnet) Dataset Content of the website.

Structure and conventions of the dataset. Evaluation tools associated with the dataset.

BGSLibrary Presentation.

Content of the website.

Structure and conventions of the library.

C++ Programming

How to use an algorithm from the BGSLibrary in your own C++ code? How to apply an algorithm from the BGSLibrary on CDnet?

How to integrate your own algorithm in the BGSLibrary?

(4)

Prerequisites

TheUbuntu (or derived) GNU/Linux distribution.1

TheOpenCV library.2

TheCMake compilation utility.3

TheMatlab programming environment.4

1https://www.ubuntu.com 2https://opencv.org 3https://cmake.org

4https://www.mathworks.com/products/matlab.html

(5)
(6)

Website

http://changedetection.net

(7)

Overall Results

(8)

Category Results (Bad Weather for the Example)

(9)

Download

(10)

Dataset Structure

Once uncompressed, the dataset is in a

dataset

folder.

Inside, there is a folder per category gathering a folder per sequence.

For each sequence, there is a folder for the

input

and the

groundtruth

.

In

temporalROI.txt

there are 2 frame numbers defining the evaluation interval.

(11)

Sequence Content

The

input

folder of a given sequence contains one

.jpg

file per frame.

The name of a file is

in

, the frame number encoded with 6 digits, and

.jpg

.

The

groundtruth

folder contains one

.png

file per frame.

The name of a file is

gt

, the frame number encoded with 6 digits, and

.png

.

(12)

Ground-Truth Format

(Taken from the CDnet website)

Each pixel of a ground-truth (GT)

.png

file has a value among:

0

Background

50

Shadow

85

Outside the ROI (pixel ignored during the evaluation)

170

Impossible to determine (pixel ignored during the evaluation)

255

Foreground

Note: A frame outside the evaluation interval has a GT full of

85

values.

(13)

Tools for Performance Evaluation

Some tools to compute metrics (e.g. F1) are given along with the dataset.

There are Matlab and Python versions.

In this tutorial, we will show how to use the Matlab version.

(14)

Small problem with GNU/Linux

To work on GNU/Linux, the CDnet evaluation tool requires some modifications.

In

processVideoFolder.m

line

35

:

fID = fopen ([ path , ’\ t e m p o r a l R O I . txt ’]); % Bef ore fID = fopen ([ path , ’/ t e m p o r a l R O I . txt ’]); % After

In

Stats.m

line

45

:

% Bef ore

f = fopen ([ this . path ’\ ’ c a t e g o r y ’\ ’ video ’\ cm . txt ’] , ’wt ’); % After

f = fopen ([ this . path ’/ ’ c a t e g o r y ’/ ’ video ’/ cm . txt ’] , ’wt ’);

In

Stats.m

line

52

:

f = fopen ([ this . path ’\ ’ c a t e g o r y ’\ cm . txt ’] , ’wt ’); % Before f = fopen ([ this . path ’/ ’ c a t e g o r y ’/ cm . txt ’] , ’wt ’); % After

In

Stats.m

line

76

:

f = fopen ([ this . path ’\ cm . txt ’] , ’wt ’); % B efore f = fopen ([ this . path ’/ cm . txt ’] , ’wt ’); % After

(15)
(16)

Presentation

Open-source (GPL 3) C++ library full of BGS algorithms.

Based upon OpenCV.

Maintained by Andrews Sobral.

Numerous algorithms have been implemented by the authors!

Provides also: GUI; wrappers for Java, Python, and Matlab; Docker images; etc.

Everyone is free to send its algorithm (as long as a reference is associated).

For any support related to the BGSLibrary, please contact Andrews Sobral.

(17)

Website

https://github.com/andrewssobral/bgslibrary

(18)

Download

(19)

Library Structure

Once uncompressed, you have all the files to compile the library and its tools.

There are Java and QT GUIs, but...

...in this tutorial, we will focus on the inclusion of the library in your own program.

This requires to copy in your project

package_analysis

and

package_bgs

.

The folder

package_bgs

contains the implementations of the BGS algorithms.

(20)

Wiki

The wiki on the website documents every aspect of the library.

You can find the list of available BGS algorithms.

(21)
(22)
(23)

Procedure

Create a folder for your project and put inside:

An empty

build

folder (location of the compiled files).

An empty

build/config

(location of the BGSLibrary config files).

A copy of the

package_analysis

folder of the BGSLibrary.

A copy of the

package_bgs

folder of the BGSLibrary.

An empty

CMakeLists.txt

file.

(24)

Minimal

CMakeLists.txt

File

c m a k e _ m i n i m u m _ r e q u i r e d ( V E R S I O N 2.8) # Project name

project( cdnet - bgs )

# Enable C++11 support of the compiler

set( C M A K E _ C X X _ F L A G S " $ { C M A K E _ C X X _ F L A G S } - std = c ++11 " )

# Find OpenCV

find_package( Ope nCV R E Q U I R E D )

# Add include directories of OpenCV

include_directories(SYSTEM $ { O p e n C V _ I N C L U D E _ D I R S })

# Find all C++ and C implementation files in package_bgs

file(GLOB_RECURSE b g s l i b r a r y _ s r c p a c k a g e _ b g s /*. cpp p a c k a g e _ b g s /*. cc p a c k a g e _ b g s /*. c )

# Declare the BGSLibrary with the files being found

add_library( b g s l i b r a r y STATIC $ { b g s l i b r a r y _ s r c })

# Link the BGSLibrary with OpenCV

target_link_libraries( b g s l i b r a r y $ { O p e n C V _ L I B S })

(25)

Compilation

The empty project can be compiled using the following commands:

$ cd build

$ cmake -DCMAKE_BUILD_TYPE=Release ..

$ make

(26)

BGSLibrary Compiled!

Once compiled, the BGSLibrary is a static library

libbgslibrary.a

in

build

.

Thus, we have a project enabling to create a program with the BGSLibrary.

(27)
(28)

Procedure

For applying BGS on the CDnet dataset, we need a list of sequences.

We can add to our project a

cdnet.txt

file containing such a list.

Thus, we start our program with a function to read

cdnet.txt

.

The code of the program will be put in a file called

bgs-subtractor.cpp

.

(29)

Content of

cdnet.txt

b a d W e a t h e r / b l i z z a r d b a d W e a t h e r / s k a t i n g b a d W e a t h e r / s n o w F a l l b a d W e a t h e r / w e t S n o w b a s e l i n e / h i g h w a y b a s e l i n e / of fice b a s e l i n e / p e d e s t r i a n s b a s e l i n e / P E T S 2 0 0 6 c a m e r a J i t t e r / b a d m i n t o n c a m e r a J i t t e r / b o u l e v a r d c a m e r a J i t t e r / s i d e w a l k c a m e r a J i t t e r / t r a f f i c d y n a m i c B a c k g r o u n d / boats d y n a m i c B a c k g r o u n d / canoe d y n a m i c B a c k g r o u n d / fall d y n a m i c B a c k g r o u n d / f o u n t a i n 0 1 d y n a m i c B a c k g r o u n d / f o u n t a i n 0 2 d y n a m i c B a c k g r o u n d / o v e r p a s s i n t e r m i t t e n t O b j e c t M o t i o n / a b a n d o n e d B o x i n t e r m i t t e n t O b j e c t M o t i o n / p a r k i n g i n t e r m i t t e n t O b j e c t M o t i o n / sofa i n t e r m i t t e n t O b j e c t M o t i o n / s t r e e t L i g h t i n t e r m i t t e n t O b j e c t M o t i o n / t r a m s t o p ... t u r b u l e n c e / t u r b u l e n c e 3

(30)

Modification of

CMakeLists.txt

We need to add some lines at the end of

CMakeLists.txt

to compile our program!

...

# Produce the executable bgs-subtractor from the C++ code

add_executable( bgs - s u b t r a c t o r bgs - s u b t r a c t o r . cpp )

# Link bgs-subtractor to the BGSLibrary and OpenCV

target_link_libraries( bgs - s u b t r a c t o r b g s l i b r a r y $ { O p e n C V _ L I B S })

(31)

Function

list_seqs()

to read

cdnet.txt

in

bgs-subtractor.cpp

#include < cstddef > #include < fstream > #include < iostream > #include < string > #include < vector > using namespace std ;

// Path to the cdnet.txt file

#define S E Q S _ P A T H " / home / user / Bu reau / cdnet - bgs / cdnet . txt "

// Function to read the cdnet.txt file vector < string > l i s t _ s e q s () {

vector < string > seqs ; // Vector containing the seq. names i f s t r e a m ifs ( S E Q S _ P A T H ); // Stream to read the cdnet.txt file

stri ng buff er ; // String buffer

// For each line in the cdnet.txt file

while ( g e t l i n e ( ifs , bu ffer ))

// Add the current sequence name in the vector seqs . p u s h _ b a c k ( bu ffer );

// Return the vector of sequence names

return seqs ; }

(32)

Code to test

list_seqs()

in

bgs-subtractor.cpp

int main () {

// Vector with the sequence names vector < string > seqs = l i s t _ s e q s (); // For each sequence

for ( siz e_t s e q _ i d x = 0; s e q _ i d x < seqs . size (); ++ s e q _ i d x ) { // Print the current sequence name

cout << seqs [ s e q _ i d x ] << endl ; }

}

(33)

Compilation and Execution

You can compile the code as in the slide 20.

The program

bgs-subtractor

is in the

build

folder.

You can launch it with the command

./bgs-subtractor

.

If everything is correct, the list of CDnet sequences should be printed.

(34)
(35)

Temporal Region of Interest

In CDnet, each sequence is provided with a

temporalROI.txt

file.

In contains two integers separated by a space on a unique line.

The first is the frame number beginning the evaluation period.

The second is the frame number ending the evaluation period.

Our program will save the segmentation maps computed during this period.

Note that the period before the evaluation period is the training period.

(36)

Modification of

bgs-subtractor.cpp

Add the path to the CDnet dataset.

#define C D N E T _ P A T H " / home / user / B ureau / d a t a s e t 2 0 1 4 / d a t a s e t "

Add a function to read the temporal ROI given a sequence name

seq

.

vector <int> r e a d _ t e m p o r a l _ r o i ( st ring seq ) {

/* The temporal ROI is a vector of two integers:

* - The first is the frame number beginning the evaluation

* - The second is the frame number ending the evaluation

*/

vector <int> t e m p o r a l _ r o i ;

// Stream to read temporalROI.txt

i f s t r e a m ifs ( st ring ( C D N E T _ P A T H ) + " / " + seq + " / t e m p o r a l R O I . txt " );

int frame ; // Integer buffer

ifs >> frame ; // Read the first integer

t e m p o r a l _ r o i . p u s h _ b a c k ( frame ); // Add it into the vector

ifs >> frame ; // Read the second integer

t e m p o r a l _ r o i . p u s h _ b a c k ( frame ); // Add it into the vector // Return the temporal ROI vector

return t e m p o r a l _ r o i ; }

(37)

Code to test

read_temporal_roi()

in

bgs-subtractor.cpp

For this purpose, we can add the following code in the loop iterating the sequences:

...

int main () { ...

// For each sequence

for ( siz e_t s e q _ i d x = 0; s e q _ i d x < seqs . size (); ++ s e q _ i d x ) { ...

// Read the temporal ROI of the current sequence

vector <int> t e m p o r a l _ r o i = r e a d _ t e m p o r a l _ r o i ( seqs [ s e q _ i d x ]); // Put the first frame number in a variable frame_begin

int f r a m e _ b e g i n = t e m p o r a l _ r o i [0];

// Put the second frame number in a variable frame_end

int f r a m e _ e n d = t e m p o r a l _ r o i [1]; // Print frame_begin and frame_end

cout << f r a m e _ b e g i n << " - " << f r a m e _ e n d << endl ; }

}

(38)

Compilation and Execution

You can compile (resp. launch) the code as in the slide 20 (resp. 27).

If everything is correct, the temporal ROI of each sequence is printed.

(39)
(40)

Procedure

In the sequence folder, we need to read each image file.

To each image file corresponds a frame.

For each frame, the image file name has to be formatted correctly.

We can read the image file using OpenCV.

(41)

Modification of

bgs-subtractor.cpp

Add the following includes.

...

#include < iomanip >

#include < sstream >

#include < o p e n c v 2 / core / core . hpp >

#include < o p e n c v 2 / h i g h g u i / h i g h g u i . hpp >

Use the OpenCV namespace.

...

using namespace cv ;

(42)

Code to read and display the frames in

bgs-subtractor.cpp

...

int main () { ...

// For each sequence

for ( siz e_t s e q _ i d x = 0; s e q _ i d x < seqs . size (); ++ s e q _ i d x ) { ...

// For each frame

for (int f_num = 1; f_num <= f r a m e _ e n d ; ++ f_num ) { // Stream to format the image file name

s t r i n g s t r e a m f r a m e _ p a t h ;

// Path to the image file corresponding to the frame f r a m e _ p a t h << C D N E T _ P A T H << " / " << seqs [ s e q _ i d x ]

<< " / input / in " << setw (6) << s e t f i l l ( ’0 ’) << f_num << " . jpg " ;

// Ask OpenCV to read the image file and put it in a Mat Mat frame = imrea d ( f r a m e _ p a t h . str ());

// Put the input frame in a graphical window imsh ow ( " Input frame " , frame );

// Display the graphical window w a i t K e y (1);

} } }

(43)

Compilation and Execution

You can compile (resp. launch) the code as in the slide 20 (resp. 27).

If everything is correct, a window displaying the current sequence appears.

(44)
(45)

Procedure

We want to instantiate a given BGS algorithm in the BGSLibrary.

Apply it on each frame of each CDnet sequence.

By default, the BGSLibrary displays the results in a graphical window.

(46)

Modification of

bgs-subtractor.cpp

Include the BGSLibrary.

...

#include " p a c k a g e _ b g s / b g s l i b r a r y . h "

(47)

Code to apply a BGS algorithm in

bgs-subtractor.cpp

...

int main () { ...

// For each sequence

for ( siz e_t s e q _ i d x = 0; s e q _ i d x < seqs . size (); ++ s e q _ i d x ) { ...

// Instantiate a BGS algorithm (the frame difference here) IBGS * s u b t r a c t o r = new F r a m e D i f f e r e n c e ;

// For each frame

for (int f_num = 1; f_num <= f r a m e _ e n d ; ++ f_num ) { ...

// Instantiate an empty segmentation map Mat s e g _ m a p ( frame . rows , frame . cols , C V _ 8 U C 3 ); // Instantiate an empty background model Mat b g _ m o d e l ( frame . rows , frame . cols , C V _ 8 U C 3 ); // Apply BGS algorithm on the current frame subtractor - > p r o c e s s ( frame , seg_map , b g _ m o d e l ); }

}

// Delete the instantiated BGS algorithm

delete s u b t r a c t o r ; }

(48)

Compilation and Execution

You can compile (resp. launch) the code as in the slide 20 (resp. 27).

If everything is correct, a window displaying the segmentation maps appears.

(49)

A New File Appeared!

We used the frame difference algorithm in our code.

A file

FrameDifference.xml

appeared in the

config

folder.

(50)

Configuration of a BGS Algorithm

An XML file is automatically created the first time a BGS algorithm is used.

This file enables to tune the parameters of the frame difference.

This tuning must be done before launching our

bgs-subtractor

.

For instance, the threshold can be modified by tuning the value surrounded by the

<threshold>

tag (here, the value is

15

).

(51)

Using Another BGS Algorithm is Easy!

To use another BGS algorithm, we must change a unique line:

IBGS * s u b t r a c t o r = new F r a m e D i f f e r e n c e ;

For instance, to use

Σ − ∆

, we can modify this line as follows:

IBGS * s u b t r a c t o r = new S i g m a D e l t a ;

You can find the available algorithms in the file

package_bgs/bgslibrary.h

.

(52)
(53)

Procedure

For assessing a BGS algorithm, we must save the results.

Specifically, we must save the maps produced during a temporal ROI.

They can be saved in the

results

folder of the CDnet dataset.

It contains empty category and sequence folders.

The name of a map is

bin

, the frame number encoded with 6 digits, and

.png

.

(54)

Modification of

bgs-subtractor.cpp

Add the path to the CDnet results.

...

#define R E S U L T S _ P A T H " / home / user / Bu reau / d a t a s e t 2 0 1 4 / r e s u l t s "

(55)

Code to Save the Segmentation Maps in

bgs-subtractor.cpp

...

int main () { ...

// For each sequence

for ( siz e_t s e q _ i d x = 0; s e q _ i d x < seqs . size (); ++ s e q _ i d x ) { ...

// For each frame

for (int f_num = 1; f_num <= f r a m e _ e n d ; ++ f_num ) { ...

// If we are in the evaluation period

if ( f_num >= f r a m e _ b e g i n ) {

// Stream to format the output image file name s t r i n g s t r e a m w r i t e _ p a t h ;

/* Path to the output image file containing the * current segmentation map

*/

w r i t e _ p a t h << R E S U L T S _ P A T H << " / " << seqs [ s e q _ i d x ] << " / bin " << setw (6) << s e t f i l l ( ’0 ’) << f_num << " . png " ;

// Ask OpenCV to write the segementation map in the file i m w r i t e ( w r i t e _ p a t h . str () , s e g _ m a p );

} } } }

(56)

Compilation and Execution

You can compile (resp. launch) the code as in the slide 20 (resp. 27).

If everything is correct, the maps should be saved in the

results

folder.

(57)
(58)

What’s Next?

We want to assess a given BGS algorithm on the CDnet dataset.

We compare the resulting segmentation maps with the ground-truth.

The result of such a comparison is expressed by metrics/scores.

An evaluation tool computing those metrics is given with CDnet (see slide 11).

We will see how to use the Matlab version of this tool.

Feel free to use the Python version if it is more convenient to you!

(59)

Procedure

In Matlab, use the function

processFolder()

.

The first parameter is the path to the CDnet dataset.

The second parameter is the path to the results to assess.

(60)

Metrics

When

processFolder()

is over, a

cm.txt

file is generated.

The file is located in the dataset folder.

For each category, it contains the scores averaged over sequences.

It contains also the scores averaged over all CDnet sequences.

For instance, for the F. Diff., F1 is

'

0

.

22 on PTZ, and

'

0

.

23 on the dataset.

(61)

Comprehensive Evaluation

If your results are convincing, you can upload them on the CDnet website.

This enables to discover your position in the ranking.

Moreover, the website performs a deeper evaluation.

More ground-truth is available internally on the server (for avoiding cheating).

Your results are even more convincing? Let’s publish your paper!

(62)
(63)

Procedure

Until now, we saw how to apply a BGS algorithm from the BGSLibrary on CDnet.

Also, we saw how to assess quantitatively the results.

New question: Is it possible to do those operations with your own algorithm?

Answer: Yes!

The solution is to integrate your algorithm to the BGSLibrary.

Consists in creating a class (e.g.

MyAlgo

) inheriting from the class

IBGS

.

MyAlgo

must be in the namespace

bgslibrary::algorithms

.

In

MyAlgo

, you must override the relevant methods of

IBGS

.

You can start this work by creating a header and implementation file (

MyAlgo.h

and

MyAlgo.cpp

) in

package_bgs

.

(64)

Methods to Override

In your class inheriting from

IBGS

, you must override 3 methods:

void p r o c e s s (const cv :: Mat & img_input , cv :: Mat & img_output , cv :: Mat & i m g _ b g m o d e l );

void s a v e C o n f i g ();

void l o a d C o n f i g ();

process()

applies the algorithm on the current frame. The parameters are:

img_input

The current frame (input).

img_output

The resulting segmentation map (output).

img_bgmodel

An image representing the current background model (output).

saveConfig()

saves the parameter values in the algorithm XML config file.

loadConfig()

loads the parameter values in the algorithm XML config file.

Let’s analyze the code of the frame difference!

(65)

Header

FrameDifference.hpp

#pragma once

#include " IBGS . h "

namespace b g s l i b r a r y {

namespace a l g o r i t h m s { // Inherits from IBGS

class F r a m e D i f f e r e n c e : public IBGS {

private: bool e n a b l e T h r e s h o l d ; // Parameter 1 int t h r e s h o l d ; // Parameter 2 public: F r a m e D i f f e r e n c e (); // Constructor ~ F r a m e D i f f e r e n c e (); // Destructor

void p r o c e s s (const cv :: Mat & img_input , // Method 1 cv :: Mat & img_output ,

cv :: Mat & i m g _ b g m o d e l ); private: void s a v e C o n f i g (); // Method 2 void l o a d C o n f i g (); // Method 3 }; } }

(66)

Constructor and Destructor

FrameDifference.hpp

#include " F r a m e D i f f e r e n c e . h "

using namespace b g s l i b r a r y :: a l g o r i t h m s ;

// Constructor

F r a m e D i f f e r e n c e :: F r a m e D i f f e r e n c e () : // Parameters default values

e n a b l e T h r e s h o l d (true) , t h r e s h o l d (15) {

// Display the name of the instantiated algorithm std :: cout << " F r a m e D i f f e r e n c e () " << std :: endl ;

/* Call the setup function of the BGSLibrary to initialize * the algorithm XML config file

*/

setup ( " ./ co nfig / F r a m e D i f f e r e n c e . xml " ); }

// Destructor

F r a m e D i f f e r e n c e ::~ F r a m e D i f f e r e n c e () {

// Display the name of the destroyed algorithm std :: cout << " ~ F r a m e D i f f e r e n c e () " << std :: endl ; // Nothing to destroy for this algorithm }

(67)

Implementation of the BGS Algorithm in

FrameDifference.hpp

void F r a m e D i f f e r e n c e :: p r o c e s s (const cv :: Mat & img_input , cv :: Mat & img_output , cv :: Mat & i m g _ b g m o d e l ) { /* Call the initialization function of the BGSLibrary to

* allocate memory related to img_output and img_bgmodel * whether they are empty.

*/

init ( img_input , img_output , i m g _ b g m o d e l );

// If internal background model is empty (first frame)

if ( i m g _ b a c k g r o u n d . empty ()) {

// Copy the first frame as background model i m g _ i n p u t . cop yTo ( i m g _ b a c k g r o u n d );

// Stop (we cannot detect motion from a unique frame)

return; }

// Absolute difference between model and current frame cv :: a b s d i f f ( i m g _ b a c k g r o u n d , img_input , i m g _ f o r e g r o u n d ); // If input frame is RGB if ( i m g _ f o r e g r o u n d . c h a n n e l s () == 3) // Convert it to grayscale cv :: c v t C o l o r ( i m g _ f o r e g r o u n d , i m g _ f o r e g r o u n d , C V _ B G R 2 G R A Y ); ...

(68)

Implementation of the BGS Algorithm in

FrameDifference.hpp

(2)

...

// If threshold operation is required (yes by default)

if ( e n a b l e T h r e s h o l d )

/* Apply threshold on input frame and save it as the * internal segmentation map

*/

cv :: t h r e s h o l d ( i m g _ f o r e g r o u n d , i m g _ f o r e g r o u n d , threshold , 255 , cv :: T H R E S H _ B I N A R Y );

// Code to show the segmentation map in a graphical window

#ifndef M E X _ C O M P I L E _ F L A G

if ( s h o w O u t p u t )

// Give the name of your algorithm to the graphical window cv :: ims how ( " Frame D i f f e r e n c e " , i m g _ f o r e g r o u n d );

#endif

// Copy the internal segmentation map to the output one i m g _ f o r e g r o u n d . co pyTo ( i m g _ o u t p u t );

// Copy the input frame as the internal background model i m g _ i n p u t . co pyTo ( i m g _ b a c k g r o u n d );

// Copy the internal background model as the output one i m g _ b a c k g r o u n d . co pyTo ( i m g _ b g m o d e l );

// The first frame has been processed f i r s t T i m e = false;

}

(69)

Code to Save XML Config File in

FrameDifference.hpp

void F r a m e D i f f e r e n c e :: s a v e C o n f i g () {

// Ask OpenCV to open the XML file to write

C v F i l e S t o r a g e * fs = c v O p e n F i l e S t o r a g e ( c o n f i g _ x m l . c_str () , nullptr ,

C V _ S T O R A G E _ W R I T E ); // Write enableThreshold parameter value as an integer c v W r i t e I n t ( fs , " e n a b l e T h r e s h o l d " , e n a b l e T h r e s h o l d ); // Write threshold parameter value as an integer c v W r i t e I n t ( fs , " t h r e s h o l d " , t h r e s h o l d );

// Write showOutput parameter value as an integer c v W r i t e I n t ( fs , " s h o w O u t p u t " , s h o w O u t p u t );

// Writing is over (closing) c v R e l e a s e F i l e S t o r a g e (& fs ); }

Note that OpenCV limits the parameter types that can be written. You can use:

cvWriteInt

to write an integer parameter.

cvWriteReal

to write a floating-point parameter.

cvWriteString

to write a string parameter.

(70)

Code to Load XML Config File in

FrameDifference.hpp

void F r a m e D i f f e r e n c e :: l o a d C o n f i g () {

// Ask OpenCV to open the XML file to read

C v F i l e S t o r a g e * fs = c v O p e n F i l e S t o r a g e ( c o n f i g _ x m l . c_str () , nullptr ,

C V _ S T O R A G E _ R E A D ); // Read enableThreshold as an integer (true if not defined) e n a b l e T h r e s h o l d = c v R e a d I n t B y N a m e ( fs , nullptr ,

" e n a b l e T h r e s h o l d " , true); // Read threshold as an integer (15 if not defined)

t h r e s h o l d = c v R e a d I n t B y N a m e ( fs , nullptr , " t h r e s h o l d " , 15); // Read showOutput as an integer (true if not defined)

s h o w O u t p u t = c v R e a d I n t B y N a m e ( fs , nullptr , " s h o w O u t p u t " , true); // Reading is over (closing)

c v R e l e a s e F i l e S t o r a g e (& fs ); }

Note that, once again OpenCV limits the parameter types that can be read to integers, floating-points, and strings.

(71)

The Journey is Coming to an End

Do not forget to add your algorithm into

bgslibrary.h

.

You can send it to Andrews Sobral to be integrated in the official BGSLibrary.

You are now able to:

• Integrate your own BGS algorithm in the BGSLibray.

• Apply it on the CDnet dataset.

Assess it with metrics/scores.

(72)
(73)
(74)

References

[1] T. Bouwmans et al., eds.Background Modeling and Foreground Detection for Video Surveillance.Chapman and Hall/CRC, 2014.ISBN: 9781482205374.

[2] N. Goyette et al. “changedetection.net: A New Change Detection Benchmark Dataset.” In: IEEE International Conference on Computer Vision and Pat-tern Recognition Workshops (CVPRW). 2012.DOI:

10 . 1109 / CVPRW . 2012 .

6238919

.

[3] A. Sobral.“BGSLibrary: An OpenCV C++ Background Subtraction Library.”In:

Workshop de Visao Computacional (WVC). Rio de Janeiro, Brazil, 2013, pp. 1–

6.DOI:

10.13140/2.1.1740.7044

.

[4] Y. Wang et al.“CDnet 2014: An Expanded Change Detection Benchmark Dataset.”

In:IEEE International Conference on Computer Vision and Pattern Recog-nition Workshops (CVPRW). Columbus, Ohio, USA, 2014, pp. 393–400.DOI:

10.1109/CVPRW.2014.126

.

Références

Documents relatifs

Pour apporter des éléments de réponse, la démarche consiste actuellement à déterminer des caractéristiques géochimiques du métal contenu dans les monnaies, notamment les teneurs

Case studies have yet rarely been investigated in such a hypothetical frame, and the Iberian hare (Lepus granatensis) offers a good model to do so: among popu- lations of this

Given the coordinates of a defocus-only point in the two-element array x, a set of aberration parameters in params, and the coordinates of an image plain point in

Dans les Landes, en octobre et novembre 2019, le Syndicat Mixte Landes Océanes (SMLO), dont le Département des Landes est membre majoritaire, a lancé une

Le bromure d’ethidium est agent mutagène qui s’intercale entre les bases d’ADN et qui sous excitation par UV émet une fluorescence orange qui permet la visualisation de l’ADN

tisme tombe à 15 %, soit deux fois moins que dans la population générale d’Awra Amba de plus de 6 ans, mais avec une forte différence entre hommes (4 %) et femmes (32 %), et ceux qui

La RATP propose depuis sa création des espaces pour l’affichage publicitaire. Mais celui-ci est aussi un moyen pour les différents musées, fondations ou villes de proposer

• le cours d'eau est trop bas; • pas assez de place sur les côtés; • La pente en travers étant trop forte.. • Un