首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“android-vision”库保存实时检测到的人脸(跟踪人脸)图像

使用“android-vision”库保存实时检测到的人脸(跟踪人脸)图像
EN

Stack Overflow用户
提问于 2017-12-15 21:18:03
回答 1查看 1.3K关注 0票数 1

在我的大学论文中,我需要一个能够实时检测和识别人脸的android程序。我读过“android-vision”库,并测试了示例代码。

https://github.com/googlesamples/android-vision/tree/master/visionSamples/FaceTracker/app/src/main/java/com/google/android/gms/samples/vision/face/facetracker.

修改后的代码:

代码语言:javascript
复制
package com.google.android.gms.samples.vision.face.facetracker;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.samples.vision.face.facetracker.ui.camera.GraphicOverlay;
import com.google.android.gms.vision.face.Face;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Graphic instance for rendering face position, orientation, and landmarks within an associated
 * graphic overlay view.
 */
class FaceGraphic extends GraphicOverlay.Graphic
{
    private static final float FACE_POSITION_RADIUS = 10.0f;
    private static final float ID_TEXT_SIZE = 40.0f;
    private static final float ID_Y_OFFSET = 50.0f;
    private static final float ID_X_OFFSET = -50.0f;
    private static final float BOX_STROKE_WIDTH = 5.0f;

    public Canvas canvas1;
    public Face face;
    int i =0;
    int flag = 0;

    private static final int COLOR_CHOICES[] = {
        Color.BLUE,
        Color.CYAN,
        Color.GREEN,
        Color.MAGENTA,
        Color.RED,
        Color.WHITE,
        Color.YELLOW
    };
    private static int mCurrentColorIndex = 0;

    private Paint mFacePositionPaint;
    private Paint mIdPaint;
    private Paint mBoxPaint;

    private volatile Face mFace;
    private int mFaceId;
    private float mFaceHappiness;
    public Bitmap myBitmap ;
    FaceGraphic(GraphicOverlay overlay)
    {
        super(overlay);

        mCurrentColorIndex = (mCurrentColorIndex + 1) % COLOR_CHOICES.length;
        final int selectedColor = COLOR_CHOICES[mCurrentColorIndex];

        mFacePositionPaint = new Paint();
        mFacePositionPaint.setColor(selectedColor);

        mIdPaint = new Paint();
        mIdPaint.setColor(selectedColor);
        mIdPaint.setTextSize(ID_TEXT_SIZE);

        mBoxPaint = new Paint();
        mBoxPaint.setColor(selectedColor);
        mBoxPaint.setStyle(Paint.Style.STROKE);
        mBoxPaint.setStrokeWidth(BOX_STROKE_WIDTH);
    }

    void setId(int id)
    {
        mFaceId = id;
        flag = 1;
    }


    /**
     * Updates the face instance from the detection of the most recent frame.  Invalidates the
     * relevant portions of the overlay to trigger a redraw.
     */
    void updateFace(Face face)
    {
        mFace = face;
        postInvalidate();
    }

    /**
     * Draws the face annotations for position on the supplied canvas.
     */
    @Override
    public void draw(Canvas canvas)
    {
        face = mFace;
        if (face == null)
        {
            return;
        }

        // Draws a circle at the position of the detected face, with the face's track id below.
        float x = translateX(face.getPosition().x + face.getWidth() / 2);
        float y = translateY(face.getPosition().y + face.getHeight() / 2);
 //       canvas.drawCircle(x, y, FACE_POSITION_RADIUS, mFacePositionPaint);
        canvas.drawText("id: " + mFaceId, x + ID_X_OFFSET, y + ID_Y_OFFSET, mIdPaint);
  //      canvas.drawText("happiness: " + String.format("%.2f", face.getIsSmilingProbability()), x - ID_X_OFFSET, y - ID_Y_OFFSET, mIdPaint);
  //      canvas.drawText("right eye: " + String.format("%.2f", face.getIsRightEyeOpenProbability()), x + ID_X_OFFSET * 2, y + ID_Y_OFFSET * 2, mIdPaint);
  //      canvas.drawText("left eye: " + String.format("%.2f", face.getIsLeftEyeOpenProbability()), x - ID_X_OFFSET*2, y - ID_Y_OFFSET*2, mIdPaint);

        // Draws a bounding box around the face.
        float xOffset = scaleX(face.getWidth() / 2.0f);
        float yOffset = scaleY(face.getHeight() / 2.0f);
        float left = x - xOffset;
        float top = y - yOffset;
        float right = x + xOffset;
        float bottom = y + yOffset;
        canvas.drawRect(left, top, right, bottom, mBoxPaint);

        Log.d("MyTag", "hello "+i);
        i++;

        if (flag == 1)
        {
            flag = 0;
            canvas1=canvas;
            // send face image to server for recognition
            new MyAsyncTask().execute("ppppp");

        }
    }


