用C++与Opencv编写程序从摄像头获取人脸图像建立人脸图像库
时间: 2024-06-11 20:06:55 浏览: 102
首先需要安装Opencv库,并配置好开发环境,然后按照下面的步骤编写程序:
1. 导入Opencv库头文件和标准库头文件
```c
#include <opencv2/opencv.hpp>
#include <iostream>
```
2. 定义全局变量和函数
```c
// 定义保存人脸图像的向量
std::vector<cv::Mat> faces;
// 定义函数,用于在图像中检测人脸并返回人脸矩形
cv::Rect detect_face(cv::Mat frame);
```
3. 主函数中获取摄像头输入并进行处理
```c
int main(int argc, char** argv) {
// 打开摄像头
cv::VideoCapture cap(0);
// 判断摄像头是否打开成功
if (!cap.isOpened()) {
std::cerr << "ERROR: Could not open camera" << std::endl;
return 1;
}
// 创建窗口
cv::namedWindow("Camera", cv::WINDOW_NORMAL);
// 循环处理每一帧图像
while (true) {
// 读取一帧图像
cv::Mat frame;
cap.read(frame);
// 检测人脸并返回人脸矩形
cv::Rect face_rect = detect_face(frame);
// 如果检测到人脸,则保存人脸图像
if (face_rect.width > 0 && face_rect.height > 0) {
cv::Mat face = frame(face_rect).clone();
faces.push_back(face);
}
// 显示图像
cv::imshow("Camera", frame);
// 按下ESC键退出循环
if (cv::waitKey(1) == 27) break;
}
// 释放摄像头并销毁窗口
cap.release();
cv::destroyAllWindows();
// 显示保存的人脸图像数量
std::cout << "Total faces detected: " << faces.size() << std::endl;
// 保存人脸图像到文件
for (int i = 0; i < faces.size(); i++) {
std::string filename = "face_" + std::to_string(i) + ".jpg";
cv::imwrite(filename, faces[i]);
}
return 0;
}
```
4. 完成detect_face函数的编写,用于检测人脸并返回人脸矩形
```c
cv::Rect detect_face(cv::Mat frame) {
// 加载人脸检测器
cv::CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_alt.xml");
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
// 检测人脸
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 5);
// 如果检测到人脸,则返回人脸矩形
if (faces.size() > 0) {
return faces[0];
} else {
return cv::Rect();
}
}
```
5. 编译并运行程序,摄像头会自动打开并开始捕捉图像,当检测到人脸时会保存人脸图像到本地文件。最后可以在保存的文件中查看保存的人脸图像。
阅读全文