2014-09-24 140 views
2

我正在开发openCV应用程序。用一些代码,我能够检测前面。我想检测并保持用户微笑的次数。我的想法是在检测到脸部后,我正在画一个矩形,此时我会打电话给笑脸检测。到目前为止,我的结果不那么成功。我张贴我的代码进行人脸检测,任何人都可以给我任何指示如何从for循环开始脸部检测。谢谢。使用Java中的openCV检测脸部内的笑脸

public Mat detect(Mat inputframe) { 
     Mat mRgba = new Mat(); 
    Mat mGrey = new Mat(); 
    MatOfRect faces = new MatOfRect(); 
    inputframe.copyTo(mRgba); 
    inputframe.copyTo(mGrey); 
    Imgproc.cvtColor(mRgba, mGrey, Imgproc.COLOR_BGR2GRAY); 
    Imgproc.equalizeHist(mGrey, mGrey); 
    face_cascade.detectMultiScale(mGrey, faces); 
    System.out.println(String.format("Detected %s face", 
      faces.toArray().length)); 
    MatOfRect smileDetections = new MatOfRect(); 
    face_cascade1.detectMultiScale(mGrey,smileDetections); 
    System.out.println(String.format("Detected %s smiles",smileDetections.toArray().length)); 
    for (Rect rect : faces.toArray()) { 
     Point center = new Point(rect.x + rect.width * 0.5, rect.y 
       + rect.height * 0.5); 
     Core.ellipse(mRgba, center, new Size(rect.width * 0.5, 
       rect.height * 0.5), 0, 0, 360, new Scalar(255, 0, 255), 4, 
       8, 0); 
    } 
    return mRgba; 
} 
    } 
+0

你加载到'face_cascade1'的什么样的级联? – Micka 2014-09-24 13:59:35

+0

我认为更好的解决方案是使用ASM模型来识别面部表情,就像一个微笑。像这样:http://www.youtube.com/watch?v=v8ipupeMwgo – dervish 2014-09-24 14:24:02

+0

你还检查了opencv示例: /opencv-2.4.xx/samples/c/smiledetect.cpp? – dervish 2014-09-24 14:28:51

回答

2

无论如何,你有几个选择:

  1. 采用主动形状模型(ASM)和主动外观模型(AAM),你可以很容易找到一些免费的开源库。
  2. 使用一些统计分类器:我想你可能需要检查这个有用的paper,他们使用树增广朴素贝叶斯(TAN)分类器来识别面部表情。
  3. 或者您可以使用opencv人脸识别api,但不能识别人脸,您可以定义您的笑脸,或者甚至只是在不同情况下使用mouthes,opencv识别器会根据您定义的类标签对它们进行分类。 Here你会发现opencv的toturial,告诉你如何清理你的数据并训练它们。
+0

感谢dervish,我正在考虑作为将一些C++代码集成到Java代码中的最后手段。这是我目前唯一的选择。 – 2014-09-24 15:36:53

+0

那么,您可能知道将jni用于此任务? – dervish 2014-09-24 15:52:12

+0

谢谢。那就是我打算做的。 – 2014-09-25 06:53:36