2012-02-13 144 views
5

我試圖做Android的人臉檢測,和我下面的指導http://www.richardnichols.net/2011/01/java-facial-recognition-haar-cascade-with-jjil-guide/Android的人臉檢測

但在Android代替。當我做

Gray8DetectHaarMultiScale detectHaar = new Gray8DetectHaarMultiScale(is, minScale, maxScale); 
RgbAvgGray toGray = new RgbAvgGray(); 
toGray.push(RgbImage); 
detectHaar.pushAndReturn(toGray.getFront()); 

似乎pushAndReturn只能從Android手機上的圖像返回一個面雖然確切的代碼返回使用NetBeans代碼2面。區別僅在於圖像的類型(Android上的RgbImage和netbeans上的RgbImageJ2se)

我不知道我在想什麼,爲什麼我無法在Android上檢測到多個臉部?

我使用JJIL,所以我的意思是RgbImage:jjil.core.RgbImage類型,與RgbImageJ2SE類型。其餘的都是一樣的!看來pushAndReturn只是在棧中返回一個條目。這不適用於具有多個臉部的任何圖像。

+0

目前還不清楚是什麼RgbImage是,你如何確定將返回一個面,而不是2,或者如何在Android這個Java代碼檢測所有面與您在PC上運行Java的不同。你能舉一個完整代碼的例子嗎?在Android上,Java上的Java中有不同的Java結果,並提供更多細節? – 2012-02-14 00:04:32

+0

請檢查我的編輯 – Adroidist 2012-02-14 00:12:55

+0

的Android面部檢測完整的例子看到我的答案在這裏:http://stackoverflow.com/questions/4125821/face-detection-in-android – Jorgesys 2014-11-12 22:47:46

回答

13

轉到此其工作,並從給定的圖片

public class AndroidFaceDetector extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.main); 
     setContentView(new myView(this)); 
    } 

    private class myView extends View{ 

    private int imageWidth, imageHeight; 
    private int numberOfFace = 5; 
    private FaceDetector myFaceDetect; 
    private FaceDetector.Face[] myFace; 
    float myEyesDistance; 
    int numberOfFaceDetected; 

    Bitmap myBitmap; 


    public myView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 

    BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); 
    BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; 
    myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face5, 
     BitmapFactoryOptionsbfo); 
    imageWidth = myBitmap.getWidth(); 
    imageHeight = myBitmap.getHeight(); 
    myFace = new FaceDetector.Face[numberOfFace]; 
    myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); 
    numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 

      canvas.drawBitmap(myBitmap, 0, 0, null); 

      Paint myPaint = new Paint(); 
      myPaint.setColor(Color.GREEN); 
      myPaint.setStyle(Paint.Style.STROKE); 
      myPaint.setStrokeWidth(3); 

      for(int i=0; i < numberOfFaceDetected; i++) 
      { 
      Face face = myFace[i]; 
      PointF myMidPoint = new PointF(); 
      face.getMidPoint(myMidPoint); 
    myEyesDistance = face.eyesDistance(); 
      canvas.drawRect(
       (int)(myMidPoint.x - myEyesDistance), 
       (int)(myMidPoint.y - myEyesDistance), 
       (int)(myMidPoint.x + myEyesDistance), 
       (int)(myMidPoint.y + myEyesDistance), 
       myPaint); 
      } 
    } 
    } 
} 
+0

嘿薩米爾,謝謝你它的工作,但它似乎僅適用於小尺寸圖像,因爲當我使用三星Galaxy S的相機時,它無法檢測到任何臉部,是否與代碼有關? – Adroidist 2012-02-14 12:25:02

+0

這將適用於每個尺寸的圖像。試着玩它,因爲我沒有遇到這種情況。如果你對解決方案感到滿意,那麼請將它標記爲答案。 – Sameer 2012-02-14 12:25:34

+0

對於FaceDetection API,它似乎只能檢測到眼睛的中間和它們之間的距離,但有可能找到個人的眼睛嗎?或者是否有可能知道臉部是傾斜的? – 2014-07-26 11:29:20