Обнаружение лица фронтальной камерой (Android Studio)

Ну, я слышал, что в студии Android уже есть класс камеры.

Что я пытаюсь сделать, так это создать приложение, которое включает камеру при нажатии на нее и ее единственную фронтальную камеру, а затем, когда оно само обнаруживает лицо, оно говорит что-то вроде «Ты сегодня отлично выглядишь!» я хочу записать свой собственный голос и поставить его как мой собственный голос.

Так что, если кто-нибудь может направить меня, как сделать что-то подобное, это было бы потрясающе! Я исследовал везде!

Я скачал этот уже готовый интерфейс распознавания лиц. Это работает, но все, что мне действительно нужно сделать сейчас, это добавить к нему свой голос.

  1. Откройте приложение
  2. Ожидает, пока лицо не будет обнаружено
  3. Говорит: «Ты хорошо выглядишь сегодня»

Это все, что я действительно хочу! Можете ли вы дать мне несколько советов или, по крайней мере, дать мне несколько шагов, как это сделать?

Я нуб, так что не торопитесь объяснять


person Ben Price    schedule 10.11.2016    source источник


Ответы (1)


Просто используйте библиотеки распознавания лиц родного Android (а не OpenCV или что-то более сложное), и как только приложение запустится, оно также отследит ваше лицо. Вы также можете поместить оператор if, чтобы проверить, распознано ли лицо, а также было ли уже воспроизведено голосовое сообщение.

if(recognized_faces != 0 && message_already_played == false){
    //play the message
}

Это кусок кода (Активность), который берет все фотограммы с фронтальной камеры и анализирует их. Изначально код нарисовал холст на фотограммах и показывает их последовательно (как будто это был видеопоток) в "miaImmagine2". Если вы этого не хотите, просто не показывайте miaImmagine2 и покажите только слой видеокамеры. Я стер много ненужных вам частей кода, так что, вероятно, осталось много кода, который нужно стереть или подкорректировать. Но это может быть хорошим подспорьем для вас. Итак, вот код:

package mawashi.alex.driveawake;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.hardware.Camera.ErrorCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.media.AudioManager;
import android.media.FaceDetector;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;

@SuppressLint("NewApi")
public class AwakeActivity extends Activity {
    SurfaceView mVideoCaptureView;

    Camera mCamera;

    public Bitmap mFaceBitmap;
    public TextView Testo;
    public Bitmap mFace2Bitmap;
    public ImageView miaImmagine2;
    private MediaPlayer player;
    public SurfaceView mSurfaceView;
    public SurfaceHolder mSurfaceHolder;
    private static final int MAX_FACES = 1;
    int mFaceWidth;
    int mFaceHeight;
    int cameraType = 1; // front
    int frame_sec = 1000000;
    byte[] callbackBuffer;
    PreviewCallback cb;
    public FrameLayout preview;
    Bitmap bmp;
    Bitmap b;
    MediaMetadataRetriever mediaMetadataRetriever=null;
    Bitmap bmFrame = null;
    FaceDetector.Face[] faces;
    Activity activity;
    Context mContext;
    int index_sleep = 0;
    int consec = 0;
    boolean sleep = false;
    public float  scala = 1;
    public int offset = 0;
    int m = 1;
    int Colore = Color.GRAY;
    private MediaPlayer player2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.detection);
        mVideoCaptureView = (SurfaceView) findViewById(R.id.Surface);
        miaImmagine2 = (ImageView) findViewById(R.id.imageView2);
        Testo = (TextView) findViewById(R.id.textView1);
        SurfaceHolder videoCaptureViewHolder = mVideoCaptureView.getHolder();
        videoCaptureViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        player = MediaPlayer.create(this, R.raw.you_look_good);
        videoCaptureViewHolder.addCallback(new Callback() {
            public void surfaceDestroyed(SurfaceHolder holder) {
        }

        public void surfaceCreated(SurfaceHolder holder) {
            startVideo();
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
        });
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    //************BUTTONS***************************************************************



    //ROTATE THE IMAGE OF 90 DEGREES

    protected void setDisplayOrientation(Camera mCamera, int angle){
        Method downPolymorphic;
        try{
            downPolymorphic = mCamera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
            if (downPolymorphic != null)
                downPolymorphic.invoke(mCamera, new Object[] { angle });
        }catch (Exception e1){  }
    }

    /////////////////////////////////////////////////////////////////////////////////////////////
    //******************************************************************************************

    @Override
    public void onPause(){
        super.onPause();
        player.pause();
    }

    //**************************************************************************************
    //*******************************STARTVIDEO*********************************************
    @SuppressLint("NewApi")
    private void startVideo() {
        SurfaceHolder videoCaptureViewHolder = null;
        try {
            mCamera = Camera.open(1);
        } catch (RuntimeException e) {
            Log.e("CameraTest", "Camera Open filed");
            return;
        }
        mCamera.setErrorCallback(new ErrorCallback() {
            public void onError(int error, Camera camera) {
            }
        });
        Camera.Parameters parameters = mCamera.getParameters();
        List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
        Camera.Size cs = previewSizes.get(0);
        parameters.setPreviewSize(cs.width,cs.height);


        setDisplayOrientation(mCamera, 90);
        mCamera.setParameters(parameters);
        if (null != mVideoCaptureView)
            videoCaptureViewHolder = mVideoCaptureView.getHolder();
        try {
            mCamera.setPreviewDisplay(videoCaptureViewHolder);
        } catch (Throwable t) {
        }
        Log.v("CameraTest","Camera PreviewFrameRate = "+mCamera.getParameters().getPreviewFrameRate());
        Size previewSize=mCamera.getParameters().getPreviewSize();
        int dataBufferSize=(int)(previewSize.height*previewSize.width* (ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8.0));
        mCamera.addCallbackBuffer(new byte[dataBufferSize]);
        mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
            private long timestamp=0;
            public synchronized void onPreviewFrame(byte[] data, Camera camera) {
                Size previewSize=camera.getParameters().getPreviewSize();
                YuvImage yuvImage= new YuvImage(data,ImageFormat.NV21, previewSize.width, previewSize.height, null);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height),80, baos);
                byte jpgData[]=baos.toByteArray();
                bmp = BitmapFactory.decodeByteArray(jpgData, 0, jpgData.length);
                Bitmap bmp2 = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.RGB_565);
                Canvas canvas=new Canvas(bmp2);   
                Paint paint=new Paint();
                paint.setColor(Color.RED);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(2);
                Matrix matrix = new Matrix();
                matrix.setRotate(270,bmp.getWidth()/2,bmp.getHeight()/2);
                canvas.drawBitmap(bmp, matrix, paint);   
                faces = new FaceDetector.Face[MAX_FACES];
                int mFaceWidth = bmp2.getWidth();
                int mFaceHeight = bmp2.getHeight();
                PointF midPoint = new PointF();      //inizializza Punto di coordinate float
                FaceDetector detector = new FaceDetector(mFaceWidth, mFaceHeight,MAX_FACES);
                int facesFound = detector.findFaces(bmp2, faces); //bmp

                if(facesFound > 0 && message_started==false){
                    faces[0].getMidPoint(midPoint);
                    float eyeDistance = faces[0].eyesDistance();
                    float confidence = faces[0].confidence();
                    player.start(); //play of "You look good today!"
                    message_started = true;
                }
                miaImmagine2.setImageBitmap(bmp2);
                //+++++++++++++++++++++PARTE FINALE++++++++++++++++++++++++++++++++++++++++
                try{
                    camera.addCallbackBuffer(data);
                }catch (Exception e) {
                    Log.e("CameraTest", "addCallbackBuffer error");
                    return;
                }
                return;
            }
        });
        try {
            mCamera.startPreview();
        } catch (Throwable e) {
            mCamera.release();
            mCamera = null;
            return;
        }

    }
    //*************************************STARTVIDEO_END***************************************
    ////////////////////////////////////////////////////////////////////////////////////////////
    //*************************************STOPVIDEO********************************************


    private void stopVideo() {
        if(null==mCamera)
            return;
        try {
            mCamera.stopPreview();
            mCamera.setPreviewDisplay(null);
            mCamera.setPreviewCallbackWithBuffer(null);
            mCamera.release();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        mCamera = null;
    }
    //**********************************STOPVIDEO_END********************************************
    //////////////////////////////////////////////////////////////////////////////////////////////
    //**********************************FINISH***************************************************
    public void finish(){
        stopVideo();
        super.finish();
    };
    //**********************************FINISH_END***********************************************


    }
