2012-02-13 110 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