我目前正在进行面部检测以及此后的眼睛,嘴巴,鼻子和其他面部特征。对于上述检测,我使用了 haarcascade(正面,眼睛,右耳,左耳和嘴)。现在如果脸部是正面和直的,一切都很完美。但如果脸部在侧视图中或旋转,我的效果不佳。对于侧视图,我使用了lbscascade_profile.xml(它仅适用于face的右侧)。但对于旋转的脸,我无法检测到脸。任何人都可以在上面的语境中帮助我。我在这里添加我的代码以便更好地理解。 P.S:提前致谢并原谅我幼稚的问题(可能是因为我对编程很陌生)。
void detectAndDisplay( Mat frame)
{
// create a vector array to store the face found
std::vector<Rect> faces;
Mat frame_gray;
bool mirror_image = false;
// convert the frame image into gray image file
cvtColor( frame, frame_gray, CV_BGR2GRAY);
//equalize the gray image file
equalizeHist( frame_gray, frame_gray);
//find the frontal faces and store them in vector array
face_cascade1.detectMultiScale(frame_gray,
faces,
1.1, 2,
0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT,
Size(40, 40),
Size(200, 200));
// find the right side face and store that in the face vector
if(!(faces.size()))
{
profileface_cascade.detectMultiScale( frame_gray,
faces,
1.2, 3,
0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT,
Size(40, 40),
Size(200, 200));
}
// find whether left face exist or not by flipping the frame and checking through lbsprofile
if(!faces.size())
{
cv::flip(frame_gray, frame_gray, 1);
profileface_cascade.detectMultiScale( frame_gray,
faces,
1.2, 3,
0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT,
Size(40, 40),
Size(200, 200));
mirror_image = true;
}
// if the frame is not flipped then the it could be directly drawn into frame
if(mirror_image and faces.size())
{
// flip the frame
cv::flip(frame_gray, frame_gray, 1);
}
if(faces.size())
{
//draw rectangle for the faces detected
rectangle(frame, faces[0], cvScalar(0, 255, 0, 0), 1, 8, 0);
}
// check whether any face is present in frame or not
else
image_not_found++;
imshow("Face Detection", frame);
}
答案 0 :(得分:4)
Flandmark将是你的朋友!我最近经常使用它,结果证明它是头部姿势估计的成功工具,因此特别适用于检测“旋转”面部。它在角度范围内工作非常合理:从-30到+30度倾斜(围绕轴平行于图像宽度的旋转),从-45到+45度平移(围绕轴平行于图像的高度旋转)。它也是一个强大的解决方案。