person Alex Mawashi    schedule 10.11.2016
comment
Может быть, я могу использовать что-то подобное? android-er.blogspot.co.uk/ 2012/04/ - person Ben Price; 10.11.2016
comment
Да, это именно тот детектор лиц, которым я уже пользовался, и он отлично работает. Вот документация: developer.android.com/reference/android/media / если вы тестируете решение, которое просто определяет ваше лицо, дайте мне знать - person Alex Mawashi; 10.11.2016
comment
Здорово! Я попробую этот, но у меня уже есть один, который я хотел бы показать вам и посмотреть, что вы скажете. У вас есть какие-нибудь сети, по которым я мог бы связаться с вами? Нравится Скайп? было бы проще - person Ben Price; 10.11.2016
comment
Я думаю, что лучший способ поделиться со мной своим кодом — это github. Если у вас есть учетная запись github, вы можете использовать ее для обмена кодом и проектами с другими, а также для того, чтобы ваш репозиторий присутствовал везде. Вы можете отправить мне ссылку, и я скачаю и протестирую ваш код, если хотите. - person Alex Mawashi; 10.11.2016
comment
Хорошо, вот тот, который я использую. Это просто камера codeload.github.com/ райктария/ - person Ben Price; 10.11.2016
comment
Привет! Не слышал от вас возрастов. Вы тестировали приложение? - person Ben Price; 13.11.2016
comment
О да, но он не делает распознавание лиц в реальном времени, поэтому я искал свой код, чтобы передать его вам. Как только я получу его, я отправлю его вам, если это возможно - person Alex Mawashi; 14.11.2016
comment
Это отлично! Спасибо Вам большое - person Ben Price; 14.11.2016
comment
Удивительно! Большое спасибо! И куда именно (и как) мне вставить код. извините я новенький - person Ben Price; 21.11.2016
comment
Этот код является кодом активности, реализующей распознавание лиц. На самом деле вы можете увидеть имя моего пакета, различные импорты, объявление имени класса, различные и типичные (для каждого действия) методы обратного вызова (onCreate, onPause, onStop, onDestroy). Итак, это класс Activity, а не просто фрагмент кода для вставки в класс Activity. Тем не менее, представление, принадлежащее этому действию, должно иметь некоторые элементы ViewGroup, которые вы можете увидеть в методе onCreate. То, что вам не нужно, вы просто стираете. - person Alex Mawashi; 21.11.2016
comment
Эй, Алекс, как я уже говорил, я нуб, не могли бы вы сказать мне, как импортировать этот фрагмент кода? - person Ben Price; 18.12.2016