写一个人脸跟踪的算法代码
时间: 2024-04-21 10:30:30 浏览: 97
个可用于人脸跟踪的代码
好的,以下是一个简单的人脸跟踪算法的实现代码示例,基于OpenCV库:
```
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
std::cerr << "Failed to open camera!" << std::endl;
return -1;
}
// 创建窗口
namedWindow("Face Tracking", WINDOW_NORMAL);
// 创建人脸检测器
CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_default.xml"))
{
std::cerr << "Failed to load face cascade file!" << std::endl;
return -1;
}
// 初始化跟踪器
Rect2d track_window;
bool tracking = false;
while (true)
{
// 读取帧
Mat frame;
cap >> frame;
if (frame.empty())
{
std::cerr << "Failed to capture frame!" << std::endl;
break;
}
// 转换为灰度图像
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
if (!tracking)
{
// 人脸检测
std::vector<Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.3, 5);
if (!faces.empty())
{
// 找到最大的人脸
int max_area = 0;
for (int i = 0; i < faces.size(); ++i)
{
if (faces[i].area() > max_area)
{
max_area = faces[i].area();
track_window = faces[i];
}
}
// 创建跟踪器
Ptr<Tracker> tracker = TrackerMOSSE::create();
if (!tracker->init(frame, track_window))
{
std::cerr << "Failed to initialize tracker!" << std::endl;
return -1;
}
tracking = true;
}
}
else
{
// 更新跟踪器
if (tracker->update(frame, track_window))
{
// 绘制跟踪框
rectangle(frame, track_window, Scalar(0, 0, 255), 2);
}
else
{
// 跟踪失败,重新检测人脸
tracking = false;
}
}
// 显示图像
imshow("Face Tracking", frame);
// 按ESC键退出
if (waitKey(1) == 27)
{
break;
}
}
// 释放资源
cap.release();
destroyAllWindows();
return 0;
}
```
这个算法首先打开摄像头,然后使用OpenCV中的CascadeClassifier类加载人脸检测器模型。它循环读取帧,并在每一帧中进行人脸检测。如果检测到人脸,则找到最大的人脸并用它来初始化跟踪器。然后,它使用跟踪器来跟踪人脸,并在每一帧中更新跟踪器。如果跟踪失败,则重新检测人脸并重新初始化跟踪器。最后,它显示跟踪结果并等待用户按下ESC键退出。
阅读全文