我从脸上检测到眼睛和嘴巴,但是,嘴巴检测不到 我将此代码应用于3张图片,但它没有准确地检测到嘴巴 你可以在这里看到图片see the sample pictures here 对于fig1,它检测准确,但对于图2和图3,它没有检测到准确的
private void ProcessFrame(object sender, EventArgs arg)
{
Image InputImg = Image.FromFile(@"C:\Emgu\a.jpg");
Image<Bgr, byte> ImageFrame = new Image<Bgr, byte>(new Bitmap(InputImg));
if (ImageFrame != null) // confirm that image is valid 10
{
Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>();
var faces = grayframe.DetectHaarCascade(haarCascade, 1.4, 4,
HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(40, 40))[0];
var nos = grayframe.DetectHaarCascade(nose);
var eyes = grayframe.DetectHaarCascade(eye, 1.1, 1,
HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
foreach (var eye2 in eyes[0])
{
Rectangle eyeRect1 = eye2.rect;
ImageFrame.Draw(eyeRect1, new Bgr(Color.Pink), 2);
}
foreach (var noses1 in nos[0])
{
Rectangle noserect = noses1.rect;
ImageFrame.Draw(noserect, new Bgr(Color.Blue), 2);
}
foreach (var face in faces)
{
ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3);
grayframe.ROI = face.rect;
var mouths = grayframe.DetectHaarCascade(mouth,
1.5, 10,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
grayframe.ROI = Rectangle.Empty;
foreach (var mouthsnap in mouths[0])
{
Rectangle mouthRect = mouthsnap.rect;
mouthRect.Offset(face.rect.X, face.rect.Y);
ImageFrame.Draw(mouthRect, new Bgr(Color.Red), 2);
}
}
}
CamImageBox.Image = ImageFrame;
}
答案 0 :(得分:0)
这是一个数据驱动的错误,而不是代码错误:您还需要训练有胡须的脸,以避免错误分类。
您显示的训练集(右侧三张图片)没有胡须。在那些图像中,你的哈尔级联学习了黑暗的曲线是一个嘴。
然后它认为图1中的胡须(左边的图像)也是一个嘴,因为它是一条很大的黑色曲线。它正确地在那条线周围绘制了一个方框,即“嘴巴”(实际上是胡须)。
通常,增加训练数据量以改善检测。
如果不是数据驱动的问题,那么请查看相关问题(Eye and Mouth detection from face using haar-cascades)中已发布的方法: