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人脸识别框/人脸抓拍框/人脸追踪框的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: admin select 2 异步_解决
- 下一篇: oracle rman和数据泵,使用RM