2016-11-10 3 views
2

Ну, я слышал, что в студии Android уже есть класс камеры.Фронтальная камера распознает лицо (Android Studio)

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

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

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

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

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

Im нуб так успокойтесь при объяснении

ответ

1

Просто используйте библиотеки распознавания лиц родной андроида (а не 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*********************************************** 


    } 
+0

Могу ли я использовать что-то подобное? http://android-er.blogspot.co.uk/2012/04/face-detection-for-camera.html –

+0

Да, это точно детектор лица, который я уже использовал, и он отлично работает. Вот документация: https://developer.android.com/reference/android/media/FaceDetector.Face.html, если вы протестируете решение, которое просто обнаруживает ваше лицо, а затем дайте мне знать –

+0

Отлично! Я попробую это, но у меня уже есть один, который я хотел бы показать вам и посмотреть, что вы говорите. У вас есть сети для того, чтобы я мог с вами связаться? Как Skype? Было бы проще –

Смежные вопросы