2013-11-04 84 views
3

我在檢測瀏覽圖像的人臉時遇到了一些問題。我知道這個問題是我不知道如何應用我在導入的圖像上測試的人臉檢測代碼。我正在測試的示例代碼是爲本地存儲的圖像編寫的。我相信我很接近,但你能幫我嗎?瀏覽圖像和人臉檢測

首先,我創建了一個畫廊方法

protected void gallery() { 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction("android.intent.action.GET_CONTENT"); 
    startActivityForResult(Intent.createChooser(intent, "Choose An Image"), 1);   
} 

我仍然在學習的意圖等,但據我瞭解,我需要使用意圖使用Android的畫廊,因爲我的setAction得到內容,我也在用它來傳遞信息。就這樣說,我試圖將信息傳遞給一個uri。所以這就是我接下來要做的。

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if(requestCode == 1 && resultCode == RESULT_OK) 
    { 
     Uri uri = intent.getData(); 
     try { 
      InputStream is = getContentResolver().openInputStream(uri); 
      Bitmap bitmap = BitmapFactory.decodeStream(is); 
      ImageView image = (ImageView)findViewById(R.id.img_view); 
      image.setImageBitmap(bitmap); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

因此,這裏是我感到困惑的部分。我猜InputStream有圖像信息?那麼我試圖在同一個try-catch中應用人臉檢測代碼。我認爲image.setImageBitmap(位圖)完成後,即是應用人臉檢測的時間。這是人臉檢測代碼。

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if(requestCode == 1 && resultCode == RESULT_OK) 
    { 
     Uri uri = intent.getData(); 
     try { 
      InputStream is = getContentResolver().openInputStream(uri); 
      Bitmap bitmap = BitmapFactory.decodeStream(is); 
      ImageView image = (ImageView)findViewById(R.id.image_view); 
      image.setImageBitmap(bitmap); 

      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inPreferredConfig=Bitmap.Config.RGB_565; 
      bitmap = BitmapFactory.decodeResource(getResources(), R.id.img_view, options); 

      imageWidth = bitmap.getWidth(); 
      imageHeight = bitmap.getHeight(); 
      detectedFaces = new FaceDetector.Face[NUM_FACES]; 
      faceDetector= new FaceDetector(imageWidth, imageHeight, NUM_FACES); 
      NUM_FACE_DETECTED = faceDetector.findFaces(bitmap, detectedFaces); 
      mIL.invalidate(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我不知道如何改變 「mFaceBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.smilingfaces,選項);」這是本地圖像,我認爲是存儲在InputStream中的圖像(或者它是?所選圖像在哪裏?)我想出了這個想法,而不是做imageView佈局,因爲圖像在佈局中。我不明白這一切是如何轉移和一起工作。無論如何,該代碼段假設檢測面部。然後onDraw()在檢測到的臉部周圍畫出正方形。我不知道該把它放在哪裏,但我把它放在onActivityResult()以外的地方。

protected void onDraw(Canvas canvas) { 

    Paint myPaint = new Paint(); 
    myPaint.setColor(Color.RED); 
    myPaint.setStyle(Paint.Style.STROKE); 
    myPaint.setStrokeWidth(3); 
    myPaint.setDither(true); 

    for (int count = 0; count < NUM_FACE_DETECTED; count++) { 
     Face face = detectedFaces[count]; 
     PointF midPoint = new PointF(); 
     face.getMidPoint(midPoint); 

     eyeDistance = face.eyesDistance(); 
     canvas.drawRect(midPoint.x-eyeDistance, midPoint.y-eyeDistance, midPoint.x+eyeDistance, midPoint.y+eyeDistance, myPaint); 
    } 
} 

有什麼建議嗎?我非常接近這個工作!

+0

我想出了一件事。我的onDraw沒有被調用,所以我添加了invalidate();另外,我有一個想法。由於我在imageView中顯示所選圖像,因此可以執行bitmap = BitmapFactory.decodeResource(getResources(),R.id.image_view,options);這些好步驟?仍然沒有工作。如果我不擴展ImageView,我不相信onDraw的作品?或者這很重要? – portfoliobuilder

回答

2

我明白你真正想要什麼。我會給你寫完整的代碼,然後繼續。

在此代碼中,我正在佈局中使用imageview,並且兩個類,一個活動類和其他一個是imageview類。

我將創建兩個按鈕,其中一個按鈕用於從圖庫中選擇圖像並顯示(用於人臉檢測),第二個按鈕用於檢測所選圖像上的人臉。

首先mainlayout.xml

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<com.simpleapps.facedetection.MyView 
android:id="@+id/faceview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
/> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_gravity="top"> 

<ImageView 
    android:id="@+id/gallery" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="10dp" 
    android:layout_weight="1" 
    android:background="@drawable/gallery" /> 

<ImageView 
    android:id="@+id/detectf" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="10dp" 
    android:layout_weight="1" 
    android:background="@drawable/detect" /> 


</LinearLayout> 
</FrameLayout> 

現在的活性類

MainActivity.java

public class MainActivity extends Activity { 

public MyView faceview; 

public static Bitmap defaultBitmap; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    setContentView(R.layout.activity_main); 

    DisplayMetrics displaymetrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
     screenHeight = displaymetrics.heightPixels; 
     screenWidth = displaymetrics.widthPixels; 

      faceview = (MyView)findViewById(R.id.faceview); 

      myGallery = (LinearLayout)findViewById(R.id.mygallery); 





      gallery=(ImageView)findViewById(R.id.gallery); 
      detectf=(ImageView)findViewById(R.id.detectf); 



      BitmapFactory.Options bitmapFatoryOptions=new BitmapFactory.Options(); 
      bitmapFatoryOptions.inPreferredConfig=Bitmap.Config.RGB_565; 

      defaultBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.face,bitmapFatoryOptions); 

      faceview.setImage(defaultBitmap); 

      gallery.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        // TODO Auto-generated method stub 

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
        intent.setType("image/*"); 
        startActivityForResult(intent, 0); 

       } 
      }); 

      detectf.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        // TODO Auto-generated method stub 


        faceview.facedetect(); 

       } 
      }); 

    } 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == Activity.RESULT_OK) { 

     if(requestCode==0){ 

     imageURI = data.getData(); 

     try { 

      BitmapFactory.Options bitmapFatoryOptions=new BitmapFactory.Options(); 
      bitmapFatoryOptions.inPreferredConfig=Bitmap.Config.RGB_565; 

      Bitmap b = 
         BitmapFactory.decodeStream(getContentResolver().openInputStream(imageURI), null, 
           bitmapFatoryOptions); 


      faceview.myBitmap=b; 


     } catch (FileNotFoundException e) { 
//    TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
//    TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     faceview.invalidate(); 

     } 

     faceview.invalidate(); 
    } else { 
     System.exit(0); 
     Log.e("result", "BAD"); 
    } 
} 
} 