    class MyAsyncTask extends AsyncTask<String, Void, String>
    {
        private Context context;

        public MyAsyncTask()
        {
            // TODO Auto-generated constructor stub
            //context = applicationContext;
        }

        protected String doInBackground(String... params)
        {
            try
            {

                Log.d("MyTag", "face.getWidth() "+face.getWidth());
                Bitmap temp_bitmap = Bitmap.createBitmap((int)face.getWidth(), (int)face.getHeight(), Bitmap.Config.RGB_565);
                canvas1.setBitmap(temp_bitmap);


            }
            catch (Exception e)
            {
                Log.e("MyTag", "I got an error", e);
                e.printStackTrace();
            }
            Log.d("MyTag", "doInBackground");
            return null;
        }

        protected void onPostExecute(String result) {
            Log.d("MyTag", "onPostExecute " + result);
            // tv2.setText(s);

        }

    }

}

它给了我一个错误:

代码语言:javascript
复制
12-16 03:08:00.310 22926-23044/com.google.android.gms.samples.vision.face.facetracker E/MyTag: I got an error
                                                                                               java.lang.UnsupportedOperationException
                                                                                                   at android.view.HardwareCanvas.setBitmap(HardwareCanvas.java:39)
                                                                                                   at com.google.android.gms.samples.vision.face.facetracker.FaceGraphic$MyAsyncTask.doInBackground(FaceGraphic.java:175)
                                                                                                   at com.google.android.gms.samples.vision.face.facetracker.FaceGraphic$MyAsyncTask.doInBackground(FaceGraphic.java:158)

该代码可以实时检测人脸。对于识别部分,我计划使用'JavaCV‘https://github.com/bytedeco/javacv。如果我能在位图中捕捉到脸,那么我就可以将它保存在.jpg图像中,然后我就能识别它。请你给我一些建议,如何避免被检测到的脸。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-12-06 16:26:23

TL;DR:捕获一个框架,处理它,然后保存/导出。

从源头

代码语言:javascript
复制
@Override
public void setBitmap(Bitmap bitmap) {
    throw new UnsupportedOperationException();
}

这意味着Canvas无法处理setBitmap(Bitmap bitmap)方法。

你的表演有几个问题。

第一:负载的AsynkTask(s),其中许多是无用/冗余和

如果您使用的是com.google.android.gms.vision.*类,那么您很可能每秒收到大约30个事件。当事件发生时,几乎可以确保捕获的帧与评估的帧不同。你在与你的条件竞争

第二:使用画布设置位图

始终在使用类时,检查它的文档和祖先,最后检查它的实现。

ImageView将按您的意愿执行。通过接收位图,然后设置为它。所有比赛条件将由OS<处理,冗余请求将由主活套删除。

最后

如果你需要的也许是“拍照,当某人闭上眼睛微笑”,那么你就需要颠倒你的逻辑。使用源生成帧。然后处理该框架,如果它符合您的条件,则保存它。

这个codelabs项目几乎可以满足您的需要。,它很好地解释了它的细节

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47839974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档