Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
camtron
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
kr69sugu
camtron
Commits
4f5e7f93
Commit
4f5e7f93
authored
6 years ago
by
Thomas Boy
Browse files
Options
Downloads
Patches
Plain Diff
use different bk ground method, test, no bk gen needed
parent
0ee54406
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
Demo.cpp
+120
-105
120 additions, 105 deletions
Demo.cpp
package_bgs/ttoolbox.cpp
+8
-7
8 additions, 7 deletions
package_bgs/ttoolbox.cpp
with
128 additions
and
112 deletions
Demo.cpp
+
120
−
105
View file @
4f5e7f93
...
...
@@ -11,11 +11,12 @@ based on original demo.cpp
#include
<stdlib.h>
/* srand, rand */
#include
<time.h>
/* time */
#include
<ctime>
#include
<signal.h>
#define PROCESS_CENTER_VERSION_MAJOR 0
#define PROCESS_CENTER_VERSION_MINOR 9
#define PROCESS_CENTER_VERSION_MINOR_FIXES
8
#define PROCESS_CENTER_VERSION_MINOR_FIXES
9
//opencv
#include
<opencv2/opencv.hpp>
...
...
@@ -28,6 +29,17 @@ based on original demo.cpp
using
namespace
cv
;
using
namespace
std
;
int
g_badSignalFlagAbort
=
0
;
void
my_handler
(
int
signum
)
{
if
(
signum
==
SIGUSR1
)
{
g_badSignalFlagAbort
=
1
;
cerr
<<
"receive signal to abort"
<<
endl
;
}
}
char
*
getCmdOption
(
char
**
begin
,
char
**
end
,
const
std
::
string
&
option
)
{
char
**
itr
=
std
::
find
(
begin
,
end
,
option
);
...
...
@@ -46,6 +58,7 @@ bool cmdOptionExists(char** begin, char** end, const std::string& option)
int
main
(
int
argc
,
char
*
argv
[])
{
signal
(
SIGUSR1
,
my_handler
);
std
::
cout
<<
"using processcenter "
<<
PROCESS_CENTER_VERSION_MAJOR
<<
"."
<<
PROCESS_CENTER_VERSION_MINOR
<<
"."
<<
PROCESS_CENTER_VERSION_MINOR_FIXES
<<
endl
;
std
::
cout
<<
"Using OpenCV "
<<
CV_MAJOR_VERSION
<<
"."
<<
CV_MINOR_VERSION
<<
"."
<<
CV_SUBMINOR_VERSION
<<
std
::
endl
;
...
...
@@ -127,7 +140,7 @@ int main(int argc, char * argv[])
// }
/* Background Subtraction Methods */
//
IBGS *bgs;
IBGS
*
bgs
;
//bgs = new FrameDifference;
//bgs = new StaticFrameDifference;
...
...
@@ -154,7 +167,7 @@ int main(int argc, char * argv[])
//bgs = new FuzzySugenoIntegral;
//bgs = new FuzzyChoquetIntegral;
//bgs = new MultiLayer;
//
bgs = new PixelBasedAdaptiveSegmenter;
bgs
=
new
PixelBasedAdaptiveSegmenter
;
//bgs = new LBSimpleGaussian;
//bgs = new LBFuzzyGaussian;
//bgs = new LBMixtureOfGaussians;
...
...
@@ -173,7 +186,7 @@ int main(int argc, char * argv[])
//bgs = new ViBe;
//bgs = new Tapter;
Tapter
*
bgs
=
new
Tapter
;
//
Tapter *bgs = new Tapter;
//see paper https://dl.acm.org/citation.cfm?id=2321600
//https://ieeexplore.ieee.org/document/4527178/
...
...
@@ -215,106 +228,106 @@ int main(int argc, char * argv[])
cout
<<
"circleRadius: "
<<
circleRadius
<<
endl
;
fsCen
.
release
();
//first the static pic**********
//std::string fileName = getFileName(begin);
std
::
string
staticFile
=
inputDir
+
"/bk.jpg"
;
cout
<<
"a) load first static background pic :"
<<
staticFile
<<
endl
;
//we check for corrupt image
if
(
TToolBox
::
checkFileCorrupted
(
staticFile
))
{
cout
<<
"error file: "
<<
staticFile
<<
" is corrupted, will abort"
<<
endl
;
return
EXIT_FAILURE
;
}
img_input
=
imread
(
staticFile
.
c_str
(),
CV_LOAD_IMAGE_COLOR
);
if
(
img_input
.
data
)
{
//we cut out a smaller ROI
img_input
=
TToolBox
::
cropImageCircle
(
img_input
,
circleCenterX
,
circleCenterY
,
circleRadius
);
cv
::
Mat
img_mask
;
cv
::
Mat
img_bkgmodel
;
bgs
->
process
(
img_input
,
img_mask
,
img_bkgmodel
);
}
else
{
cout
<<
"error loading file: "
<<
staticFile
<<
", will abort"
<<
endl
;
return
EXIT_FAILURE
;
}
// //first the static pic**********
// //std::string fileName = getFileName(begin);
// std::string staticFile = inputDir+"/bk.jpg";
// cout <<"a) load first static background pic :"<< staticFile<<endl;
// //we check for corrupt image
// if(TToolBox::checkFileCorrupted(staticFile))
// {
// cout<<"error file: "<< staticFile<<" is corrupted, will abort"<<endl;
// return EXIT_FAILURE;
// }
// img_input = imread(staticFile.c_str(), CV_LOAD_IMAGE_COLOR);
// if(img_input.data )
// {
// //we cut out a smaller ROI
// img_input = TToolBox::cropImageCircle(img_input,circleCenterX,circleCenterY,circleRadius);
// cv::Mat img_mask;
// cv::Mat img_bkgmodel;
// bgs->process(img_input, img_mask, img_bkgmodel);
// }
// else
// {
// cout<<"error loading file: "<< staticFile<<", will abort"<<endl;
// return EXIT_FAILURE;
// }
// std::string fileName;
// //! we train with first x on random draws
// int amountTrainingSteps = 10;
//// //we open the config file and readin
//// cv::String configFileName("./config/Tapter.xml");
//// {//read the config
//// FileStorage fs;
//// fs.open(configFileName, FileStorage::READ);
//// if (!fs.isOpened())
//// {
//// cout << "error during open " << configFileName << " will abort " <<endl;
//// return EXIT_FAILURE;
//// }
//// //param
//// amountTrainingSteps = (int) fs["trainingSteps"];
//// //cout <<"amountTrainingSteps: "<< amountTrainingSteps<< endl;
//// fs.release();
//// }
// cout <<"b) we train the background with random choosen files"<< fileName<<endl;
// //int j=255;
// vector<string> myRandomTrainList; //we save all draws in a list which will save to the results
// for(i=0;i<amountTrainingSteps;i++)
// {
// //random index
// int index = rand() % amountFiles; //TODO: double check no double draw ??
// fileName = inputDir + TToolBox::getFileName(index);
// myRandomTrainList.push_back(fileName);
// //we check for corrupt image
// if(TToolBox::checkFileCorrupted(fileName))
// {
// cout<<"error file: "<< fileName<<" is corrupted, will ignore it and draw new"<<endl;
// i--;
// continue; //we jump over the rest //TODO bad style
// }
// cout <<"\t"<<i <<"\t of \t"<<amountTrainingSteps<<" rnd file :"<< fileName<<endl;
// img_input = imread(fileName.c_str(), CV_LOAD_IMAGE_COLOR);
// if(img_input.data )
// {
// //we cut out a smaller ROI
// img_input = TToolBox::cropImageCircle(img_input,circleCenterX,circleCenterY,circleRadius);
// cv::Mat img_mask;
// cv::Mat img_bkgmodel;
// bgs->process(img_input, img_mask, img_bkgmodel); // by default, it shows automatically the foreground mask image
// }
// else
// {
// cout<<"error loading file: "<< fileName<<", will draw again"<<endl;
// i--;
// //return EXIT_FAILURE;
// }
// }
cout
<<
"a) we process all frames "
<<
endl
;
int
everyPic
=
60
*
5
;
std
::
string
fileName
;
//! we train with first x on random draws
int
amountTrainingSteps
=
200
;
//we open the config file and readin
cv
::
String
configFileName
(
"./config/Tapter.xml"
);
{
//read the config
FileStorage
fs
;
fs
.
open
(
configFileName
,
FileStorage
::
READ
);
if
(
!
fs
.
isOpened
())
{
cout
<<
"error during open "
<<
configFileName
<<
" will abort "
<<
endl
;
return
EXIT_FAILURE
;
}
//param
amountTrainingSteps
=
(
int
)
fs
[
"trainingSteps"
];
//cout <<"amountTrainingSteps: "<< amountTrainingSteps<< endl;
fs
.
release
();
}
cout
<<
"b) we train the background with random choosen files"
<<
fileName
<<
endl
;
//int j=255;
vector
<
string
>
myRandomTrainList
;
//we save all draws in a list which will save to the results
for
(
i
=
0
;
i
<
amountTrainingSteps
;
i
++
)
{
//random index
int
index
=
rand
()
%
amountFiles
;
//TODO: double check no double draw ??
fileName
=
inputDir
+
TToolBox
::
getFileName
(
index
);
myRandomTrainList
.
push_back
(
fileName
);
//we check for corrupt image
if
(
TToolBox
::
checkFileCorrupted
(
fileName
))
{
cout
<<
"error file: "
<<
fileName
<<
" is corrupted, will ignore it and draw new"
<<
endl
;
i
--
;
continue
;
//we jump over the rest //TODO bad style
}
cout
<<
"
\t
"
<<
i
<<
"
\t
of
\t
"
<<
amountTrainingSteps
<<
" rnd file :"
<<
fileName
<<
endl
;
img_input
=
imread
(
fileName
.
c_str
(),
CV_LOAD_IMAGE_COLOR
);
if
(
img_input
.
data
)
{
//we cut out a smaller ROI
img_input
=
TToolBox
::
cropImageCircle
(
img_input
,
circleCenterX
,
circleCenterY
,
circleRadius
);
cv
::
Mat
img_mask
;
cv
::
Mat
img_bkgmodel
;
bgs
->
process
(
img_input
,
img_mask
,
img_bkgmodel
);
// by default, it shows automatically the foreground mask image
}
else
{
cout
<<
"error loading file: "
<<
fileName
<<
", will draw again"
<<
endl
;
i
--
;
//return EXIT_FAILURE;
}
}
cout
<<
"c) we produce train the background with random choosen files"
<<
fileName
<<
endl
;
int
everyPic
=
60
*
5
;
int
frameCounter
=
0
;
vector
<
string
>
myFileErrorList
;
//list for pure io error
vector
<
string
>
myFileListNoContour
;
//list for no contours found;
vector
<
string
>
myFileListAfterContourSelection
;
//list for no contours found after selection;
vector
<
string
>
myFileListCorrupted
;
//list all corrupted jpg files
for
(
frameCounter
=
0
;
frameCounter
<
amountFiles
;
frameCounter
++
)
for
(
frameCounter
=
0
;
frameCounter
<
amountFiles
||
g_badSignalFlagAbort
;
frameCounter
++
)
{
//measure time consumption
clock_t
begin
=
clock
();
...
...
@@ -494,8 +507,8 @@ int main(int argc, char * argv[])
muConvexHull
=
moments
(
conHull
,
true
);
muConvexHullMassCenter
=
Point2f
(
muConvexHull
.
m10
/
muConvexHull
.
m00
,
muConvexHull
.
m01
/
muConvexHull
.
m00
);
}
}
//end after selection is empty
}
else
//end after selection is empty
{
cerr
<<
"error, no contour found after selection in file: "
<<
fileName
<<
endl
;
myFileListAfterContourSelection
.
push_back
(
fileName
);
...
...
@@ -531,9 +544,12 @@ int main(int argc, char * argv[])
#endif
//cout <<" found center at : "<< massCenters.at(0).x<< ";"<<massCenters.at(0).y<<endl;
//! step 8: we write down all our results in yml file
std
::
string
nameOutPutFileData
=
outputDir
+
TToolBox
::
mNzero
(
frameCounter
)
+
".yml"
;
//cout <<"output file:" << nameOutPutFileData;
FileStorage
fs
(
nameOutPutFileData
.
c_str
(),
FileStorage
::
WRITE
);
fs
<<
"masscenters"
<<
massCenters
;
fs
<<
"polygonselection"
<<
contourSelection
;
...
...
@@ -614,11 +630,11 @@ int main(int argc, char * argv[])
double
elapsed
=
double
(
endAll
-
beginAll
)
/
CLOCKS_PER_SEC
;
cout
<<
"process : "
<<
amountFiles
<<
" files took:
\t
"
<<
(
int
)(
elapsed
/
60
)
<<
" min -
\t
"
<<
(
int
)(
elapsed
/
60
/
60
)
<<
" h
\n
in total"
<<
endl
;
//we write the random file list to a file
std
::
string
nameOutRandomFile
=
outputDir
+
"randlist.yml"
;
FileStorage
fs
(
nameOutRandomFile
.
c_str
(),
FileStorage
::
WRITE
);
fs
<<
"randomlist"
<<
myRandomTrainList
;
fs
.
release
();
//
//we write the random file list to a file
//
std::string nameOutRandomFile = outputDir + "randlist.yml";
//
FileStorage fs(nameOutRandomFile.c_str(), FileStorage::WRITE);
//
fs << "randomlist" << myRandomTrainList;
//
fs.release();
//TODO we should merge the file
...
...
@@ -641,7 +657,6 @@ int main(int argc, char * argv[])
cout
<<
"amount of corrupted jpg files: "
<<
myFileListCorrupted
.
size
()
<<
endl
;
fs2
<<
"fileErrorIOcorruptFiles"
<<
myFileListCorrupted
;
fs2
.
release
();
delete
bgs
;
...
...
This diff is collapsed.
Click to expand it.
package_bgs/ttoolbox.cpp
+
8
−
7
View file @
4f5e7f93
...
...
@@ -43,22 +43,23 @@ std::vector<std::vector<cv::Point>> TToolBox::applyCannyEdgeAndCalcCountours(cv:
// Find contours, use RETR_EXTERNAL ignore inner child structures, TREE more usefull ?
cv
::
findContours
(
imgCannyEdge
,
contours
,
hierarchy
,
cv
::
RETR_EXTERNAL
,
CV_CHAIN_APPROX_SIMPLE
,
cv
::
Point
(
0
,
0
)
);
#define MC_SHOW_STEP_ANALYSE
#ifdef MC_SHOW_STEP_ANALYSE
// Draw contours on extra mat
Mat
imgContour
=
Mat
::
zeros
(
imgCannyEdge
.
size
(),
CV_8UC3
);
imgContour
=
Scalar
(
255
,
255
,
255
);
//fille the picture
RNG
rng
(
232323
);
cv
::
Mat
imgContour
=
cv
::
Mat
::
zeros
(
imgCannyEdge
.
size
(),
CV_8UC3
);
imgContour
=
cv
::
Scalar
(
255
,
255
,
255
);
//fille the picture
cv
::
RNG
rng
(
232323
);
for
(
size_t
i
=
0
;
i
<
contours
.
size
();
i
++
)
{
//random color
Scalar
color
=
Scalar
(
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
)
);
cv
::
Scalar
color
=
cv
::
Scalar
(
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
)
);
//contour
drawContours
(
imgContour
,
contours
,
i
,
color
,
1
,
LINE_AA
,
hierarchy
,
0
,
Point
()
);
cv
::
drawContours
(
imgContour
,
contours
,
i
,
color
,
1
,
cv
::
LINE_AA
,
hierarchy
,
0
,
cv
::
Point
()
);
}
cv
::
String
outpath
=
"/homes/tb55xemi/work/
bugTrainingSet/testRec/rec04379437pp
/result
/
"
;
cv
::
String
outpath
=
"/homes/tb55xemi/work/
dev/bgslibrary-bgslib_qtgui_2.0.0/build/test0815
/result
s
"
;
std
::
ostringstream
convert
;
convert
<<
outpath
<<
frameCounter
<<
"
_countour_canny_edge.jpg"
;
convert
<<
outpath
<<
"test
_countour_canny_edge.jpg"
;
cv
::
imwrite
(
convert
.
str
().
c_str
(),
imgContour
);
#endif
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment