1. 程式人生 > >android自定義虹軟人臉識別框/人臉抓拍框/人臉追蹤框

android自定義虹軟人臉識別框/人臉抓拍框/人臉追蹤框

有一兩個月沒有更新部落格了,最近一直在忙人臉識別的專案,先將專案中更改虹軟人臉框的方法抽取出來,希望對大家有所幫助。

為什麼要改?

先來看看sdk demo中提供的人臉框樣式,這個框看上去並不是非常美觀(個人覺得)

這裡寫圖片描述

再看看下面這個框是不是就要順眼一點
這裡寫圖片描述

怎麼換?

先來看看原始的畫法:

 @Override
    public void onAfterRender(CameraFrameData data) {
         mGLSurfaceView.getGLES2Render().draw_rect((Rect[]) data.getParams(), Color.GREEN,
2); }

其實更換人臉識別框是非常簡單的,因為虹軟的人臉識別sdk已經將人臉的位置回調出來了,實時回撥的是一個Rect(將回調出來的CameraFrameData強轉一下即可),既然都知道人臉框的位置,那就是一個自定義View就解決的事了。

只需要在onDraw方法中畫八條線即可

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (rect != null) {
            /**
             * 左上角的豎線
             */
canvas.drawLine(rect.left, rect.top, rect.left, rect.top + 20, mPaint); /** * 左上角的橫線 */ canvas.drawLine(rect.left, rect.top, rect.left + 20, rect.top, mPaint); /** * 右上角的豎線 */ canvas.drawLine(
rect.right, rect.top, rect.right - 20, rect.top, mPaint); /** * 右上角的橫線 */ canvas.drawLine(rect.right, rect.top, rect.right, rect.top + 20, mPaint); /** * 左下角的豎線 */ canvas.drawLine(rect.left, rect.bottom, rect.left, rect.bottom - 20, mPaint); /** * 左下角的橫線 */ canvas.drawLine(rect.left, rect.bottom, rect.left + 20, rect.bottom, mPaint); /** * 右下角的豎線 */ canvas.drawLine(rect.right, rect.bottom, rect.right, rect.bottom-20, mPaint); /** * 右下角的橫線 */ canvas.drawLine(rect.right, rect.bottom, rect.right-20, rect.bottom , mPaint); } }

這裡其實還有一個坑,就是這個Rect是相對於相機解析度的,但是如果攝像頭的預覽解析度不等於畫布的大小就會出現錯位的情況,比如下面的情況:(綠框是虹軟demo中的人臉框,藍色框是自定義的框)
這裡寫圖片描述

怎麼解決呢?你應該想到了,將寬高等比例縮放一下即可,所以提供畫人臉框的一個方法:

 /**
     * 開始畫矩形框
     *
     * @param rect1
     */
    public void drawFaceRect(Rect rect1) {
        this.rect = rect1;
        //將螢幕人臉框轉換為視訊區域的人臉框
        rect.left = rect.left * getWidth() / screenHeight+20;
        rect.right = rect.right * getWidth() / screenHeight+40;
        rect.top = rect.top * getHeight() / screenHeight+30;
        rect.bottom = rect.bottom * getHeight() / screenHeight+75;
        //在主執行緒發起繪製請求
        postInvalidate();
    }

注意:此處的+20,+40,+30,+75都是經驗值,都是相對於左上右下的位置,可根據自己的裝置做微調。

此外我們還需要提供一個清除人臉框的方法(沒有識別到人臉的時候框要消失):

 public void clearRect() {
        rect = null;
        postInvalidate();
    }

下面是本View完整的程式碼(只是demo,還有優化的地方,只是提供一種思路,思路理解了,還可以畫很多炫酷的框):

/**
 * 自定義虹軟人臉識別框/人臉抓拍框/人臉追蹤框
 * Created by HDL on 2018/7/31.
 */
public class FaceRectView extends View {
    private Rect rect;
    private int screenWidth;
    private int screenHeight;

    public FaceRectView(Context context) {
        this(context, null);
    }

