opencv从摄像头检测人脸并截取图像C++
时间: 2023-09-19 14:09:21 浏览: 135
这个问题需要分步来解决。
第一步是从摄像头中读取视频流。我们可以使用OpenCV中的VideoCapture类来实现这一步骤。代码如下:
```c++
VideoCapture cap(0);
if(!cap.isOpened()){
cout << "Cannot open camera" << endl;
return -1;
}
```
这段代码将打开摄像头,并检查是否成功打开。如果摄像头不能打开,程序将返回-1。
第二步是从视频流中读取帧,并在帧中检测人脸。我们可以使用OpenCV中的CascadeClassifier类来实现这一步骤。代码如下:
```c++
CascadeClassifier face_cascade;
if(!face_cascade.load("haarcascade_frontalface_alt.xml")){
cout << "Cannot load face cascade" << endl;
return -1;
}
Mat frame;
cap >> frame;
vector<Rect> faces;
face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
```
这段代码将加载人脸检测器,并使用它来检测视频流中的人脸。我们使用detectMultiScale函数来检测人脸。这个函数将返回一个包含检测到的人脸矩形的向量。我们可以使用这些矩形来裁剪帧并截取人脸图像。
第三步是裁剪帧并保存人脸图像。代码如下:
```c++
for(size_t i = 0; i < faces.size(); i++){
Rect roi(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
Mat face = frame(roi);
imwrite("face_" + to_string(i) + ".jpg", face);
}
```
这段代码将遍历所有检测到的人脸矩形,并使用它们来裁剪帧并保存人脸图像。我们使用imwrite函数来保存图像。
完整的代码如下:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap(0);
if(!cap.isOpened()){
cout << "Cannot open camera" << endl;
return -1;
}
CascadeClassifier face_cascade;
if(!face_cascade.load("haarcascade_frontalface_alt.xml")){
cout << "Cannot load face cascade" << endl;
return -1;
}
while(true){
Mat frame;
cap >> frame;
vector<Rect> faces;
face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for(size_t i = 0; i < faces.size(); i++){
Rect roi(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
Mat face = frame(roi);
imwrite("face_" + to_string(i) + ".jpg", face);
}
imshow("Camera", frame);
if(waitKey(30) == 27){
break;
}
}
return 0;
}
```
阅读全文