用openCV检测嘴巴
Detecting mouth with openCV
我正在尝试使用 openCV 检测图像中的嘴巴,因此我使用以下代码:
#include "face_detection.h"
using namespace cv;
// Function detectAndDisplay
void detectAndDisplay(const std::string& file_name, cv::CascadeClassifier& face_cascade, cv::CascadeClassifier& mouth_cascade)
{
Mat frame = imread(file_name);
std::vector<Rect> faces;
Mat frame_gray;
Mat crop;
Mat res;
Mat gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
// Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for(unsigned int i=0;i<faces.size();i++)
{
rectangle(frame,faces[i],Scalar(255,0,0),1,8,0);
Mat face = frame(faces[i]);
cvtColor(face,face,CV_BGR2GRAY);
std::vector <Rect> mouthi;
mouth_cascade.detectMultiScale(face, mouthi);
for(unsigned int k=0;k<mouthi.size();k++)
{
Point pt1(mouthi[k].x+faces[i].x , mouthi[k].y+faces[i].y);
Point pt2(pt1.x+mouthi[k].width, pt1.y+mouthi[k].height);
rectangle(frame, pt1,pt2,Scalar(0,255,0),1,8,0);
}
}
imshow("Frame", frame);
waitKey(33);
}
分类器是 haarcascade_frontalface_alt.xml
和 haarcascade_mcs_mouth.xml
。
面部检测正确但嘴巴检测不正确:我还获取了眼睛和其他一些部位,例如前额。
有没有办法只检测嘴巴?
我想我设法解决了这个问题:专注于脸部的下半部分并增加比例因子成功了,现在我能够以很高的精度检测到嘴巴。无论如何,这个任务似乎比人脸检测复杂得多,即使我使用的是 "simple" 图像,这意味着笔直且完整的正面。
这里有两个例子:成功和失败。
我遇到了同样的问题,所以我只关注下半脸
并从检测到的面部创建一个 ROI。它看起来像这样:
Mat ROI=image(Rect(face.x,face.y+face.height*0.6,face.width,face.height*0.3));
其中 face 是从图像中检测到的人脸。
这仅为下半部分检测到的面部创建了 ROI。否则口部检测器将眼睛也检测为嘴巴。
然后使用这个 link 中的 MouthCascade.xml
:http://alereimondo.no-ip.org/OpenCV/34
这比内置的 OpenCV 效率高得多。
我正在尝试使用 openCV 检测图像中的嘴巴,因此我使用以下代码:
#include "face_detection.h"
using namespace cv;
// Function detectAndDisplay
void detectAndDisplay(const std::string& file_name, cv::CascadeClassifier& face_cascade, cv::CascadeClassifier& mouth_cascade)
{
Mat frame = imread(file_name);
std::vector<Rect> faces;
Mat frame_gray;
Mat crop;
Mat res;
Mat gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
// Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for(unsigned int i=0;i<faces.size();i++)
{
rectangle(frame,faces[i],Scalar(255,0,0),1,8,0);
Mat face = frame(faces[i]);
cvtColor(face,face,CV_BGR2GRAY);
std::vector <Rect> mouthi;
mouth_cascade.detectMultiScale(face, mouthi);
for(unsigned int k=0;k<mouthi.size();k++)
{
Point pt1(mouthi[k].x+faces[i].x , mouthi[k].y+faces[i].y);
Point pt2(pt1.x+mouthi[k].width, pt1.y+mouthi[k].height);
rectangle(frame, pt1,pt2,Scalar(0,255,0),1,8,0);
}
}
imshow("Frame", frame);
waitKey(33);
}
分类器是 haarcascade_frontalface_alt.xml
和 haarcascade_mcs_mouth.xml
。
面部检测正确但嘴巴检测不正确:我还获取了眼睛和其他一些部位,例如前额。 有没有办法只检测嘴巴?
我想我设法解决了这个问题:专注于脸部的下半部分并增加比例因子成功了,现在我能够以很高的精度检测到嘴巴。无论如何,这个任务似乎比人脸检测复杂得多,即使我使用的是 "simple" 图像,这意味着笔直且完整的正面。
这里有两个例子:成功和失败。
我遇到了同样的问题,所以我只关注下半脸 并从检测到的面部创建一个 ROI。它看起来像这样:
Mat ROI=image(Rect(face.x,face.y+face.height*0.6,face.width,face.height*0.3));
其中 face 是从图像中检测到的人脸。
这仅为下半部分检测到的面部创建了 ROI。否则口部检测器将眼睛也检测为嘴巴。
然后使用这个 link 中的 MouthCascade.xml
:http://alereimondo.no-ip.org/OpenCV/34
这比内置的 OpenCV 效率高得多。