現在視圖類。

MyView.java

public class MyView extends View { 

private FaceDetector.Face[] detectedFaces; 
private int NUMBER_OF_FACES=10; 
private FaceDetector faceDetector; 
private int NUMBER_OF_FACE_DETECTED; 
private float eyeDistance; 

public Paint myPaint; 

public Bitmap resultBmp; 

public Bitmap myBitmap,HairBitmap; 

public PointF midPoint1; 

public MyView(Context context, AttributeSet attrs) { 
    super(context,attrs); 
    // TODO Auto-generated constructor stub 
    BitmapFactory.Options bitmapFatoryOptions=new BitmapFactory.Options(); 
    bitmapFatoryOptions.inPreferredConfig=Bitmap.Config.RGB_565; 

} 

public void setImage(Bitmap bitmap) { 
    myBitmap = bitmap; 

invalidate(); 
} 


public void facedetect(){ 

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

    detectedFaces=new FaceDetector.Face[NUMBER_OF_FACES]; 
    faceDetector=new FaceDetector(resultBmp.getWidth(),resultBmp.getHeight(),NUMBER_OF_FACES); 
    NUMBER_OF_FACE_DETECTED=faceDetector.findFaces(resultBmp, detectedFaces); 

    System.out.println("faces detected are"+NUMBER_OF_FACE_DETECTED); 

    Canvas facec=new Canvas(); 

    for(int count=0;count<NUMBER_OF_FACE_DETECTED;count++) 
    { 

    if(count==0){ 

     face1=detectedFaces[count]; 
     midPoint1=new PointF(); 
     face1.getMidPoint(midPoint1); 

     eyeDistance=face1.eyesDistance(); 


    } 

    } 

    invalidate(); 

    if(NUMBER_OF_FACE_DETECTED==0){ 

    Toast.makeText(getContext(), "no faces detected", Toast.LENGTH_LONG).show(); 

    }else if(NUMBER_OF_FACE_DETECTED!=0){ 

     Toast.makeText(getContext(), "faces detected "+NUMBER_OF_FACE_DETECTED, Toast.LENGTH_LONG).show(); 

    } 
} 

protected void onDraw(Canvas canvas) 
{ 

    if(myBitmap!=null) 
    { 



    w = myBitmap.getWidth(); 
    h = myBitmap.getHeight(); 
    resultBmp = null; 

    int widthofBitMap = MainActivity.screenWidth ; 
    int heightofBitMap = widthofBitMap*h/w; 

    resultBmp = Bitmap.createScaledBitmap(myBitmap, widthofBitMap, heightofBitMap, true); 
    canvas.drawBitmap(resultBmp, (MainActivity.screenWidth-widthofBitMap)/2,(MainActivity.screenHeight-heightofBitMap)/2, null); 


    } 

} 

@Override 

    public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 

    int action = event.getAction(); 



    switch(action){ 
    case MotionEvent.ACTION_MOVE: 
    x = event.getX(); 
    y = event.getY(); 





    break; 
    case MotionEvent.ACTION_DOWN: 
    x = event.getX(); 
    y = event.getY(); 





    break; 
    case MotionEvent.ACTION_UP: 
    default: 


} 
    invalidate(); 
    return true; 
    } 


    } 

我花了一些時間來寫這個代碼。我希望它有幫助。如果你得到一些錯誤就問。

+0

謝謝!讓我看看這個。希望這能解決我的問題。 – portfoliobuilder

+0

這不是一個解決方案。你的代碼示例有很多問題。不存在的佈局,不實施onClickListener,缺少變量,缺少方法。我試圖提取一些可能有用的信息,但我仍然在同一個位置。不管怎麼說,還是要謝謝你。 – portfoliobuilder

+0

是的,這就是我所說的要求我...我知道有錯誤,同時從我的代碼中取出並張貼在這裏。有什麼問題,我會幫你。 –