android - 使用面部检测 Android 进行面部交换

标签 android android-canvas crop face-detection ondraw

我正在尝试使用人脸检测来进行换脸应用。到现在为止,我得到了位图中检测到的面孔,并在检测到的面上绘制了椭圆形。但现在我需要使用椭圆内的面孔,这样我就可以交换两张面孔。是否可以。我需要一些关于这方面的建议。

我的 Activity 类如下

public class FaceDetectionActivity extends Activity 
{


public MyView faceview;
public ImageView gallery;
private Uri imageURI;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);
    setContentView(R.layout.main);

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

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

    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 );

        }
    });


}


@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 {
            Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageURI);

            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");
    }
}


}

和我的 View 类

public class MyView extends ImageViewTouchBase {

public RectF rectF;
public Bitmap myBitmap;
private int width, height;
private FaceDetector.Face[] detectedFaces;
private int NUMBER_OF_FACES=10;
private FaceDetector faceDetector;
private int NUMBER_OF_FACE_DETECTED;
private float eyeDistance;
Matrix mImageMatrix;

public MyView(Context context, AttributeSet attrs) 
{
    super(context, attrs);
    BitmapFactory.Options bitmapFatoryOptions=new BitmapFactory.Options();
    bitmapFatoryOptions.inPreferredConfig=Bitmap.Config.RGB_565;
    myBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.familyportrait,bitmapFatoryOptions);
    width=myBitmap.getWidth();
    height=myBitmap.getHeight();
    detectedFaces=new FaceDetector.Face[NUMBER_OF_FACES];
    faceDetector=new FaceDetector(width,height,NUMBER_OF_FACES);
    NUMBER_OF_FACE_DETECTED=faceDetector.findFaces(myBitmap, detectedFaces);
}

@Override
protected void onDraw(Canvas canvas)
{
    if(myBitmap!=null)
    {


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

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

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

        eyeDistance=face.eyesDistance();

    float   left = midPoint.x - (float)(1.4 * eyeDistance);
    float   right = midPoint.x + (float)(1.4 * eyeDistance);
    float    top = midPoint.y - (float)(1.8 * eyeDistance);
    float    bottom = midPoint.y + (float)(1.8 * eyeDistance);

    Rect imageRect = new Rect(0, 0, width, height);
     rectF = new RectF();

    rectF.set(left,top,right,bottom);

    canvas.drawOval(rectF, myPaint);


    }
}

}

现在我要选择椭圆内的内容。请给我一些想法。

最佳答案

我刚刚弄明白了。我正在用上面代码中的变量 Left、Right、Top 和 Bottom 创建另一个位图。然后我得到一个方形位图的面孔。我从方形位图面中提取圆形位图。就是这样。

关于android - 使用面部检测 Android 进行面部交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18527431/

相关文章:

android - Canvas.drawArc() 不绘制任何东西

android - 在透明形状上投下阴影?

android - 如何在触摸事件中移动 Canvas 中的 ShapeDrawable

android如何使用现有图像进行裁剪

java - 使用 LibVLC 和创建 LibVLC 对象失败 (Android)

android - GCM - GCMBroadcastReceiver 没有被调用

ios - 如何在 appcelerator 中裁剪图库图像?

android - 从 Android 中的 SQLiteDatabase 获取大 BLOB

java - Android Studio : Creating a Swipe Tab Application that Reads Fragments. 强制关闭

android - 使用 ObjectAnimator 后无法设置可见性