    public FaceRectView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FaceRectView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        screenWidth = wm.getDefaultDisplay().getWidth();
        screenHeight = wm.getDefaultDisplay().getHeight();
        initPaint(context);
    }

    private void initPaint(Context context) {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(3);
        mPaint.setColor(context.getResources().getColor(R.color.color_face_rect));
    }

    private Paint mPaint;

    /**
     * 開始畫矩形框
     *
     * @param rect1
     */
    public void drawFaceRect(Rect rect1) {
        this.rect = rect1;
        //將螢幕人臉框轉換為視訊區域的人臉框
        rect.left = rect.left * getWidth() / screenHeight+20;
        rect.right = rect.right * getWidth() / screenHeight+40;
        rect.top = rect.top * getHeight() / screenHeight+30;
        rect.bottom = rect.bottom * getHeight() / screenHeight+75;
        //在主執行緒發起繪製請求
        postInvalidate();
    }

    public void clearRect() {
        rect = null;
        postInvalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (rect != null) {
            /**
             * 左上角的豎線
             */
            canvas.drawLine(rect.left, rect.top, rect.left, rect.top + 20, mPaint);
            /**
             * 左上角的橫線
             */
            canvas.drawLine(rect.left, rect.top, rect.left + 20, rect.top, mPaint);

            /**
             * 右上角的豎線
             */
            canvas.drawLine(rect.right, rect.top, rect.right - 20, rect.top, mPaint);
            /**
             * 右上角的橫線
             */
            canvas.drawLine(rect.right, rect.top, rect.right, rect.top + 20, mPaint);
            /**
             * 左下角的豎線
             */
            canvas.drawLine(rect.left, rect.bottom, rect.left, rect.bottom - 20, mPaint);
            /**
             * 左下角的橫線
             */
            canvas.drawLine(rect.left, rect.bottom, rect.left + 20, rect.bottom, mPaint);

            /**
             * 右下角的豎線
             */
            canvas.drawLine(rect.right, rect.bottom, rect.right, rect.bottom-20, mPaint);
            /**
             * 右下角的橫線
             */
            canvas.drawLine(rect.right, rect.bottom, rect.right-20, rect.bottom , mPaint);
        }
    }
}

  • 2018.9.27更新
    有小夥伴不知道怎麼使用,只需要在onAfterRender回撥中使用即可
 @Override
    public void onAfterRender(CameraFrameData data) {
             params = (Rect[]) data.getParams();
            if (params.length > 0) {
                param = params[0];
                faceRectView.drawFaceRect(param);
            } else {
                faceRectView.clearRect();
            }
      }

相關推薦

android定義人臉識別/人臉拍框/人臉追蹤

有一兩個月沒有更新部落格了,最近一直在忙人臉識別的專案,先將專案中更改虹軟人臉框的方法抽取出來,希望對大家有所幫助。 為什麼要改? 先來看看sdk demo中提供的人臉框樣式,這個框看上去並不是非常美觀(個人覺得) 再看看下面這個框是不是就要順眼一點 怎麼

Android 定義輸入鍵盤

前言 在日常開發中,有的時候我們需要使用者輸入指定範圍的內容,除了給與充分的文字提示,更加人性化的就是定製一個自定義鍵盤。 Android的自定義鍵盤常用於密碼輸入時的安全鍵盤,比如支付寶支付時。 如上圖,在輸入體溫時,彈出一個自定義的體溫鍵盤,這樣既能人性化服務,也能規避

Android定義語音音訊對話識別翻譯動畫控制元件

