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
81160250
Commit
81160250
authored
6 years ago
by
Thomas Boy
Browse files
Options
Downloads
Patches
Plain Diff
a lot changes, will write usefull output now
parent
40d32429
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
Demo.cpp
+46
-36
46 additions, 36 deletions
Demo.cpp
package_bgs/Tapter.cpp
+132
-56
132 additions, 56 deletions
package_bgs/Tapter.cpp
package_bgs/Tapter.h
+14
-1
14 additions, 1 deletion
package_bgs/Tapter.h
with
192 additions
and
93 deletions
Demo.cpp
+
46
−
36
View file @
81160250
...
...
@@ -10,27 +10,30 @@ based on original demo.cpp
#include
<stdio.h>
/* printf, scanf, puts, NULL */
#include
<stdlib.h>
/* srand, rand */
#include
<time.h>
/* time */
#include
<ctime>
//opencv
#include
<opencv2/opencv.hpp>
//bgslibrary
#include
"package_bgs/bgslibrary.h"
//my class
#include
"package_bgs/Tapter.h"
std
::
string
mNzero
(
int
i
)
{
std
::
ostringstream
convert
;
convert
<<
i
;
std
::
string
numberString
=
convert
.
str
();
std
::
string
newNumberString
=
std
::
string
(
10
-
numberString
.
length
(),
'0'
)
+
numberString
;
return
newNumberString
;
}
std
::
string
getFileName
(
int
i
)
{
//cv::String inputPath= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/data/";
std
::
string
fileName
=
"/data/"
+
mNzero
(
i
)
+
".jpg"
;
return
fileName
;
}
#include
"package_bgs/ttoolbox.h"
//std::string mNzero(int i)
//{
// std::ostringstream convert;
// convert << i ;
// std::string numberString = convert.str();
// std::string newNumberString = std::string(10 - numberString.length(), '0') + numberString;
// return newNumberString;
//}
//std::string getFileName(int i)
//{
// //cv::String inputPath= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/data/";
// std::string fileName = "/data/"+ mNzero(i) + ".jpg";
// return fileName;
//}
char
*
getCmdOption
(
char
**
begin
,
char
**
end
,
const
std
::
string
&
option
)
...
...
@@ -167,8 +170,11 @@ int main(int argc, char * argv[])
Tapter
*
bgs
=
new
Tapter
;
bgs
->
setInitialFrameCounter
(
0
);
bgs
->
setPathOut
(
outputDir
);
bgs
->
setInitialFrameCounter
(
0
);
bgs
->
setFlagWrite
(
0
);
bgs
->
setFlagWriteDBGpic
(
0
);
//see paper https://dl.acm.org/citation.cfm?id=2321600
//https://ieeexplore.ieee.org/document/4527178/
...
...
@@ -206,12 +212,12 @@ int main(int argc, char * argv[])
//! we train with first 54 on random draws
cout
<<
"b) we train the background with random choosen files"
<<
fileName
<<
endl
;
list
<
string
>
myRandomTrainList
;
//we save all draws in a list which will save to the results
vector
<
string
>
myRandomTrainList
;
//we save all draws in a list which will save to the results
for
(
i
=
0
;
i
<
54
;
i
++
)
//TODO make 54 as parameter
{
//random index
int
index
=
rand
()
%
steps
+
begin
;
//TODO: double check no double draw ??
fileName
=
inputDir
+
getFileName
(
index
);
fileName
=
inputDir
+
TToolBox
::
getFileName
(
index
);
myRandomTrainList
.
push_back
(
fileName
);
cout
<<
"load rnd file :"
<<
fileName
<<
endl
;
...
...
@@ -232,10 +238,18 @@ int main(int argc, char * argv[])
}
cout
<<
"c) we produce train the background with random choosen files"
<<
fileName
<<
endl
;
bgs
->
setInitialFrameCounter
(
0
);
bgs
->
setFlagWrite
(
1
);
bgs
->
setFlagWriteDBGpic
(
1
);
clock_t
beginAll
=
clock
();
for
(
i
=
begin
;
i
<
begin
+
steps
;
i
++
)
{
fileName
=
inputDir
+
getFileName
(
i
);
clock_t
begin
=
clock
();
fileName
=
inputDir
+
TToolBox
::
getFileName
(
i
);
cout
<<
"load file :"
<<
fileName
<<
endl
;
//cv::imwrite(convert.str().c_str(), img_output);
img_input
=
imread
(
fileName
.
c_str
(),
CV_LOAD_IMAGE_COLOR
);
...
...
@@ -253,27 +267,23 @@ int main(int argc, char * argv[])
cout
<<
"error loading file: "
<<
fileName
<<
", will abort"
<<
endl
;
return
EXIT_FAILURE
;
}
}
/*
while (key != 'q')
{
capture >> img_input;
if (img_input.empty()) break;
cv::imshow("input", img_input);
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
clock_t
end
=
clock
();
double
elapsed_secs
=
double
(
end
-
begin
)
/
CLOCKS_PER_SEC
;
//if(!img_mask.empty())
// cv::imshow("Foreground", img_mask);
// do something
cout
<<
"process took:
\t
"
<<
elapsed_secs
<<
"s"
<<
endl
;
}
key = cvWaitKey(33);
}
clock_t
endAll
=
clock
();
double
elapsed_secs
=
double
(
endAll
-
beginAll
)
/
CLOCKS_PER_SEC
;
cout
<<
"process"
<<
amountFiles
<<
" took:
\t
"
<<
(
int
)(
elapsed_secs
/
60
)
<<
" min"
<<
endl
;
//we write the random file list
//format output file
std
::
string
nameOutRandomFile
=
outputDir
+
"randlist.yml"
;
*/
FileStorage
fs
(
nameOutRandomFile
.
c_str
(),
FileStorage
::
WRITE
);
fs
<<
"randomlist"
<<
myRandomTrainList
;
fs
.
release
();
delete
bgs
;
...
...
This diff is collapsed.
Click to expand it.
package_bgs/Tapter.cpp
+
132
−
56
View file @
81160250
...
...
@@ -26,6 +26,8 @@ Tapter::Tapter() :
frameCounter
=
0
;
//inputPath = ".";
outputPath
=
"."
;
flagWrite
=
-
1
;
writeDbgPic
=
-
1
;
}
...
...
@@ -35,6 +37,16 @@ Tapter::~Tapter()
std
::
cout
<<
"~Tapter()"
<<
std
::
endl
;
}
void
Tapter
::
setFlagWrite
(
short
flag
)
{
flagWrite
=
flag
;
}
void
Tapter
::
setFlagWriteDBGpic
(
short
flag
)
{
writeDbgPic
=
flag
;
}
void
Tapter
::
setPathOut
(
std
::
string
outPath
)
{
outputPath
=
outPath
;
...
...
@@ -99,52 +111,6 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
vector
<
vector
<
Point
>
>
contours
=
applyCannyEdgeAndCalcCountours
(
img_output
,
threshholdMin
,
threshholdMax
,
apertureSize
);
//! produce center of convex hull of all polygones
// //TODO double check if ne contour sharing a center point ? nearby ??
// //TODO we should apply everything to the selection !!!!
// //! calc convex hull of all remaining contours *************************
// vector<Point> allContourPoints;
// //we merge all points
// for (size_t cC = 0; cC < contours.size(); ++cC)
// for(size_t cP =0; cP < contours[cC].size(); cP++)
// {
// Point currentContourPixel = contours[cC][cP];
// allContourPoints.push_back(currentContourPixel);
// }
// ////calc the hull ******************
// vector<Point> hullComplete(allContourPoints.size());
// convexHull( Mat(allContourPoints), hullComplete, false );
// if(!hullComplete.empty())//if we any elements, we process further
// {
// // Point2f roiCenter;
// // float roiRadius;
// //calc the min circle around
// //minEnclosingCircle(hullComplete,roiCenter,roiRadius);
//#ifdef MC_SHOW_STEP_ANALYSE
// Mat imgConvexHull = Mat::zeros( img_input.size(), CV_8UC3 );
// imgConvexHull = Scalar(255,255,255); //fille the picture
// Scalar colorB( 0,0,255,255 );//red
// polylines(imgConvexHull, hullComplete, true, colorB, 1, 8);
// //draw circle around
// //circle( imgConvexHull, roiCenter, (int) roiRadius, colorB, 2, 8, 0 );
// //we draw it
// cv::String outpath2= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/result/";
// std::ostringstream convert2;
// convert2 << outpath2 << frameCounter <<"_convex_hull.jpg";
// cv::imwrite(convert2.str().c_str(), imgConvexHull);
//#endif
// //TODO: we need to order the points to get a nice polygon, otherwise not usefull
// //we also try to find the aproximate polygon*****************
//// vector<Point> aproxiCurve;
...
...
@@ -180,12 +146,10 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
//// cout<<"approximate poly has not enough points will skip file: "<<frameCounter<<endl;
////#endif
// }
// else
// cout<<"convex hull has no points will skip file: "<<frameCounter<<endl;
///we make a selection out of all counters with area sizes******************************
vector
<
vector
<
Point
>
>
contourSelection
;
//we exlcude very small one and very big ones
//we calc all min rotated rectangles for all contour from candy egde detect
...
...
@@ -196,7 +160,6 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
minRect
[
i
]
=
minAreaRect
(
Mat
(
contours
[
i
])
);
//may use boundingRect ?? to use fix non rotated rectangles ?
vector
<
Point2f
>
recCenterPoints
;
vector
<
vector
<
Point
>
>
contourSelection
;
float
areaMinThreshold
=
150
;
float
areaMaxThreshold
=
15000
;
//TODO apply moving filter ??, an more adaptive approach
...
...
@@ -237,19 +200,132 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
///we calc the moments from the contour selection
vector
<
Moments
>
mu
(
contourSelection
.
size
()
);
for
(
in
t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
for
(
size_
t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
{
mu
[
i
]
=
moments
(
contourSelection
[
i
],
false
);
}
// Get the mass centers:
vector
<
Point2f
>
massCenters
(
contourSelection
.
size
()
);
for
(
in
t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
for
(
size_
t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
{
massCenters
[
i
]
=
Point2f
(
mu
[
i
].
m10
/
mu
[
i
].
m00
,
mu
[
i
].
m01
/
mu
[
i
].
m00
);
}
//! calc convex hull of all points of the contour selection *********
//TODO produce center of convex hull of all polygones
//TODO double check if ne contour sharing a center point ? nearby ??
//we merge all points
vector
<
Point
>
allContourPoints
;
for
(
size_t
cC
=
0
;
cC
<
contourSelection
.
size
();
++
cC
)
for
(
size_t
cP
=
0
;
cP
<
contourSelection
[
cC
].
size
();
cP
++
)
{
Point
currentContourPixel
=
contourSelection
[
cC
][
cP
];
allContourPoints
.
push_back
(
currentContourPixel
);
}
//calc the hull ******************
vector
<
Point
>
conHull
(
allContourPoints
.
size
());
convexHull
(
Mat
(
allContourPoints
),
conHull
,
false
);
// Point roiCenter;
// float roiRadius;
//calc the min circle around
//minEnclosingCircle(conHull,roiCenter,roiRadius);
//we calc the mass center of the convex hull
///we calc the moments from the contour selection
Moments
muConvexHull
;
Point2f
muConvexHullMassCenter
(
0.0
,
0.0
);
if
(
!
conHull
.
empty
())
{
muConvexHull
=
moments
(
conHull
,
true
);
muConvexHullMassCenter
=
Point2f
(
muConvexHull
.
m10
/
muConvexHull
.
m00
,
muConvexHull
.
m01
/
muConvexHull
.
m00
);
}
#ifdef MC_SHOW_STEP_ANALYSE
if
(
!
conHull
.
empty
())
//if we any elements, we process further
{
Mat
imgConvexHull
=
Mat
::
zeros
(
img_input
.
size
(),
CV_8UC3
);
imgConvexHull
=
Scalar
(
255
,
255
,
255
);
//fille the picture
Scalar
colorB
(
0
,
0
,
255
,
255
);
//red
polylines
(
imgConvexHull
,
hullComplete
,
true
,
colorB
,
1
,
8
);
//draw circle around
//circle( imgConvexHull, roiCenter, (int) roiRadius, colorB, 2, 8, 0 );
//we draw it
cv
::
String
outpath2
=
"/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/result/"
;
std
::
ostringstream
convert2
;
convert2
<<
outpath2
<<
frameCounter
<<
"_convex_hull.jpg"
;
cv
::
imwrite
(
convert2
.
str
().
c_str
(),
imgConvexHull
);
}
else
cout
<<
"convex hull has no points will skip file: "
<<
frameCounter
<<
endl
;
#endif
if
(
flagWrite
)
{
//format output file
std
::
string
nameOutPutFileData
=
outputPath
+
TToolBox
::
mNzero
(
frameCounter
)
+
".yml"
;
FileStorage
fs
(
nameOutPutFileData
.
c_str
(),
FileStorage
::
WRITE
);
fs
<<
"masscenters"
<<
massCenters
;
fs
<<
"polygonselection"
<<
contourSelection
;
fs
<<
"convexhull"
<<
conHull
;
fs
<<
"masscenterconvexhull"
<<
muConvexHullMassCenter
;
//fs << "masscenters" << "[";
// for( size_t i = 0; i < massCenters.size(); i++ )
// {
// Point2f p = massCenters[i];
// fs << "{:" << "x" << (float) p.x << "y" << (float) p.y << "}";
// }
// fs << "]";
fs
.
release
();
}
if
(
writeDbgPic
)
{
Scalar
colorRed
(
0
,
0
,
255
,
255
);
//red
RNG
rng
(
4344234
);
Mat
imgDebugPaint2
=
Mat
::
zeros
(
img_input
.
size
(),
CV_8UC3
);
imgDebugPaint2
=
Scalar
(
255
,
255
,
255
);
//fill the picture white
//we write all polyies of the selection and the mass centers with a random color
for
(
size_t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
{
//random color
Scalar
color
=
Scalar
(
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
),
rng
.
uniform
(
0
,
255
)
);
//contour
drawContours
(
imgDebugPaint2
,
contourSelection
,
i
,
color
,
1
,
LINE_AA
);
//draw the center
circle
(
imgDebugPaint2
,
massCenters
[
i
],
4
,
color
,
-
1
,
8
,
0
);
}
//we write the convex hull
if
(
!
conHull
.
empty
())
{
//the poly
polylines
(
imgDebugPaint2
,
conHull
,
true
,
colorRed
,
1
,
8
);
//the center
circle
(
imgDebugPaint2
,
muConvexHullMassCenter
,
4
,
colorRed
,
-
1
,
8
,
0
);
}
//we make a copy
Mat
imgOverlay2
=
img_input
.
clone
();
//we add a overlay of our paitings
addWeighted
(
imgDebugPaint2
,
0.7
,
imgOverlay2
,
0.3
,
0.0
,
imgOverlay2
);
//we write the file down
std
::
string
nameOutPutFileDBGpic
=
outputPath
+
TToolBox
::
mNzero
(
frameCounter
)
+
".jpg"
;
imwrite
(
nameOutPutFileDBGpic
.
c_str
(),
imgOverlay2
);
}
#ifdef MC_SHOW_STEP_ANALYSE
...
...
@@ -325,7 +401,7 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
}
else
cout
<<
"error no contour in selective list left, skip frame: "
<<
frameCounter
<<
endl
;
#endif
//********
...
...
@@ -335,7 +411,9 @@ void Tapter::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img
convert
<<
outpath
<<
frameCounter
++
<<
".jpg"
;
cv
::
imwrite
(
convert
.
str
().
c_str
(),
img_output
);
//**** end
#else
frameCounter
++
;
#endif
delete
frame
;
...
...
@@ -420,8 +498,6 @@ vector<vector<Point> > Tapter::applyCannyEdgeAndCalcCountours(Mat imgSource, dou
#endif
// return minRect;
return
contours
;
}
This diff is collapsed.
Click to expand it.
package_bgs/Tapter.h
+
14
−
1
View file @
81160250
...
...
@@ -26,8 +26,10 @@ along with BGSLibrary. If not, see <http://www.gnu.org/licenses/>.
#include
"lb/BGModelSom.h"
#include
"IBGS.h"
#include
"ttoolbox.h"
#define MC_SHOW_STEP_ANALYSE
//#define MC_SHOW_STEP_ANALYSE
using
namespace
lb_library
;
using
namespace
lb_library
::
AdaptiveSOM
;
...
...
@@ -50,6 +52,8 @@ namespace bgslibrary
int
frameCounter
;
//
std
::
string
inputPath
;
short
flagWrite
;
short
writeDbgPic
;
std
::
string
outputPath
;
public:
...
...
@@ -61,6 +65,14 @@ namespace bgslibrary
// void setPaths(std::string inPath,std::string outPath);
void
setPathOut
(
std
::
string
outPath
);
//! 1 is on
//! other no write
void
setFlagWrite
(
short
flag
);
//! 1 is on
//! other no write
void
setFlagWriteDBGpic
(
short
flag
);
void
process
(
const
cv
::
Mat
&
img_input
,
cv
::
Mat
&
img_output
,
cv
::
Mat
&
img_bgmodel
);
private:
...
...
@@ -68,6 +80,7 @@ namespace bgslibrary
void
loadConfig
();
vector
<
vector
<
Point
>
>
applyCannyEdgeAndCalcCountours
(
cv
::
Mat
imgSource
,
double
threshholdMin
,
double
threshholdMax
,
int
apertureSize
);
};
}
}
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