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
580677f4
Commit
580677f4
authored
Aug 23, 2013
by
Roman Donchenko
Committed by
OpenCV Buildbot
Aug 23, 2013
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1304 from berak:doc_tut_cascade
parents
365def60
50288f13
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
183 additions
and
204 deletions
+183
-204
cascade_classifier.rst
...rials/objdetect/cascade_classifier/cascade_classifier.rst
+75
-76
objectDetection.cpp
...les/cpp/tutorial_code/objectDetection/objectDetection.cpp
+52
-66
objectDetection2.cpp
...es/cpp/tutorial_code/objectDetection/objectDetection2.cpp
+56
-62
No files found.
doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst
View file @
580677f4
...
...
@@ -26,91 +26,90 @@ This tutorial code's is shown lines below. You can also download it from `here <
.. code-block:: cpp
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
/** Function Headers */
void detectAndDisplay( Mat frame );
/** Global variables */
String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
string window_name = "Capture - Face detection";
RNG rng(12345);
/** @function main */
int main( int argc, const char** argv )
{
CvCapture* capture;
Mat frame;
//-- 1. Load the cascades
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
//-- 2. Read the video stream
capture = cvCaptureFromCAM( -1 );
if( capture )
{
while( true )
{
frame = cvQueryFrame( capture );
//-- 3. Apply the classifier to the frame
if( !frame.empty() )
{ detectAndDisplay( frame ); }
else
{ printf(" --(!) No captured frame -- Break!"); break; }
int c = waitKey(10);
if( (char)c == 'c' ) { break; }
}
}
return 0;
}
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
/** @function detectAndDisplay */
void detectAndDisplay( Mat frame )
{
std::vector<Rect> faces;
Mat frame_gray;
/** Function Headers */
void detectAndDisplay( Mat frame );
cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );
/** Global variables */
String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
String window_name = "Capture - Face detection";
//-- Detect faces
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
/** @function main */
int main( void )
{
VideoCapture capture;
Mat frame;
//-- 1. Load the cascades
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading face cascade\n"); return -1; };
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading eyes cascade\n"); return -1; };
//-- 2. Read the video stream
capture.open( -1 );
if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }
while ( capture.read(frame) )
{
if( frame.empty() )
{
printf(" --(!) No captured frame -- Break!");
break;
}
//-- 3. Apply the classifier to the frame
detectAndDisplay( frame );
int c = waitKey(10);
if( (char)c == 27 ) { break; } // escape
}
return 0;
}
for( int i = 0; i < faces.size(); i++ )
/** @function detectAndDisplay */
void detectAndDisplay( Mat frame )
{
Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
std::vector<Rect> faces;
Mat frame_gray;
cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );
//-- Detect faces
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );
Mat faceROI = frame_gray( faces[i] );
std::vector<Rect> eyes;
for( size_t i = 0; i < faces.size(); i++ )
{
Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
//-- In each face, detect eyes
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) )
;
Mat faceROI = frame_gray( faces[i] );
std::vector<Rect> eyes
;
for( int j = 0; j < eyes.size(); j++ )
{
Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
}
//-- In each face, detect eyes
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CASCADE_SCALE_IMAGE, Size(30, 30) );
for( size_t j = 0; j < eyes.size(); j++ )
{
Point eye_center( faces[i].x + eyes[j].x + eyes[j].width/2, faces[i].y + eyes[j].y + eyes[j].height/2 );
int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
}
}
//-- Show what you got
imshow( window_name, frame );
}
//-- Show what you got
imshow( window_name, frame );
}
Explanation
============
...
...
samples/cpp/tutorial_code/objectDetection/objectDetection.cpp
View file @
580677f4
/**
* @file objectDetection.cpp
* @author A. Huaman ( based in the classic facedetect.cpp in samples/c )
* @brief A simplified version of facedetect.cpp, show how to load a cascade classifier and how to find objects (Face + eyes) in a video stream
*/
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
...
...
@@ -20,79 +12,73 @@ using namespace cv;
void
detectAndDisplay
(
Mat
frame
);
/** Global variables */
//-- Note, either copy these two files from opencv/data/haarscascades to your current folder, or change these locations
string
face_cascade_name
=
"haarcascade_frontalface_alt.xml"
;
string
eyes_cascade_name
=
"haarcascade_eye_tree_eyeglasses.xml"
;
String
face_cascade_name
=
"haarcascade_frontalface_alt.xml"
;
String
eyes_cascade_name
=
"haarcascade_eye_tree_eyeglasses.xml"
;
CascadeClassifier
face_cascade
;
CascadeClassifier
eyes_cascade
;
string
window_name
=
"Capture - Face detection"
;
RNG
rng
(
12345
);
String
window_name
=
"Capture - Face detection"
;
/**
* @function main
*/
/** @function main */
int
main
(
void
)
{
CvCapture
*
capture
;
Mat
frame
;
//-- 1. Load the cascades
if
(
!
face_cascade
.
load
(
face_cascade_name
)
){
printf
(
"--(!)Error loading
\n
"
);
return
-
1
;
};
if
(
!
eyes_cascade
.
load
(
eyes_cascade_name
)
){
printf
(
"--(!)Error loading
\n
"
);
return
-
1
;
};
//-- 2. Read the video stream
capture
=
cvCaptureFromCAM
(
-
1
);
if
(
capture
)
{
for
(;;)
{
frame
=
cv
::
cvarrToMat
(
cvQueryFrame
(
capture
));
VideoCapture
capture
;
Mat
frame
;
//-- 1. Load the cascades
if
(
!
face_cascade
.
load
(
face_cascade_name
)
){
printf
(
"--(!)Error loading face cascade
\n
"
);
return
-
1
;
};
if
(
!
eyes_cascade
.
load
(
eyes_cascade_name
)
){
printf
(
"--(!)Error loading eyes cascade
\n
"
);
return
-
1
;
};
//-- 3. Apply the classifier to the frame
if
(
!
frame
.
empty
()
)
{
detectAndDisplay
(
frame
);
}
else
{
printf
(
" --(!) No captured frame -- Break!"
);
break
;
}
//-- 2. Read the video stream
capture
.
open
(
-
1
);
if
(
!
capture
.
isOpened
()
)
{
printf
(
"--(!)Error opening video capture
\n
"
);
return
-
1
;
}
int
c
=
waitKey
(
10
);
if
(
(
char
)
c
==
'c'
)
{
break
;
}
while
(
capture
.
read
(
frame
)
)
{
if
(
frame
.
empty
()
)
{
printf
(
" --(!) No captured frame -- Break!"
);
break
;
}
//-- 3. Apply the classifier to the frame
detectAndDisplay
(
frame
);
int
c
=
waitKey
(
10
);
if
(
(
char
)
c
==
27
)
{
break
;
}
// escape
}
}
return
0
;
return
0
;
}
/**
* @function detectAndDisplay
*/
/** @function detectAndDisplay */
void
detectAndDisplay
(
Mat
frame
)
{
std
::
vector
<
Rect
>
faces
;
Mat
frame_gray
;
std
::
vector
<
Rect
>
faces
;
Mat
frame_gray
;
cvtColor
(
frame
,
frame_gray
,
COLOR_BGR2GRAY
);
equalizeHist
(
frame_gray
,
frame_gray
);
cvtColor
(
frame
,
frame_gray
,
COLOR_BGR2GRAY
);
equalizeHist
(
frame_gray
,
frame_gray
);
//-- Detect faces
face_cascade
.
detectMultiScale
(
frame_gray
,
faces
,
1.1
,
2
,
0
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
//-- Detect faces
face_cascade
.
detectMultiScale
(
frame_gray
,
faces
,
1.1
,
2
,
0
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
for
(
size_t
i
=
0
;
i
<
faces
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
faces
.
size
();
i
++
)
{
Point
center
(
faces
[
i
].
x
+
faces
[
i
].
width
/
2
,
faces
[
i
].
y
+
faces
[
i
].
height
/
2
);
ellipse
(
frame
,
center
,
Size
(
faces
[
i
].
width
/
2
,
faces
[
i
].
height
/
2
),
0
,
0
,
360
,
Scalar
(
255
,
0
,
255
),
2
,
8
,
0
);
Point
center
(
faces
[
i
].
x
+
faces
[
i
].
width
/
2
,
faces
[
i
].
y
+
faces
[
i
].
height
/
2
);
ellipse
(
frame
,
center
,
Size
(
faces
[
i
].
width
/
2
,
faces
[
i
].
height
/
2
),
0
,
0
,
360
,
Scalar
(
255
,
0
,
255
),
4
,
8
,
0
);
Mat
faceROI
=
frame_gray
(
faces
[
i
]
);
std
::
vector
<
Rect
>
eyes
;
Mat
faceROI
=
frame_gray
(
faces
[
i
]
);
std
::
vector
<
Rect
>
eyes
;
//-- In each face, detect eyes
eyes_cascade
.
detectMultiScale
(
faceROI
,
eyes
,
1.1
,
2
,
0
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
//-- In each face, detect eyes
eyes_cascade
.
detectMultiScale
(
faceROI
,
eyes
,
1.1
,
2
,
0
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
for
(
size_t
j
=
0
;
j
<
eyes
.
size
();
j
++
)
{
Point
eye_center
(
faces
[
i
].
x
+
eyes
[
j
].
x
+
eyes
[
j
].
width
/
2
,
faces
[
i
].
y
+
eyes
[
j
].
y
+
eyes
[
j
].
height
/
2
);
int
radius
=
cvRound
(
(
eyes
[
j
].
width
+
eyes
[
j
].
height
)
*
0.25
);
circle
(
frame
,
eye_center
,
radius
,
Scalar
(
255
,
0
,
0
),
3
,
8
,
0
);
}
for
(
size_t
j
=
0
;
j
<
eyes
.
size
();
j
++
)
{
Point
eye_center
(
faces
[
i
].
x
+
eyes
[
j
].
x
+
eyes
[
j
].
width
/
2
,
faces
[
i
].
y
+
eyes
[
j
].
y
+
eyes
[
j
].
height
/
2
);
int
radius
=
cvRound
(
(
eyes
[
j
].
width
+
eyes
[
j
].
height
)
*
0.25
);
circle
(
frame
,
eye_center
,
radius
,
Scalar
(
255
,
0
,
0
),
4
,
8
,
0
);
}
}
//-- Show what you got
imshow
(
window_name
,
frame
);
//-- Show what you got
imshow
(
window_name
,
frame
);
}
samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp
View file @
580677f4
...
...
@@ -3,12 +3,9 @@
* @author A. Huaman ( based in the classic facedetect.cpp in samples/c )
* @brief A simplified version of facedetect.cpp, show how to load a cascade classifier and how to find objects (Face + eyes) in a video stream - Using LBP here
*/
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
...
...
@@ -20,46 +17,43 @@ using namespace cv;
void
detectAndDisplay
(
Mat
frame
);
/** Global variables */
s
tring
face_cascade_name
=
"lbpcascade_frontalface.xml"
;
s
tring
eyes_cascade_name
=
"haarcascade_eye_tree_eyeglasses.xml"
;
S
tring
face_cascade_name
=
"lbpcascade_frontalface.xml"
;
S
tring
eyes_cascade_name
=
"haarcascade_eye_tree_eyeglasses.xml"
;
CascadeClassifier
face_cascade
;
CascadeClassifier
eyes_cascade
;
string
window_name
=
"Capture - Face detection"
;
RNG
rng
(
12345
);
String
window_name
=
"Capture - Face detection"
;
/**
* @function main
*/
int
main
(
void
)
{
CvCapture
*
capture
;
Mat
frame
;
//-- 1. Load the cascade
if
(
!
face_cascade
.
load
(
face_cascade_name
)
){
printf
(
"--(!)Error loading
\n
"
);
return
-
1
;
};
if
(
!
eyes_cascade
.
load
(
eyes_cascade_name
)
){
printf
(
"--(!)Error loading
\n
"
);
return
-
1
;
};
//-- 2. Read the video stream
capture
=
cvCaptureFromCAM
(
-
1
);
if
(
capture
)
{
for
(;;)
{
frame
=
cv
::
cvarrToMat
(
cvQueryFrame
(
capture
));
VideoCapture
capture
;
Mat
frame
;
//-- 3. Apply the classifier to the frame
if
(
!
frame
.
empty
()
)
{
detectAndDisplay
(
frame
);
}
else
{
printf
(
" --(!) No captured frame -- Break!"
);
break
;
}
//-- 1. Load the cascade
if
(
!
face_cascade
.
load
(
face_cascade_name
)
){
printf
(
"--(!)Error loading face cascade
\n
"
);
return
-
1
;
};
if
(
!
eyes_cascade
.
load
(
eyes_cascade_name
)
){
printf
(
"--(!)Error loading eyes cascade
\n
"
);
return
-
1
;
};
int
c
=
waitKey
(
10
);
if
(
(
char
)
c
==
'c'
)
{
break
;
}
//-- 2. Read the video stream
capture
.
open
(
-
1
);
if
(
!
capture
.
isOpened
()
)
{
printf
(
"--(!)Error opening video capture
\n
"
);
return
-
1
;
}
while
(
capture
.
read
(
frame
)
)
{
if
(
frame
.
empty
()
)
{
printf
(
" --(!) No captured frame -- Break!"
);
break
;
}
//-- 3. Apply the classifier to the frame
detectAndDisplay
(
frame
);
//-- bail out if escape was pressed
int
c
=
waitKey
(
10
);
if
(
(
char
)
c
==
27
)
{
break
;
}
}
}
return
0
;
return
0
;
}
/**
...
...
@@ -67,37 +61,37 @@ int main( void )
*/
void
detectAndDisplay
(
Mat
frame
)
{
std
::
vector
<
Rect
>
faces
;
Mat
frame_gray
;
std
::
vector
<
Rect
>
faces
;
Mat
frame_gray
;
cvtColor
(
frame
,
frame_gray
,
COLOR_BGR2GRAY
);
equalizeHist
(
frame_gray
,
frame_gray
);
cvtColor
(
frame
,
frame_gray
,
COLOR_BGR2GRAY
);
equalizeHist
(
frame_gray
,
frame_gray
);
//-- Detect faces
face_cascade
.
detectMultiScale
(
frame_gray
,
faces
,
1.1
,
2
,
0
,
Size
(
80
,
80
)
);
//-- Detect faces
face_cascade
.
detectMultiScale
(
frame_gray
,
faces
,
1.1
,
2
,
0
,
Size
(
80
,
80
)
);
for
(
size_t
i
=
0
;
i
<
faces
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
faces
.
size
();
i
++
)
{
Mat
faceROI
=
frame_gray
(
faces
[
i
]
);
std
::
vector
<
Rect
>
eyes
;
//-- In each face, detect eyes
eyes_cascade
.
detectMultiScale
(
faceROI
,
eyes
,
1.1
,
2
,
0
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
if
(
eyes
.
size
()
==
2
)
{
//-- Draw the face
Point
center
(
faces
[
i
].
x
+
faces
[
i
].
width
/
2
,
faces
[
i
].
y
+
faces
[
i
].
height
/
2
);
ellipse
(
frame
,
center
,
Size
(
faces
[
i
].
width
/
2
,
faces
[
i
].
height
/
2
),
0
,
0
,
360
,
Scalar
(
255
,
0
,
0
),
2
,
8
,
0
);
for
(
size_t
j
=
0
;
j
<
eyes
.
size
();
j
++
)
{
//-- Draw the eyes
Point
eye_center
(
faces
[
i
].
x
+
eyes
[
j
].
x
+
eyes
[
j
].
width
/
2
,
faces
[
i
].
y
+
eyes
[
j
].
y
+
eyes
[
j
].
height
/
2
);
int
radius
=
cvRound
(
(
eyes
[
j
].
width
+
eyes
[
j
].
height
)
*
0.25
);
circle
(
frame
,
eye_center
,
radius
,
Scalar
(
255
,
0
,
255
),
3
,
8
,
0
);
}
}
Mat
faceROI
=
frame_gray
(
faces
[
i
]
);
std
::
vector
<
Rect
>
eyes
;
//-- In each face, detect eyes
eyes_cascade
.
detectMultiScale
(
faceROI
,
eyes
,
1.1
,
2
,
0
|
CASCADE_SCALE_IMAGE
,
Size
(
30
,
30
)
);
if
(
eyes
.
size
()
==
2
)
{
//-- Draw the face
Point
center
(
faces
[
i
].
x
+
faces
[
i
].
width
/
2
,
faces
[
i
].
y
+
faces
[
i
].
height
/
2
);
ellipse
(
frame
,
center
,
Size
(
faces
[
i
].
width
/
2
,
faces
[
i
].
height
/
2
),
0
,
0
,
360
,
Scalar
(
255
,
0
,
0
),
2
,
8
,
0
);
for
(
size_t
j
=
0
;
j
<
eyes
.
size
();
j
++
)
{
//-- Draw the eyes
Point
eye_center
(
faces
[
i
].
x
+
eyes
[
j
].
x
+
eyes
[
j
].
width
/
2
,
faces
[
i
].
y
+
eyes
[
j
].
y
+
eyes
[
j
].
height
/
2
);
int
radius
=
cvRound
(
(
eyes
[
j
].
width
+
eyes
[
j
].
height
)
*
0.25
);
circle
(
frame
,
eye_center
,
radius
,
Scalar
(
255
,
0
,
255
),
3
,
8
,
0
);
}
}
}
//-- Show what you got
imshow
(
window_name
,
frame
);
//-- Show what you got
imshow
(
window_name
,
frame
);
}
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