最近做翻譯器專案,專案中用到科大語音翻譯,語音動畫需要自己寫,對於我稍微有點複雜,把程式碼貼出來供大家參考下,不足之處請指正! 自定義控制元件包含有語音動畫(音量大小波浪動畫),音柱(音量大小音柱改變高低),文字(請講話、識別中、翻譯中)。 /** *

android 定義控件之簡單的loading

void stroke color mat pri htm img 溫習 時機   好吧,久不動android,感覺自己已經快是條鹹魚了,趁著這周的開發任務已完成,下周的開發計劃未下來之際,來溫習一下android的自定義控件,於是就有了下面這個醜陋的玩意      實現起

Android定義Dialog多選對話(Dialog+Listview+CheckBox)

dia bundle adapter get etl wrap 點擊 所有 技術 先放效果截圖 項目中需要有個Dialog全選對話框,點擊全選全部選中,取消全選全部取消。下午查了些資料,重寫了一下Dialog對話框。把代碼放出來。 public class MainAct

Android定義View——定義搜尋(SearchView) 非常實用的控制元件

好多東西寫起來太麻煩了,而且我在最開始用的也不是自己寫的,所以找了一個非常棒的測試了一下.  轉載的 在 Android開發中,當系統資料項比較多時,常常會在app新增搜尋功能,方便使用者能快速獲得需要的資料。搜尋欄對於我們並不陌生,在許多app都能見到它,比如豌

android定義彈出樣式實現

前言: 做專案時,感覺android自帶的彈出框樣式比較醜,很多應用都是自己做的彈出框,這裡也試著自己做了一個。 廢話不說先上圖片: 實現機制 1.先自定義一個彈出框的樣式 2.自己實現CustomDialog類,繼承自Dialog,實現裡面方法,在裡面載入自定義樣式的

android 定義搜尋

1.編寫佈局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+

Android定義輸入

public class InputCustomDialog extends Dialog { public InputCustomDialog(Context context, int theme) { super(context, theme);

Android定義view案例一氣泡

通過之前的兩個基礎文章的學習,我們基本知道自定義view的基本流程和各方法的作用了。那麼接下來我們就要拿起畫筆去繪製我們的view了。首先老規矩把我們的學習大綱拿出來,時刻不能忘,,哈哈、 1.自定義view單純的用畫筆繪製view(死view) 2.自定義view增加手勢

Android定義網路資料載入等待的簡單封裝

先上效果圖(在5.0以上機型顯示效果,如果是4.0會變為灰色): 自定義Dialog如下: public class LoadingCustom extends Dialog{ pr

Android定義View:你需要一個簡單好用、含歷史搜尋記錄的搜尋嗎?

前言 Android開發中,類似下圖的搜尋功能非常常見 今天,我將帶來一款 封裝了 歷史搜尋記錄功能 & 樣式 的Android 自定義搜尋框 開源庫,希望你們會喜歡。

Android定義View——從零開始實現水波浪進度

前言:相信同行們都知道,我們程式設計師有一種痛,叫做別人的程式碼。讀懂別人的程式碼很重要的一點就是要抓住作者的思路,有了思路才能將過程推匯出來,否則腦闊會疼。為己為人,本系列教程部落格,我都會將自己實現的思路寫下來,帶大家一步步從零開始實現我們想要的效果

android定義view_ClearEditText帶清空按鈕的輸入

建立一個類繼承EditText import android.annotation.SuppressLint; import android.content.Context; import android.graphics.drawable.Drawable; impo

Android定義View實戰】之定義超簡單SearchView搜尋

package cn.bluemobi.dylan.searchview; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; import android.util.A

android定義文字,後面帶清空按鈕

class MyEditText extends EditText { private final String TAG = "MyEditText"; private Drawable dRight; private Rect rBounds; // 構造器 public MyEditText(Conte

Android 定義方形驗證碼輸入,仿滴滴、小籃單車

效果圖 GIF圖不是很清晰,下面是截圖 思路 1 . 每一個輸入框其實都是一個EditText,for迴圈建立並插入到LinearLayout中。 private void

Android定義控制元件——仿微信半透明載入

在我們的app中不免回遇到耗時操作,這時我們給個載入框進行過度,使使用者體驗大大加強。 一、CustomDialog類的編寫 package com.daqsoft.jingguan.weight; import android.app.Dialo

Android定義輸入樣式

資料來自:菜鳥教程自行編寫一個ShapeDrawable的資原始檔!然後TextView將blackgroung 設定為這個drawable資源即可!shapeDrawable資原始檔的幾個節點以及屬性

Android定義方形驗證碼輸入

先來看UI給的效果圖 實現思路 繪製多個TextView控制元件用來顯示數字 繪製隱藏EditText用來接收輸入法內容(防止部分手機或輸入法監聽不到內容) 將EditText的內容顯示到TextView中 程式碼實現 自定義控制元件繼