Class 4
This class covers video stream processing and face recognition in OpenCV.
We have learned how to insert decorations to any locations in a image. The next step is to use face recognition to locate the face in camera. In common sense, a video is simply a stack of a serious continuous images called frame. By extracting those frames, we can process the whole video in the same way we process the image. Hence, our plan will be:
- Stream video from camera
- Extract every single frame
- Locate human face on each frame
- Insert our decoration
- Display and loop
Processing Video
To process video file or video stream from camera, we need to use a class provided by OpenCV called VideoCapture
. This class provides convinent member functions that can access camera and extract frames easily.
- Member functions: ```cpp VideoCapture capture;
void capture.open(int deviceID);
//open the camera, for built-in camera, device ID is 0
bool capture.isOpen();
//return false if camera is not opened
bool capture.read(Mat frame); //capture frames from the stream, store frame image in Mat frame //return false if failed to read the frame
- Program structure of reading frames:
```cpp
Mat frame; //initialize a Mat object to store the frame read in
capture.open( camera_ID ); //open the camera, the primary ID for built-in camera on computer is 0
if (!stream1.isOpened()) //check if video device has been initialised
{
cout << "cannot open camera";
}
while ( capture.read(frame) ) //break the loop if frame reading fails
{
if( frame.empty() ){ //check if the frame being successfully read in
cout << "--(!) No captured frame -- Break!\n";
break;
}
imshow("camera",frame); //process your frame here
if( waitKey(1) == 2 ) //control the imshow refresh rate
{
break;
}
}
Processing Video
In this project, we will use the Haar-feature based cascade classifier to detect human face and eyes. Haar-feaure is a series of patterns that describ edges, lines, and center-surround relations in the image. The classifier can be trained to detect the Haar-features in the image. OpenCV has prepared the classifier to us. The class is called CascadeClassifier
. All we need to do is to load the machine learning file into the classifier, and do recognition on the pre-processed images.
bool classifier.load(string cascadeFilePath);
//load the xml file in system to the classifier, read in file path
//return false if file not read in
void classifier.detectMultiScale(Mat imgROI, vector<Rect> matches);
//detect the targeting object of multiple scales in the image
//imgROI can be selected manually, can also be the whole picture
//matches is a Rect vector that stores the coordinate, width, and height of the object detect in the image
Display the result
In order to result of face recognition, we can draw a rectangle around the face we detected. Here is the implementation:
//specify the two diagonal corner points of the detected region
Point corner1( matches[i].x, matches[i].y );
Point corner2( matches[i].x + matches[i].width, matches[i].y + matches[i].height);
//draw the rectangle
rectangle( img, corner1, corner2, 1, LINE_8, 0);