日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

android 人脸识别边框_android Arcface人脸识别框/人脸抓拍框/人脸追踪框

發布時間:2024/7/19 pytorch 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 人脸识别边框_android Arcface人脸识别框/人脸抓拍框/人脸追踪框 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么要改?

先來看看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 人脸识别边框_android Arcface人脸识别框/人脸抓拍框/人脸追踪框的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。