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
48fbbfa8
Commit
48fbbfa8
authored
6 years ago
by
Thomas Boy
Browse files
Options
Downloads
Patches
Plain Diff
meant to be the bug fix
parent
3ab56e9e
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
Demo.cpp
+151
-121
151 additions, 121 deletions
Demo.cpp
with
151 additions
and
121 deletions
Demo.cpp
+
151
−
121
View file @
48fbbfa8
...
...
@@ -15,7 +15,7 @@ based on original demo.cpp
#define PROCESS_CENTER_VERSION_MAJOR 0
#define PROCESS_CENTER_VERSION_MINOR 9
#define PROCESS_CENTER_VERSION_MINOR_FIXES
1
#define PROCESS_CENTER_VERSION_MINOR_FIXES
2
//opencv
#include
<opencv2/opencv.hpp>
...
...
@@ -308,7 +308,9 @@ int main(int argc, char * argv[])
int
everyPic
=
60
*
5
;
int
frameCounter
=
0
;
vector
<
string
>
myFileErrorList
;
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;
for
(
frameCounter
=
0
;
frameCounter
<
amountFiles
;
frameCounter
++
)
{
...
...
@@ -321,7 +323,7 @@ int main(int argc, char * argv[])
//check the string
cout
<<
"open fileName: "
<<
fileName
<<
endl
;
if
(
fileName
.
empty
())
cerr
<<
"error: empty string fileName"
<<
endl
;
cerr
<<
"error: empty string fileName"
<<
endl
;
cout
<<
"
\t
"
<<
frameCounter
<<
"
\t
of
\t
"
<<
amountFiles
<<
" load file :"
<<
fileName
<<
endl
;
...
...
@@ -351,140 +353,158 @@ int main(int argc, char * argv[])
int
apertureSize
=
3
;
std
::
vector
<
vector
<
Point
>
>
contours
=
TToolBox
::
applyCannyEdgeAndCalcCountours
(
img_mask
,
threshholdMin
,
threshholdMax
,
apertureSize
);
//define what we will write down
std
::
vector
<
vector
<
Point
>
>
contourSelection
;
vector
<
Point2f
>
massCenters
;
vector
<
Point
>
conHull
;
Point2f
muConvexHullMassCenter
(
0.0
,
0.0
);
// //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;
if
(
!
contours
.
empty
())
{
// //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;
//// // //see https://docs.opencv.org/3.4/d3/d63/classcv_1_1Mat.html#a167a8e0a3a3d86e84b70e33483af4466
//// // if(aproxiCurve::checkVector(10,CV_32F)==-1)
//// // cout<<"error wrong format of vector"<<endl;
//// // //see https://docs.opencv.org/3.4/d3/d63/classcv_1_1Mat.html#a167a8e0a3a3d86e84b70e33483af4466
//// // if(aproxiCurve::checkVector(10,CV_32F)==-1)
//// // cout<<"error wrong format of vector"<<endl;
//// //calc 0.1 percent of arc length of convex hull
//// double epsilon = 0.1 * cv::arcLength(hullComplete,true);
//// //calc 0.1 percent of arc length of convex hull
//// double epsilon = 0.1 * cv::arcLength(hullComplete,true);
//// //see https://docs.opencv.org/2.4.13.2/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#approxpolydp
//// cv::approxPolyDP(allContourPoints,aproxiCurve,epsilon,false);
//// //see https://docs.opencv.org/2.4.13.2/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#approxpolydp
//// cv::approxPolyDP(allContourPoints,aproxiCurve,epsilon,false);
////#ifdef MC_SHOW_STEP_ANALYSE
//// if(aproxiCurve.size()>=2)//we only draw if we have at least a line
//// {
//// Mat imgPolyApr = Mat::zeros( img_input.size(), CV_8UC3 );
//// imgPolyApr = Scalar(255,255,255); //fille the picture
//// Scalar colorC( 0,0,255,255 );//red
////#ifdef MC_SHOW_STEP_ANALYSE
//// if(aproxiCurve.size()>=2)//we only draw if we have at least a line
//// {
//// Mat imgPolyApr = Mat::zeros( img_input.size(), CV_8UC3 );
//// imgPolyApr = Scalar(255,255,255); //fille the picture
//// Scalar colorC( 0,0,255,255 );//red
//// //for(imgPolyApr)
//// //for(imgPolyApr)
//// polylines(imgPolyApr, aproxiCurve, true, colorC, 1, 8);
//// polylines(imgPolyApr, aproxiCurve, true, colorC, 1, 8);
//// cv::String outpath3= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/result/";
//// std::ostringstream convert3;
//// convert3 << outpath3 << frameCounter <<"_appr_poly.jpg";
//// cv::imwrite(convert3.str().c_str(), imgPolyApr);
//// }
//// else
//// cout<<"approximate poly has not enough points will skip file: "<<frameCounter<<endl;
//// cv::String outpath3= "/homes/tb55xemi/work/bugTrainingSet/testRec/rec04379437pp/result/";
//// std::ostringstream convert3;
//// convert3 << outpath3 << frameCounter <<"_appr_poly.jpg";
//// cv::imwrite(convert3.str().c_str(), imgPolyApr);
//// }
//// else
//// cout<<"approximate poly has not enough points will skip file: "<<frameCounter<<endl;
////#endif
////#endif
//! step 4) we make a selection out of all counters with area sizes******************************
vector
<
vector
<
Point
>
>
contourSelection
;
//we exlcude very small one and very big ones
//! step 4) we make a selection out of all counters with area sizes******************************
//we calc all min rotated rectangles for all contour from candy egde detect
vector
<
RotatedRect
>
minRect
(
contours
.
size
()
);
//we calc all min rotated rectangles for all contour from candy egde detect
//we exlcude very small one and very big ones
vector
<
RotatedRect
>
minRect
(
contours
.
size
()
);
//calc boxes around the contours
for
(
size_t
i
=
0
;
i
<
contours
.
size
();
i
++
)
minRect
[
i
]
=
minAreaRect
(
Mat
(
contours
[
i
])
);
//may use boundingRect ?? to use fix non rotated rectangles ?
//calc boxes around the contours
for
(
size_t
i
=
0
;
i
<
contours
.
size
();
i
++
)
minRect
[
i
]
=
minAreaRect
(
Mat
(
contours
[
i
])
);
//may use boundingRect ?? to use fix non rotated rectangles ?
vector
<
Point2f
>
recCenterPoints
;
float
areaMinThreshold
=
150
;
float
areaMaxThreshold
=
15000
;
//TODO apply moving filter ??, an more adaptive approach
vector
<
Point2f
>
recCenterPoints
;
float
areaMinThreshold
=
150
;
float
areaMaxThreshold
=
15000
;
//TODO apply moving filter ??, an more adaptive approach
//iterate all rectangles
for
(
size_t
i
=
0
;
i
<
minRect
.
size
();
i
++
)
{
Point2f
rect_points
[
4
];
//get all points of the retange
minRect
[
i
].
points
(
rect_points
);
//construct contour based on rectangle points because contour != rectangle with points
vector
<
Point
>
contourRect
;
for
(
int
j
=
0
;
j
<
4
;
j
++
)
contourRect
.
push_back
(
rect_points
[
j
]);
//calc the area of the contour
double
area0
=
contourArea
(
contourRect
);
//over stepp all small areas
if
(
area0
<
areaMinThreshold
||
area0
>
areaMaxThreshold
)
//iterate all rectangles
for
(
size_t
i
=
0
;
i
<
minRect
.
size
();
i
++
)
{
//cout<<i<<":area0:"<<area0<<" dismissed "<<endl;
//skipe if the area is too small
continue
;
}
else
Point2f
rect_points
[
4
];
//get all points of the retange
minRect
[
i
].
points
(
rect_points
);
//construct contour based on rectangle points because contour != rectangle with points
vector
<
Point
>
contourRect
;
for
(
int
j
=
0
;
j
<
4
;
j
++
)
contourRect
.
push_back
(
rect_points
[
j
]);
//calc the area of the contour
double
area0
=
contourArea
(
contourRect
);
//over stepp all small areas
if
(
area0
<
areaMinThreshold
||
area0
>
areaMaxThreshold
)
{
//cout<<i<<":area0:"<<area0<<" dismissed "<<endl;
//skipe if the area is too small
continue
;
}
else
{
//cout<<i<<":area0:"<<area0<<" choose "<<endl;
//get the center of this rectangle
Point2f
center
=
minRect
[
i
].
center
;
recCenterPoints
.
push_back
(
center
);
//we also add the this contour to a selection
contourSelection
.
push_back
(
contours
[
i
]);
}
}
//end iterate all min rectangle
if
(
!
contourSelection
.
empty
())
{
//cout<<i<<":area0:"<<area0<<" choose "<<endl;
//get the center of this rectangle
Point2f
center
=
minRect
[
i
].
center
;
recCenterPoints
.
push_back
(
center
);
//we also add the this contour to a selection
contourSelection
.
push_back
(
contours
[
i
]);
}
}
//end iterate all min rectangle
//! step 5) we calc the moments from the contour selection
vector
<
Moments
>
mu
(
contourSelection
.
size
()
);
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
(
size_t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
{
massCenters
[
i
]
=
Point2f
(
mu
[
i
].
m10
/
mu
[
i
].
m00
,
mu
[
i
].
m01
/
mu
[
i
].
m00
);
}
//! step 6) 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
++
)
//! step 5) we calc the moments from the contour selection
vector
<
Moments
>
mu
(
contourSelection
.
size
()
);
for
(
size_t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
{
mu
[
i
]
=
moments
(
contourSelection
[
i
],
false
);
}
// Get the mass centers:
massCenters
=
vector
<
Point2f
>
(
contourSelection
.
size
()
);
for
(
size_t
i
=
0
;
i
<
contourSelection
.
size
();
i
++
)
{
massCenters
[
i
]
=
Point2f
(
mu
[
i
].
m10
/
mu
[
i
].
m00
,
mu
[
i
].
m01
/
mu
[
i
].
m00
);
}
//! step 6) 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 ******************
conHull
=
vector
<
Point
>
(
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 mass center of the convex hull
Moments
muConvexHull
;
if
(
!
conHull
.
empty
())
{
muConvexHull
=
moments
(
conHull
,
true
);
muConvexHullMassCenter
=
Point2f
(
muConvexHull
.
m10
/
muConvexHull
.
m00
,
muConvexHull
.
m01
/
muConvexHull
.
m00
);
}
}
//end after selection is empty
{
Point
currentContourPixel
=
contourSelection
[
cC
][
cP
]
;
allContourPoints
.
push_back
(
currentContourPixel
);
cerr
<<
"error, no contour found after selection in file: "
<<
fileName
<<
endl
;
myFileListAfterContourSelection
.
push_back
(
fileName
);
}
// 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 mass center of the convex hull
Moments
muConvexHull
;
Point2f
muConvexHullMassCenter
(
0.0
,
0.0
);
if
(
!
conHull
.
empty
())
}
//end if contours are empty, to canny edge found nothing
else
{
muConvexHull
=
moments
(
conHull
,
true
);
muConvexHullMassCenter
=
Point2f
(
muConvexHull
.
m10
/
muConvexHull
.
m00
,
muConvexHull
.
m01
/
muConvexHull
.
m00
);
}
cerr
<<
"error, no contour found at all in file: "
<<
fileName
<<
endl
;
myFileListNoContour
.
push_back
(
fileName
);
}
#ifdef MC_SHOW_STEP_ANALYSE
if
(
!
conHull
.
empty
())
//if we any elements, we process further
...
...
@@ -516,7 +536,7 @@ int main(int argc, char * argv[])
//check the string
cout
<<
"write output nameOutPutFileData: "
<<
nameOutPutFileData
<<
endl
;
if
(
nameOutPutFileData
.
empty
())
cerr
<<
"error: empty string nameOutPutFileData"
<<
endl
;
cerr
<<
"error: empty string nameOutPutFileData"
<<
endl
;
FileStorage
fs
(
nameOutPutFileData
.
c_str
(),
FileStorage
::
WRITE
);
...
...
@@ -565,7 +585,7 @@ int main(int argc, char * argv[])
//check the string
cout
<<
"write dbg file: "
<<
nameOutPutFileDBGpic
<<
endl
;
if
(
nameOutPutFileDBGpic
.
empty
())
cerr
<<
"error: empty string nameOutPutFileDBGpic"
<<
endl
;
cerr
<<
"error: empty string nameOutPutFileDBGpic"
<<
endl
;
imwrite
(
nameOutPutFileDBGpic
.
c_str
(),
imgOverlay2
);
...
...
@@ -594,20 +614,30 @@ int main(int argc, char * argv[])
clock_t
endAll
=
clock
();
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
();
//TODO we should merge the file
//we write the random file list to a file
std
::
string
nameOutErrorList
=
outputDir
+
"fileErrorList.yml"
;
cout
<<
"amount of file errors: "
<<
myFileErrorList
.
size
()
<<
endl
;
FileStorage
fs2
(
nameOutErrorList
.
c_str
(),
FileStorage
::
WRITE
);
fs2
<<
"fileErrorList"
<<
myFileErrorList
;
fs2
<<
"fileErrorIO"
<<
myFileErrorList
;
//we write error list no contours found in file
cout
<<
"amount contour errors with canny edge: "
<<
myFileListNoContour
.
size
()
<<
endl
;
fs2
<<
"fileErrorNoContours"
<<
myFileListNoContour
;
//we write error list no contours found in file
cout
<<
"amount contour errors after selection: "
<<
myFileListAfterContourSelection
.
size
()
<<
endl
;
fs2
<<
"fileErrorNoContoursAfterSelection"
<<
myFileListAfterContourSelection
;
fs2
.
release
();
delete
bgs
;
...
...
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