如何使用 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 Horizo​​ntal = (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;
}

输出


相关文章