2014-09-24 145 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