通过Opencv自带的Haar检测并框出的人脸如何单独输出

时间:2023-01-23 04:11:40
如题所述,目前程序可以通过摄像头检测并框出人脸。
我现在想把检测到的人脸区域截出,做进一步处理
请问如何能够做到把检测到的人脸区域图像单独输出,
如果能够提供示范将不胜感激~!求各位大神指导  通过Opencv自带的Haar检测并框出的人脸如何单独输出

5 个解决方案

#1


假设Mat src里是放着一张有人脸的图片,人脸区域你已经知道了,那么人脸可以从src中这样截取Mat  temp = src(Rect(x,y,width,height));其中Rect里面的四个参数分别代表人脸图像的起点x,起点y,人脸区域长,人脸区域宽,之后temp里就是你的人脸了!

#2


using namespace cv;
using namespace std;

string face_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
string window_name = "人脸识别";

void detectAndDisplay(Mat frame){
std::vector<Rect> faces;
Mat frame_gray;

cvtColor(frame, frame_gray, CV_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);

face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(40, 40));

for (int i = 0; i < faces.size(); i++){

Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
Point pt2(faces[i].x, faces[i].y);

rectangle(frame, pt1, pt2, cvScalar(255, 0, 0, 0), 3, 8, 0);

}

imshow(window_name, frame);
}

int main(int argc, char* argv[])
 {
VideoCapture cap(0);
if (!cap.isOpened())
return -1;

Mat edges;

if (!face_cascade.load(face_cascade_name)){         //( !eyes_cascade.load(eyes_cascade_name)){ 
printf("无法加载级联分类器文件!\n");
return -1;
}
int nTick = 0;
for (;;)
{
if (!cap.isOpened())
{
continue;
}
Mat frame;
nTick = getTickCount();
cap >> frame;  // get a new frame from camera  
if (frame.data == NULL)
{
continue;
}
cvtColor(frame, edges, CV_BGR2BGRA);

detectAndDisplay(edges);


if (waitKey(30) >= 0) break;
}
return 0;
}

你好,我的程序是这样的,请问要加在哪里呢?

#3


大神们帮帮忙哇,实在是弄不出来

#4


您好,请问您最后是怎么解决的,可以分享一下么

#5


在rectangle语句下面添加Mat image_cut=frame(cvRect(x,y,w,h)) ,然后显示使用imshow,保存使用imwrite("文件名", image_cut)

#1


假设Mat src里是放着一张有人脸的图片,人脸区域你已经知道了,那么人脸可以从src中这样截取Mat  temp = src(Rect(x,y,width,height));其中Rect里面的四个参数分别代表人脸图像的起点x,起点y,人脸区域长,人脸区域宽,之后temp里就是你的人脸了!

#2


using namespace cv;
using namespace std;

string face_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
string window_name = "人脸识别";

void detectAndDisplay(Mat frame){
std::vector<Rect> faces;
Mat frame_gray;

cvtColor(frame, frame_gray, CV_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);

face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(40, 40));

for (int i = 0; i < faces.size(); i++){

Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
Point pt2(faces[i].x, faces[i].y);

rectangle(frame, pt1, pt2, cvScalar(255, 0, 0, 0), 3, 8, 0);

}

imshow(window_name, frame);
}

int main(int argc, char* argv[])
 {
VideoCapture cap(0);
if (!cap.isOpened())
return -1;

Mat edges;

if (!face_cascade.load(face_cascade_name)){         //( !eyes_cascade.load(eyes_cascade_name)){ 
printf("无法加载级联分类器文件!\n");
return -1;
}
int nTick = 0;
for (;;)
{
if (!cap.isOpened())
{
continue;
}
Mat frame;
nTick = getTickCount();
cap >> frame;  // get a new frame from camera  
if (frame.data == NULL)
{
continue;
}
cvtColor(frame, edges, CV_BGR2BGRA);

detectAndDisplay(edges);


if (waitKey(30) >= 0) break;
}
return 0;
}

你好,我的程序是这样的,请问要加在哪里呢?

#3


大神们帮帮忙哇,实在是弄不出来

#4


您好,请问您最后是怎么解决的,可以分享一下么

#5


在rectangle语句下面添加Mat image_cut=frame(cvRect(x,y,w,h)) ,然后显示使用imshow,保存使用imwrite("文件名", image_cut)