HT-03Aで笑い男の模倣ツールの模倣ツール


MediaStoreのクラスを見ていたらおもしろそうな物があったので試してみた。
もう少し改善してON,OFF切り替えるようにすれば肖像権対策にいいかも?
コップレさんとか消すの大変だしね。


アプリケーションの動作

標準カメラアプリをインテント起動
↓
bitmapを取得
↓
顔認識
↓
笑い男のイメージを上書き

ネタ元はこちら
http://kougaku-navi.net/koukaku.html


顔認識のコードはこちらを参考にさせていただきました。
http://blog.livedoor.jp/deeds_not_words/archives/624855.html
adakoda.com - 
ありがとうございます!


コードはこんな感じ

package jp.lnc.TestMediaStoreImage;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.ImageView;

public class TestImageActivity extends Activity {
    /** Called when the activity is first created. */
	private static final int CAMERA_ACTIVITY = 0;
	private static final String TAG = null;
	private ImageView mImageView;
	private Bitmap mCameraBitmap;
	Bitmap bitmap;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
//        bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.happy);
//        笑い男のイメージ
        bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.c00);
//        インテントを生成
        Intent mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//        描写用のviewを取得
    	mImageView =  (ImageView) findViewById(R.id.ImageView01);
//		インテントを投げる
    	startActivityForResult(mIntent, CAMERA_ACTIVITY);

    		
    }
    
//    アクティビティの結果を取得したらここに入る
	protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
		super.onActivityResult(requestCode, resultCode, intent);
		Log.i(TAG, "Result code = " + resultCode);

		if (resultCode == RESULT_CANCELED) {
			return;
		}
		switch (requestCode) {

		case CAMERA_ACTIVITY: 
			Bundle b = intent.getExtras();
			Bitmap bm = (Bitmap) b.get("data");
			// イメージを渡す
			setImageBitmap(bm); 
			// イメージの大きさ判定
			if (b.containsKey(MediaStore.EXTRA_OUTPUT)) { 
				Log.i(TAG, "This is a large image: ");
			} else {

				Log.i(TAG, "This is a small image: ");
			}
			break;
		}


	}

	private void setImageBitmap(Bitmap bm) {
		if(false){
			mImageView.setImageBitmap(bm);
		}else{
			this.mCameraBitmap = bm;
			setFaceImage();
		}
		
	}

	//顔認識上書き 
	void setFaceImage(){
		FaceDetector.Face[] faces = new FaceDetector.Face[3]; // 結果受け取り用
		FaceDetector detector = new FaceDetector(
		    mCameraBitmap.getWidth(), // ビットマップの幅
		    mCameraBitmap.getHeight(), // ビットマップの高さ
		    faces.length); // ここでは、最大3つの顔認識結果を受け取れるように指定
		int numFaces = detector.findFaces(mCameraBitmap, faces); // 顔認識実行
		if (numFaces > 0) {

		    Bitmap newBitmap = mCameraBitmap.copy(Bitmap.Config.RGB_565, true);
		    Paint paint = new Paint();
		    paint.setColor(Color.argb(255, 255, 0, 0)); // 赤
		    paint.setStyle(Style.STROKE); // 塗りつぶしなしの線
		    Canvas canvas = new Canvas(newBitmap);
		    for (int i = 0; i < numFaces; i++) { // 認識した数だけ処理
		        Face face = faces[i];
		        PointF midPoint = new PointF(0, 0);
		        face.getMidPoint(midPoint); // 顔認識結果を取得
		        float eyesDistance = face.eyesDistance();
// 描写元の設定
		        Rect src = new Rect(); 
		        src.left = 0 ;
		        src.top = 0 ;
		        src.right = bitmap.getWidth() ;
		        src.bottom = bitmap.getHeight() ;
// 描写先の設定
		        RectF rect = new RectF(); 
		        rect.left = midPoint.x - (eyesDistance*2) ;
		        rect.top = midPoint.y - (eyesDistance*2) ;
		        rect.right = midPoint.x + (eyesDistance*2) ;
		        rect.bottom = midPoint.y + (eyesDistance*2) ;

		        
		        canvas.drawBitmap(bitmap, src, rect, paint); // 笑い男に
			 }
		    
		    mImageView.setImageBitmap(newBitmap);
		}
	}
}