2012-12-12 35 views
0

中使用FaceDetector檢測臉部我需要檢測用戶臉部並比較臉部以驗證我的應用程序,因爲我使用FaceDetector API檢測用戶臉部。無法在android

當我運行我的代碼時,它的工作原理沒有任何缺陷。但是它將檢測到的面計數爲零。

public class AndroidFaceDetectorActivity extends Activity { 
    private static final int TAKE_PICTURE_CODE = 100; 
    private static final int MAX_FACES = 5; 

    private Bitmap cameraBitmap = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ((Button)findViewById(R.id.take_picture)).setOnClickListener(btnClick); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 

      if(TAKE_PICTURE_CODE == requestCode){ 
        processCameraImage(data); 
      } 
    } 


    private void openCamera(){ 
     Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

     startActivityForResult(intent, TAKE_PICTURE_CODE); 
    } 

    private void processCameraImage(Intent intent){ 
     setContentView(R.layout.detectlayout); 

     ((Button)findViewById(R.id.detect_face)).setOnClickListener(btnClick); 

     ImageView imageView = (ImageView)findViewById(R.id.image_view); 

     cameraBitmap = (Bitmap)intent.getExtras().get("data"); 

     imageView.setImageBitmap(cameraBitmap); 
    } 

    private void detectFaces(){ 
     if(null != cameraBitmap){ 
       Log.d("FACE_RECOGNITION","CHECK"); 
       int width = cameraBitmap.getWidth(); 
       int height = cameraBitmap.getHeight(); 

       FaceDetector detector = new FaceDetector(width, height,AndroidFaceDetectorActivity.MAX_FACES); 
       Face[] faces = new Face[AndroidFaceDetectorActivity.MAX_FACES]; 

       Bitmap bitmap565 = Bitmap.createBitmap(width, height, Config.RGB_565); 
       Paint ditherPaint = new Paint(); 
       Paint drawPaint = new Paint(); 

       ditherPaint.setDither(true); 
       drawPaint.setColor(Color.RED); 
       drawPaint.setStyle(Paint.Style.STROKE); 
       drawPaint.setStrokeWidth(2); 

       Canvas canvas = new Canvas(); 
       canvas.setBitmap(bitmap565); 
       canvas.drawBitmap(cameraBitmap, 0, 0, ditherPaint); 

       int facesFound = detector.findFaces(bitmap565, faces); 
       PointF midPoint = new PointF(); 
       float eyeDistance = 0.0f; 
       float confidence = 0.0f; 

       Log.i("FaceDetector", "Number of faces found: " + facesFound); 

       if(facesFound > 0) 
       { 
         for(int index=0; index<facesFound; ++index){ 
           faces[index].getMidPoint(midPoint); 
           eyeDistance = faces[index].eyesDistance(); 
           confidence = faces[index].confidence(); 

           Log.i("FaceDetector", 
               "Confidence: " + confidence + 
               ", Eye distance: " + eyeDistance + 
               ", Mid Point: (" + midPoint.x + ", " + midPoint.y + ")"); 

           canvas.drawRect((int)midPoint.x - eyeDistance , 
                   (int)midPoint.y - eyeDistance , 
                   (int)midPoint.x + eyeDistance, 
                   (int)midPoint.y + eyeDistance, drawPaint); 
         } 
       } 

       String filepath = Environment.getExternalStorageDirectory() + "/facedetect" + System.currentTimeMillis() + ".jpg"; 

        try { 
          FileOutputStream fos = new FileOutputStream(filepath); 

          bitmap565.compress(CompressFormat.JPEG, 90, fos); 

          fos.flush(); 
          fos.close(); 
        } catch (FileNotFoundException e) { 
          e.printStackTrace(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 

        ImageView imageView = (ImageView)findViewById(R.id.image_view); 

        imageView.setImageBitmap(bitmap565); 
     } 
    } 

    private View.OnClickListener btnClick = new View.OnClickListener() { 
      //@Override 
      public void onClick(View v) { 
        switch(v.getId()){ 
          case R.id.take_picture:   openCamera(); break; 
          case R.id.detect_face:   detectFaces(); break; 
        } 
      } 
    }; 
} 

我做錯了什麼?

是否有其他方法可以做到這一點?

感謝

+0

爲什麼這裏沒有人回答我的問題? – sd33din90

+0

你是如何構建cameraBitmap的? –

+0

@AlexCohn:我已經更新了上面的源代碼。 – sd33din90

回答

0

getExtras().get("data")MediaStore.ACTION_IMAGE_CAPTURE意圖產生非常低的分辨率的位圖(我相信這是160×120像素),它可以工作爲縮略圖,但是是不夠的,人臉檢測,以完成其工作。

通常人臉檢測是中等清晰度的圖像OK(比如64x480像素),您可以接收形式Camera.previewCallback(),但這樣一來,你需要的權限和代碼控制相機在你的應用程序,你不能用一個意圖那。

這是Android的官方進入面部檢測:http://developer.android.com/guide/topics/media/camera.html#face-detection

如果你真的喜歡這種方式,你可以使用getData()在其全分辨率找到所拍攝的圖像,並將其轉換成位圖,像

cameraBitmap = BitmapFactory.decodeFile(data.getData().getPath());