2012-02-13 23 views
5

私はAndroid上で顔検出を行うにしようとしています、と私はhttp://www.richardnichols.net/2011/01/java-facial-recognition-haar-cascade-with-jjil-guide/Androidの顔検出

が、Android上で代わりにガイドを次しています。 iは

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

を行う場合には、正確なコードは、NetBeansのコードを使用して2面を返すがpushAndReturnのみAndroidの画像から一面を返していると思われます。違いは、画像の種類のみです(Android上のRgbImageとネットビーンのRgbImageJ2se)

Androidで複数の顔を検出できない理由は何ですか?

私はJJILを使用しています。つまり、RgbImage:jjil.core.RgbImageタイプ、つまりRgbImageJ2SEタイプです。残りはまったく同じです! pushAndReturnはスタック内の1つのエントリだけを返しているようです。これは、複数の顔を持つ画像では機能しません。

+0

からすべての顔を検出することは、どのように2一面が返されることを決定していないされているものRgbImageはっきりしない、またはどのようにAndroid上、このJavaコードPC上でJavaで実行したものとは異なります。あなたは、Android上のJavaとPC上のJavaで異なる結果を持つ完全なコードの例を挙げることができますか? –

+0

私の編集を確認してください – Adroidist

+0

Androidの顔検出の完全な例についてはここに私の答えを参照してください:http://stackoverflow.com/questions/4125821/face-detection-in-android – Jorgesys

答えて

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

ちょっとSameer、それは動作しますが、それはそうです私は私の銀河のカメラを使用するとき、それは顔を検出することはできません、それはコードと関係しているので、小さなサイズの画像でのみ動作しますか? – Adroidist

+0

これはすべてのサイズの画像で動作します。私はこのシナリオに合致していないので、試してみてください。あなたが解決策に満足すれば、回答としてマークしてください。 – Sameer

+0

FaceDetection APIでは、目の真ん中とその間の距離だけを検出するようですが、個々の目に入ることは可能ですか?または、顔が傾いていることを知ることは可能ですか? –