可视化课题组网站建设教程,河源新闻最新消息,云卡会员管理系统,WordPress手机横屏为什么要改#xff1f;先来看看sdk demo中提供的人脸框样式#xff0c;这个框看上去并不是非常美观(个人觉得)再看看下面这个框是不是就要顺眼一点怎么换#xff1f;先来看看原始的画法#xff1a;Overridepublic void onAfterRender(CameraFrameData data) {mGLSurfaceVie…为什么要改先来看看sdk demo中提供的人脸框样式这个框看上去并不是非常美观(个人觉得)再看看下面这个框是不是就要顺眼一点怎么换先来看看原始的画法Overridepublic void onAfterRender(CameraFrameData data) {mGLSurfaceView.getGLES2Render().draw_rect((Rect[]) data.getParams(), Color.GREEN, 2);}其实更换人脸识别框是非常简单的因为虹软的人脸识别sdk已经将人脸的位置回调出来了实时回调的是一个Rect(将回调出来的CameraFrameData强转一下即可)既然都知道人脸框的位置那就是一个自定义View就解决的事了。只需要在onDraw方法中画八条线即可Overrideprotected 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() / screenHeight20;rect.right rect.right * getWidth() / screenHeight40;rect.top rect.top * getHeight() / screenHeight30;rect.bottom rect.bottom * getHeight() / screenHeight75;//在主线程发起绘制请求postInvalidate();}注意此处的20403075都是经验值都是相对于左上右下的位置可根据自己的设备做微调。此外我们还需要提供一个清除人脸框的方法(没有识别到人脸的时候框要消失)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() / screenHeight20;rect.right rect.right * getWidth() / screenHeight40;rect.top rect.top * getHeight() / screenHeight30;rect.bottom rect.bottom * getHeight() / screenHeight75;//在主线程发起绘制请求postInvalidate();}public void clearRect() {rect null;postInvalidate();}Overrideprotected 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回调中使用即可Overridepublic void onAfterRender(CameraFrameData data) {params (Rect[]) data.getParams();if (params.length 0) {param params[0];faceRectView.drawFaceRect(param);} else {faceRectView.clearRect();}}