我现在想把检测到的人脸区域截出,做进一步处理
请问如何能够做到把检测到的人脸区域图像单独输出,
如果能够提供示范将不胜感激~!求各位大神指导
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)