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
fd4761ba
Commit
fd4761ba
authored
Sep 18, 2015
by
Suleyman TURKMEN
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update face detection samples
parent
95339827
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
134 additions
and
179 deletions
+134
-179
facedetect.cpp
samples/cpp/facedetect.cpp
+49
-68
smiledetect.cpp
samples/cpp/smiledetect.cpp
+46
-64
ufacedetect.cpp
samples/tapi/ufacedetect.cpp
+39
-47
No files found.
samples/cpp/facedetect.cpp
View file @
fd4761ba
#include "opencv2/objdetect.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/videoio/videoio_c.h"
#include "opencv2/highgui/highgui_c.h"
#include <cctype>
#include <iostream>
#include <iterator>
#include <stdio.h>
using
namespace
std
;
using
namespace
cv
;
...
...
@@ -28,7 +18,7 @@ static void help()
" [--try-flip]
\n
"
" [filename|camera_index]
\n\n
"
"see facedetect.cmd for one call:
\n
"
"./facedetect --cascade=
\"
../../data/haarcascades/haarcascade_frontalface_alt.xml
\"
--nested-cascade=
\"
../../data/haarcascades/haarcascade_eye.xml
\"
--scale=1.3
\n\n
"
"./facedetect --cascade=
\"
../../data/haarcascades/haarcascade_frontalface_alt.xml
\"
--nested-cascade=
\"
../../data/haarcascades/haarcascade_eye
_tree_eyeglasses
.xml
\"
--scale=1.3
\n\n
"
"During execution:
\n\t
Hit any key to quit.
\n
"
"
\t
Using OpenCV version "
<<
CV_VERSION
<<
"
\n
"
<<
endl
;
}
...
...
@@ -42,8 +32,8 @@ string nestedCascadeName = "../../data/haarcascades/haarcascade_eye_tree_eyeglas
int
main
(
int
argc
,
const
char
**
argv
)
{
CvCapture
*
capture
=
0
;
Mat
frame
,
frameCopy
,
image
;
VideoCapture
capture
;
Mat
frame
,
image
;
const
string
scaleOpt
=
"--scale="
;
size_t
scaleOptLen
=
scaleOpt
.
length
();
const
string
cascadeOpt
=
"--cascade="
;
...
...
@@ -103,17 +93,17 @@ int main( int argc, const char** argv )
if
(
inputName
.
empty
()
||
(
isdigit
(
inputName
.
c_str
()[
0
])
&&
inputName
.
c_str
()[
1
]
==
'\0'
)
)
{
capture
=
cvCaptureFromCAM
(
inputName
.
empty
()
?
0
:
inputName
.
c_str
()[
0
]
-
'0'
);
int
c
=
inputName
.
empty
()
?
0
:
inputName
.
c_str
()[
0
]
-
'0'
;
if
(
!
capture
)
cout
<<
"Capture from CAM "
<<
c
<<
" didn't work"
<<
endl
;
if
(
!
capture
.
open
(
c
))
cout
<<
"Capture from camera #"
<<
c
<<
" didn't work"
<<
endl
;
}
else
if
(
inputName
.
size
()
)
{
image
=
imread
(
inputName
,
1
);
if
(
image
.
empty
()
)
{
capture
=
cvCaptureFromAVI
(
inputName
.
c_str
()
);
if
(
!
capture
)
cout
<<
"Capture from AVI didn't work"
<<
endl
;
if
(
!
capture
.
open
(
inputName
))
cout
<<
"Could not read "
<<
inputName
<<
endl
;
}
}
else
...
...
@@ -122,36 +112,27 @@ int main( int argc, const char** argv )
if
(
image
.
empty
())
cout
<<
"Couldn't read ../data/lena.jpg"
<<
endl
;
}
cvNamedWindow
(
"result"
,
1
);
if
(
capture
)
if
(
capture
.
isOpened
()
)
{
cout
<<
"In capture ..."
<<
endl
;
cout
<<
"Video capturing has been started ..."
<<
endl
;
for
(;;)
{
IplImage
*
iplImg
=
cvQueryFrame
(
capture
);
frame
=
cv
::
cvarrToMat
(
iplImg
);
capture
>>
frame
;
if
(
frame
.
empty
()
)
break
;
if
(
iplImg
->
origin
==
IPL_ORIGIN_TL
)
frame
.
copyTo
(
frameCopy
);
else
flip
(
frame
,
frameCopy
,
0
);
detectAndDraw
(
frameCopy
,
cascade
,
nestedCascade
,
scale
,
tryflip
);
Mat
frame1
=
frame
.
clone
();
detectAndDraw
(
frame1
,
cascade
,
nestedCascade
,
scale
,
tryflip
);
if
(
waitKey
(
10
)
>=
0
)
goto
_cleanup_
;
int
c
=
waitKey
(
10
);
if
(
c
==
27
||
c
==
'q'
||
c
==
'Q'
)
break
;
}
waitKey
(
0
);
_cleanup_:
cvReleaseCapture
(
&
capture
);
}
else
{
cout
<<
"
In image read"
<<
endl
;
cout
<<
"
Detecting face(s) in "
<<
inputName
<<
endl
;
if
(
!
image
.
empty
()
)
{
detectAndDraw
(
image
,
cascade
,
nestedCascade
,
scale
,
tryflip
);
...
...
@@ -190,8 +171,6 @@ _cleanup_:
}
}
cvDestroyWindow
(
"result"
);
return
0
;
}
...
...
@@ -199,21 +178,24 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier
&
nestedCascade
,
double
scale
,
bool
tryflip
)
{
int
i
=
0
;
double
t
=
0
;
vector
<
Rect
>
faces
,
faces2
;
const
static
Scalar
colors
[]
=
{
CV_RGB
(
0
,
0
,
255
),
CV_RGB
(
0
,
128
,
255
),
CV_RGB
(
0
,
255
,
255
),
CV_RGB
(
0
,
255
,
0
),
CV_RGB
(
255
,
128
,
0
),
CV_RGB
(
255
,
255
,
0
),
CV_RGB
(
255
,
0
,
0
),
CV_RGB
(
255
,
0
,
255
)}
;
Mat
gray
,
smallImg
(
cvRound
(
img
.
rows
/
scale
),
cvRound
(
img
.
cols
/
scale
),
CV_8UC1
);
const
static
Scalar
colors
[]
=
{
Scalar
(
255
,
0
,
0
),
Scalar
(
255
,
128
,
0
),
Scalar
(
255
,
255
,
0
),
Scalar
(
0
,
255
,
0
),
Scalar
(
0
,
128
,
255
),
Scalar
(
0
,
255
,
255
),
Scalar
(
0
,
0
,
255
),
Scalar
(
255
,
0
,
255
)
};
Mat
gray
,
smallImg
;
cvtColor
(
img
,
gray
,
COLOR_BGR2GRAY
);
resize
(
gray
,
smallImg
,
smallImg
.
size
(),
0
,
0
,
INTER_LINEAR
);
double
fx
=
1
/
scale
;
resize
(
gray
,
smallImg
,
Size
(),
fx
,
fx
,
INTER_LINEAR
);
equalizeHist
(
smallImg
,
smallImg
);
t
=
(
double
)
cvGetTickCount
();
...
...
@@ -221,8 +203,7 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
1.1
,
2
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
if
(
tryflip
)
{
...
...
@@ -231,8 +212,7 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
1.1
,
2
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
for
(
vector
<
Rect
>::
const_iterator
r
=
faces2
.
begin
();
r
!=
faces2
.
end
();
r
++
)
{
...
...
@@ -241,44 +221,45 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
}
t
=
(
double
)
cvGetTickCount
()
-
t
;
printf
(
"detection time = %g ms
\n
"
,
t
/
((
double
)
cvGetTickFrequency
()
*
1000.
)
);
for
(
vector
<
Rect
>::
const_iterator
r
=
faces
.
begin
();
r
!=
faces
.
end
();
r
++
,
i
++
)
for
(
size_t
i
=
0
;
i
<
faces
.
size
();
i
++
)
{
Rect
r
=
faces
[
i
];
Mat
smallImgROI
;
vector
<
Rect
>
nestedObjects
;
Point
center
;
Scalar
color
=
colors
[
i
%
8
];
int
radius
;
double
aspect_ratio
=
(
double
)
r
->
width
/
r
->
height
;
double
aspect_ratio
=
(
double
)
r
.
width
/
r
.
height
;
if
(
0.75
<
aspect_ratio
&&
aspect_ratio
<
1.3
)
{
center
.
x
=
cvRound
((
r
->
x
+
r
->
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
->
y
+
r
->
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
r
->
width
+
r
->
height
)
*
0.25
*
scale
);
center
.
x
=
cvRound
((
r
.
x
+
r
.
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
.
y
+
r
.
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
r
.
width
+
r
.
height
)
*
0.25
*
scale
);
circle
(
img
,
center
,
radius
,
color
,
3
,
8
,
0
);
}
else
rectangle
(
img
,
cvPoint
(
cvRound
(
r
->
x
*
scale
),
cvRound
(
r
->
y
*
scale
)),
cvPoint
(
cvRound
((
r
->
x
+
r
->
width
-
1
)
*
scale
),
cvRound
((
r
->
y
+
r
->
height
-
1
)
*
scale
)),
rectangle
(
img
,
cvPoint
(
cvRound
(
r
.
x
*
scale
),
cvRound
(
r
.
y
*
scale
)),
cvPoint
(
cvRound
((
r
.
x
+
r
.
width
-
1
)
*
scale
),
cvRound
((
r
.
y
+
r
.
height
-
1
)
*
scale
)),
color
,
3
,
8
,
0
);
if
(
nestedCascade
.
empty
()
)
continue
;
smallImgROI
=
smallImg
(
*
r
);
smallImgROI
=
smallImg
(
r
);
nestedCascade
.
detectMultiScale
(
smallImgROI
,
nestedObjects
,
1.1
,
2
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
//|CASCADE_DO_CANNY_PRUNING
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
for
(
vector
<
Rect
>::
const_iterator
nr
=
nestedObjects
.
begin
();
nr
!=
nestedObjects
.
end
();
nr
++
)
for
(
size_t
j
=
0
;
j
<
nestedObjects
.
size
();
j
++
)
{
center
.
x
=
cvRound
((
r
->
x
+
nr
->
x
+
nr
->
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
->
y
+
nr
->
y
+
nr
->
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
nr
->
width
+
nr
->
height
)
*
0.25
*
scale
);
Rect
nr
=
nestedObjects
[
j
];
center
.
x
=
cvRound
((
r
.
x
+
nr
.
x
+
nr
.
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
.
y
+
nr
.
y
+
nr
.
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
nr
.
width
+
nr
.
height
)
*
0.25
*
scale
);
circle
(
img
,
center
,
radius
,
color
,
3
,
8
,
0
);
}
}
cv
::
imshow
(
"result"
,
img
);
imshow
(
"result"
,
img
);
}
samples/cpp/smiledetect.cpp
View file @
fd4761ba
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/videoio/videoio_c.h"
#include "opencv2/highgui/highgui_c.h"
#include <cctype>
#include <iostream>
#include <iterator>
#include <stdio.h>
using
namespace
std
;
using
namespace
cv
;
...
...
@@ -36,11 +28,10 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
string
cascadeName
=
"../../data/haarcascades/haarcascade_frontalface_alt.xml"
;
string
nestedCascadeName
=
"../../data/haarcascades/haarcascade_smile.xml"
;
int
main
(
int
argc
,
const
char
**
argv
)
{
CvCapture
*
capture
=
0
;
Mat
frame
,
frameCopy
,
image
;
VideoCapture
capture
;
Mat
frame
,
image
;
const
string
scaleOpt
=
"--scale="
;
size_t
scaleOptLen
=
scaleOpt
.
length
();
const
string
cascadeOpt
=
"--cascade="
;
...
...
@@ -104,44 +95,34 @@ int main( int argc, const char** argv )
if
(
inputName
.
empty
()
||
(
isdigit
(
inputName
.
c_str
()[
0
])
&&
inputName
.
c_str
()[
1
]
==
'\0'
)
)
{
capture
=
cvCaptureFromCAM
(
inputName
.
empty
()
?
0
:
inputName
.
c_str
()[
0
]
-
'0'
);
int
c
=
inputName
.
empty
()
?
0
:
inputName
.
c_str
()[
0
]
-
'0'
;
if
(
!
capture
)
cout
<<
"Capture from CAM "
<<
c
<<
" didn't work"
<<
endl
;
if
(
!
capture
.
open
(
c
))
cout
<<
"Capture from camera #"
<<
c
<<
" didn't work"
<<
endl
;
}
else
if
(
inputName
.
size
()
)
{
capture
=
cvCaptureFromAVI
(
inputName
.
c_str
()
);
if
(
!
capture
)
cout
<<
"Capture from AVI didn't work"
<<
endl
;
if
(
!
capture
.
open
(
inputName
))
cout
<<
"Could not read "
<<
inputName
<<
endl
;
}
cvNamedWindow
(
"result"
,
1
);
if
(
capture
)
if
(
capture
.
isOpened
()
)
{
cout
<<
"
In capture
..."
<<
endl
;
cout
<<
"
Video capturing has been started
..."
<<
endl
;
cout
<<
endl
<<
"NOTE: Smile intensity will only be valid after a first smile has been detected"
<<
endl
;
for
(;;)
{
IplImage
*
iplImg
=
cvQueryFrame
(
capture
);
frame
=
cv
::
cvarrToMat
(
iplImg
);
capture
>>
frame
;
if
(
frame
.
empty
()
)
break
;
if
(
iplImg
->
origin
==
IPL_ORIGIN_TL
)
frame
.
copyTo
(
frameCopy
);
else
flip
(
frame
,
frameCopy
,
0
);
detectAndDraw
(
frameCopy
,
cascade
,
nestedCascade
,
scale
,
tryflip
);
Mat
frame1
=
frame
.
clone
();
detectAndDraw
(
frame1
,
cascade
,
nestedCascade
,
scale
,
tryflip
);
if
(
waitKey
(
10
)
>=
0
)
goto
_cleanup_
;
int
c
=
waitKey
(
10
);
if
(
c
==
27
||
c
==
'q'
||
c
==
'Q'
)
break
;
}
waitKey
(
0
);
_cleanup_:
cvReleaseCapture
(
&
capture
);
}
else
{
...
...
@@ -150,7 +131,6 @@ _cleanup_:
return
-
1
;
}
cvDestroyWindow
(
"result"
);
return
0
;
}
...
...
@@ -158,28 +138,31 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier
&
nestedCascade
,
double
scale
,
bool
tryflip
)
{
int
i
=
0
;
vector
<
Rect
>
faces
,
faces2
;
const
static
Scalar
colors
[]
=
{
CV_RGB
(
0
,
0
,
255
),
CV_RGB
(
0
,
128
,
255
),
CV_RGB
(
0
,
255
,
255
),
CV_RGB
(
0
,
255
,
0
),
CV_RGB
(
255
,
128
,
0
),
CV_RGB
(
255
,
255
,
0
),
CV_RGB
(
255
,
0
,
0
),
CV_RGB
(
255
,
0
,
255
)}
;
Mat
gray
,
smallImg
(
cvRound
(
img
.
rows
/
scale
),
cvRound
(
img
.
cols
/
scale
),
CV_8UC1
);
const
static
Scalar
colors
[]
=
{
Scalar
(
255
,
0
,
0
),
Scalar
(
255
,
128
,
0
),
Scalar
(
255
,
255
,
0
),
Scalar
(
0
,
255
,
0
),
Scalar
(
0
,
128
,
255
),
Scalar
(
0
,
255
,
255
),
Scalar
(
0
,
0
,
255
),
Scalar
(
255
,
0
,
255
)
};
Mat
gray
,
smallImg
;
cvtColor
(
img
,
gray
,
COLOR_BGR2GRAY
);
resize
(
gray
,
smallImg
,
smallImg
.
size
(),
0
,
0
,
INTER_LINEAR
);
double
fx
=
1
/
scale
;
resize
(
gray
,
smallImg
,
Size
(),
fx
,
fx
,
INTER_LINEAR
);
equalizeHist
(
smallImg
,
smallImg
);
cascade
.
detectMultiScale
(
smallImg
,
faces
,
1.1
,
2
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
if
(
tryflip
)
{
...
...
@@ -188,8 +171,7 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
1.1
,
2
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
for
(
vector
<
Rect
>::
const_iterator
r
=
faces2
.
begin
();
r
!=
faces2
.
end
();
r
++
)
{
...
...
@@ -197,38 +179,38 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
}
}
for
(
vector
<
Rect
>::
iterator
r
=
faces
.
begin
();
r
!=
faces
.
end
();
r
++
,
i
++
)
for
(
size_t
i
=
0
;
i
<
faces
.
size
();
i
++
)
{
Rect
r
=
faces
[
i
];
Mat
smallImgROI
;
vector
<
Rect
>
nestedObjects
;
Point
center
;
Scalar
color
=
colors
[
i
%
8
];
int
radius
;
double
aspect_ratio
=
(
double
)
r
->
width
/
r
->
height
;
double
aspect_ratio
=
(
double
)
r
.
width
/
r
.
height
;
if
(
0.75
<
aspect_ratio
&&
aspect_ratio
<
1.3
)
{
center
.
x
=
cvRound
((
r
->
x
+
r
->
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
->
y
+
r
->
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
r
->
width
+
r
->
height
)
*
0.25
*
scale
);
center
.
x
=
cvRound
((
r
.
x
+
r
.
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
.
y
+
r
.
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
r
.
width
+
r
.
height
)
*
0.25
*
scale
);
circle
(
img
,
center
,
radius
,
color
,
3
,
8
,
0
);
}
else
rectangle
(
img
,
cvPoint
(
cvRound
(
r
->
x
*
scale
),
cvRound
(
r
->
y
*
scale
)),
cvPoint
(
cvRound
((
r
->
x
+
r
->
width
-
1
)
*
scale
),
cvRound
((
r
->
y
+
r
->
height
-
1
)
*
scale
)),
rectangle
(
img
,
cvPoint
(
cvRound
(
r
.
x
*
scale
),
cvRound
(
r
.
y
*
scale
)),
cvPoint
(
cvRound
((
r
.
x
+
r
.
width
-
1
)
*
scale
),
cvRound
((
r
.
y
+
r
.
height
-
1
)
*
scale
)),
color
,
3
,
8
,
0
);
const
int
half_height
=
cvRound
((
float
)
r
->
height
/
2
);
r
->
y
=
r
->
y
+
half_height
;
r
->
height
=
half_height
;
smallImgROI
=
smallImg
(
*
r
);
const
int
half_height
=
cvRound
((
float
)
r
.
height
/
2
);
r
.
y
=
r
.
y
+
half_height
;
r
.
height
=
half_height
-
1
;
smallImgROI
=
smallImg
(
r
);
nestedCascade
.
detectMultiScale
(
smallImgROI
,
nestedObjects
,
1.1
,
0
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
//|CASCADE_DO_CANNY_PRUNING
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
// The number of detected neighbors depends on image size (and also illumination, etc.). The
...
...
@@ -243,9 +225,9 @@ void detectAndDraw( Mat& img, CascadeClassifier& cascade,
// Draw rectangle on the left side of the image reflecting smile intensity
float
intensityZeroOne
=
((
float
)
smile_neighbors
-
min_neighbors
)
/
(
max_neighbors
-
min_neighbors
+
1
);
int
rect_height
=
cvRound
((
float
)
img
.
rows
*
intensityZeroOne
);
CvScalar
col
=
CV_RGB
((
float
)
255
*
intensityZeroOne
,
0
,
0
);
Scalar
col
=
Scalar
((
float
)
255
*
intensityZeroOne
,
0
,
0
);
rectangle
(
img
,
cvPoint
(
0
,
img
.
rows
),
cvPoint
(
img
.
cols
/
10
,
img
.
rows
-
rect_height
),
col
,
-
1
);
}
cv
::
imshow
(
"result"
,
img
);
imshow
(
"result"
,
img
);
}
samples/
cpp
/ufacedetect.cpp
→
samples/
tapi
/ufacedetect.cpp
View file @
fd4761ba
#include "opencv2/objdetect.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/core/ocl.hpp"
#include <cctype>
#include <iostream>
#include <iterator>
#include <stdio.h>
using
namespace
std
;
using
namespace
cv
;
...
...
@@ -20,13 +13,13 @@ static void help()
"This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.
\n
"
"It's most known use is for faces.
\n
"
"Usage:
\n
"
"./facedetect [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]
\n
"
"./
u
facedetect [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]
\n
"
" [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]
\n
"
" [--scale=<image scale greater or equal to 1, try 1.3 for example>]
\n
"
" [--try-flip]
\n
"
" [filename|camera_index]
\n\n
"
"see facedetect.cmd for one call:
\n
"
"./
facedetect --cascade=
\"
../../data/haarcascades/haarcascade_frontalface_alt.xml
\"
--nested-cascade=
\"
../../data/haarcascades/haarcascade_eye
.xml
\"
--scale=1.3
\n\n
"
"./
ufacedetect --cascade=
\"
../../data/haarcascades/haarcascade_frontalface_alt.xml
\"
--nested-cascade=
\"
../../data/haarcascades/haarcascade_eye_tree_eyeglasses
.xml
\"
--scale=1.3
\n\n
"
"During execution:
\n\t
Hit any key to quit.
\n
"
"
\t
Using OpenCV version "
<<
CV_VERSION
<<
"
\n
"
<<
endl
;
}
...
...
@@ -76,7 +69,7 @@ int main( int argc, const char** argv )
}
else
if
(
scaleOpt
.
compare
(
0
,
scaleOptLen
,
argv
[
i
],
scaleOptLen
)
==
0
)
{
if
(
!
sscanf
(
argv
[
i
]
+
scaleOpt
.
length
(),
"%lf"
,
&
scale
)
||
scale
>
1
)
if
(
!
sscanf
(
argv
[
i
]
+
scaleOpt
.
length
(),
"%lf"
,
&
scale
)
)
scale
=
1
;
cout
<<
" from which we read scale = "
<<
scale
<<
endl
;
}
...
...
@@ -87,7 +80,7 @@ int main( int argc, const char** argv )
}
else
if
(
argv
[
i
][
0
]
==
'-'
)
{
cerr
<<
"WARNING: Unknown option
%s
"
<<
argv
[
i
]
<<
endl
;
cerr
<<
"WARNING: Unknown option "
<<
argv
[
i
]
<<
endl
;
}
else
inputName
=
argv
[
i
];
...
...
@@ -120,8 +113,6 @@ int main( int argc, const char** argv )
}
}
namedWindow
(
"result"
,
1
);
if
(
capture
.
isOpened
()
)
{
cout
<<
"Video capturing has been started ..."
<<
endl
;
...
...
@@ -133,7 +124,8 @@ int main( int argc, const char** argv )
detectAndDraw
(
frame
,
canvas
,
cascade
,
nestedCascade
,
scale
,
tryflip
);
if
(
waitKey
(
10
)
>=
0
)
int
c
=
waitKey
(
10
);
if
(
c
==
27
||
c
==
'q'
||
c
==
'Q'
)
break
;
}
}
...
...
@@ -183,46 +175,44 @@ int main( int argc, const char** argv )
void
detectAndDraw
(
UMat
&
img
,
Mat
&
canvas
,
CascadeClassifier
&
cascade
,
CascadeClassifier
&
nestedCascade
,
double
scale
0
,
bool
tryflip
)
double
scale
,
bool
tryflip
)
{
int
i
=
0
;
double
t
=
0
,
scale
=
1
;
double
t
=
0
;
vector
<
Rect
>
faces
,
faces2
;
const
static
Scalar
colors
[]
=
{
Scalar
(
0
,
0
,
255
),
Scalar
(
0
,
128
,
255
),
Scalar
(
0
,
255
,
255
),
Scalar
(
0
,
255
,
0
),
Scalar
(
255
,
0
,
0
),
Scalar
(
255
,
128
,
0
),
Scalar
(
255
,
255
,
0
),
Scalar
(
255
,
0
,
0
),
Scalar
(
0
,
255
,
0
),
Scalar
(
0
,
128
,
255
),
Scalar
(
0
,
255
,
255
),
Scalar
(
0
,
0
,
255
),
Scalar
(
255
,
0
,
255
)
};
static
UMat
gray
,
smallImg
;
t
=
(
double
)
getTickCount
();
resize
(
img
,
smallImg
,
Size
(),
scale0
,
scale0
,
INTER_LINEAR
);
cvtColor
(
smallImg
,
gray
,
COLOR_BGR2GRAY
);
equalizeHist
(
gray
,
gray
);
cvtColor
(
img
,
gray
,
COLOR_BGR2GRAY
);
double
fx
=
1
/
scale
;
resize
(
gray
,
smallImg
,
Size
(),
fx
,
fx
,
INTER_LINEAR
);
equalizeHist
(
smallImg
,
smallImg
);
cascade
.
detectMultiScale
(
gray
,
faces
,
cascade
.
detectMultiScale
(
smallImg
,
faces
,
1.1
,
3
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
if
(
tryflip
)
{
flip
(
gray
,
gray
,
1
);
cascade
.
detectMultiScale
(
gray
,
faces2
,
flip
(
smallImg
,
smallImg
,
1
);
cascade
.
detectMultiScale
(
smallImg
,
faces2
,
1.1
,
2
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
for
(
vector
<
Rect
>::
const_iterator
r
=
faces2
.
begin
();
r
!=
faces2
.
end
();
r
++
)
{
...
...
@@ -230,7 +220,7 @@ void detectAndDraw( UMat& img, Mat& canvas, CascadeClassifier& cascade,
}
}
t
=
(
double
)
getTickCount
()
-
t
;
smallI
mg
.
copyTo
(
canvas
);
i
mg
.
copyTo
(
canvas
);
double
fps
=
getTickFrequency
()
/
t
;
static
double
avgfps
=
0
;
...
...
@@ -242,41 +232,43 @@ void detectAndDraw( UMat& img, Mat& canvas, CascadeClassifier& cascade,
putText
(
canvas
,
format
(
"OpenCL: %s, fps: %.1f"
,
ocl
::
useOpenCL
()
?
"ON"
:
"OFF"
,
avgfps
),
Point
(
50
,
30
),
FONT_HERSHEY_SIMPLEX
,
0.8
,
Scalar
(
0
,
255
,
0
),
2
);
for
(
vector
<
Rect
>::
const_iterator
r
=
faces
.
begin
();
r
!=
faces
.
end
();
r
++
,
i
++
)
for
(
size_t
i
=
0
;
i
<
faces
.
size
();
i
++
)
{
Rect
r
=
faces
[
i
];
vector
<
Rect
>
nestedObjects
;
Point
center
;
Scalar
color
=
colors
[
i
%
8
];
int
radius
;
double
aspect_ratio
=
(
double
)
r
->
width
/
r
->
height
;
double
aspect_ratio
=
(
double
)
r
.
width
/
r
.
height
;
if
(
0.75
<
aspect_ratio
&&
aspect_ratio
<
1.3
)
{
center
.
x
=
cvRound
((
r
->
x
+
r
->
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
->
y
+
r
->
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
r
->
width
+
r
->
height
)
*
0.25
*
scale
);
center
.
x
=
cvRound
((
r
.
x
+
r
.
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
.
y
+
r
.
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
r
.
width
+
r
.
height
)
*
0.25
*
scale
);
circle
(
canvas
,
center
,
radius
,
color
,
3
,
8
,
0
);
}
else
rectangle
(
canvas
,
Point
(
cvRound
(
r
->
x
*
scale
),
cvRound
(
r
->
y
*
scale
)),
Point
(
cvRound
((
r
->
x
+
r
->
width
-
1
)
*
scale
),
cvRound
((
r
->
y
+
r
->
height
-
1
)
*
scale
)),
rectangle
(
canvas
,
Point
(
cvRound
(
r
.
x
*
scale
),
cvRound
(
r
.
y
*
scale
)),
Point
(
cvRound
((
r
.
x
+
r
.
width
-
1
)
*
scale
),
cvRound
((
r
.
y
+
r
.
height
-
1
)
*
scale
)),
color
,
3
,
8
,
0
);
if
(
nestedCascade
.
empty
()
)
continue
;
UMat
smallImgROI
=
gray
(
*
r
);
UMat
smallImgROI
=
smallImg
(
r
);
nestedCascade
.
detectMultiScale
(
smallImgROI
,
nestedObjects
,
1.1
,
2
,
0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
//|CASCADE_DO_CANNY_PRUNING
|
CASCADE_SCALE_IMAGE
,
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
for
(
vector
<
Rect
>::
const_iterator
nr
=
nestedObjects
.
begin
();
nr
!=
nestedObjects
.
end
();
nr
++
)
for
(
size_t
j
=
0
;
j
<
nestedObjects
.
size
();
j
++
)
{
center
.
x
=
cvRound
((
r
->
x
+
nr
->
x
+
nr
->
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
->
y
+
nr
->
y
+
nr
->
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
nr
->
width
+
nr
->
height
)
*
0.25
*
scale
);
Rect
nr
=
nestedObjects
[
j
];
center
.
x
=
cvRound
((
r
.
x
+
nr
.
x
+
nr
.
width
*
0.5
)
*
scale
);
center
.
y
=
cvRound
((
r
.
y
+
nr
.
y
+
nr
.
height
*
0.5
)
*
scale
);
radius
=
cvRound
((
nr
.
width
+
nr
.
height
)
*
0.25
*
scale
);
circle
(
canvas
,
center
,
radius
,
color
,
3
,
8
,
0
);
}
}
...
...
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