如何使用 C++ 在 OpenCV 中实时跟踪人脸?
opencvc++server side programmingprogramming
我们将学习如何在 OpenCV 中实时跟踪人脸。此程序与上一个程序相同,不同之处在于我们使用椭圆形而不是矩形来识别人脸,并且我们还使用了额外的"cout"语句在控制台窗口中显示人脸的坐标。
以下程序用于实时检测人脸 −
示例
#include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> //此头文件包含"rectangle()"函数的定义// #include<opencv2/objdetect/objdetect.hpp> //此头文件包含级联分类器的定义// #include<string> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat video_stream;//声明一个矩阵,用于保存视频流中的帧// VideoCapture real_time(0);//从默认网络摄像头捕获视频 namedWindow("Face Detection");//声明一个窗口来显示结果// string training_classifier_location = "C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";//以字符串形式定义 XML 训练分类器的位置// CascadeClassifier faceDetector;//声明一个名为"face detector"的 CascadeClassifier 类的对象// faceDetector.load(trained_classifier_location);//在对象中加载 XML 训练分类器// vector<Rect>faces;//声明一个名为 faces 的矩形向量// while (true) { faceDetector.detectMultiScale(video_stream, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(30, 30));//检测"image_with_humanfaces"矩阵中的人脸// real_time.read(video_stream);//从摄像头读取帧并将其加载到"video_stream"矩阵中// for (int i = 0; i < faces.size(); i++){//用于定位人脸 Point center(faces[i].x + faces[i].width * 0.5, faces[i].y + faces[i].height * 0.5);//获取人脸中心// ellipse(video_stream, center,Size(faces[i].width * 0.5, faces[i].height * 0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);//在面上绘制椭圆// int Horizontal = (faces[i].x + faces[i].width * 0.5);//获取水平坐标值// int Vertical=(faces[i].y + faces[i].width * 0.5);//获取垂直坐标值// cout << "人脸位置为:" << "(<<< 水平<< ",<<< 垂直<< ")" << endl; //在控制台窗口中显示位置// } imshow(&"人脸检测", video_stream); //显示检测到的人脸// if (waitKey(10) == 27){//每帧等待时间为10毫秒// break; } } return 0; }