Android 一分钟了解简单原生FaceDetector人脸识别,解决SurfaceView+MediaRecorder录制视频不清晰

Android 原生的人脸识别Camera+FaceDetector示例 人脸识别google有自带api,Androoid 原生的人脸识别是利用相机的摄像功能和android.media.FaceDetector这个类来实现的 1、android.hardware.camera 1.1 简介 Camera 类用于设置图像捕获设置、开始/停止预览、抓拍图片和检索帧以进行视频编码 Camera的源码 1.2 人脸识别步骤: 1. 初始化相机并设置相机参数; 2. 设置预览监听setPreviewDisplay(); 3. 开始预览startPreview(); 4. 实现预览的接口 阅读详情

近来,发现登入后台管理系统,发现上传上来的认证视频太模糊了,于是乎,发现没有给MediaRecorder设置帧频率。

// 设置帧频率,录制视频会更加清晰
mRecorder.setVideoEncodingBitRate(5*1024*1024);

1.直接开撸,先打开相机,来获取想要的bitmap,关于为什么用到YuvImage:https://blog.youkuaiyun.com/illidantao/article/details/51366047

    try {
                    camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
                } catch (Exception e) {
                    e.printStackTrace();
                }

              
                try {
                    camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
                camera.setDisplayOrientation(90);
                camera.startPreview();
            }
            camera.setPreviewCallback(new Camera.PreviewCallback() {

                @Override
                public void onPreviewFrame(final byte[] data, Camera camera) {
                    Camera.Size size = camera.getParameters().getPreviewSize();
                    YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width,
                            size.height, null);
                    if (image != null) {
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        image.compressToJpeg(new Rect(0, 0, size.width, size.height),
                                80, stream);
                        Bitmap bmp = BitmapFactory.decodeByteArray(
                                stream.toByteArray(), 0, stream.size());
                        Matrix matrix = new Matrix();
                        matrix.reset();
                        matrix.setRotate(-90);
                        bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
                        Bitmap bitmap = bmp.copy(Bitmap.Config.RGB_565, true);
                        findFace(bitmap);
                        try {
                            stream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

            });

安卓原生SDK中有个FaceDetector类,传入一个Bitmap 格式的数据;B,只能识别双眼距离大于20 像素的人脸像(当然,这个可在framework层中修改);C,只能检测出人脸的位置(双眼的中心点及距离),不能对人脸进行匹配(查找指定的脸谱)。下面的坐标实现具体的获取人脸的中心点坐标,通过FaceDetector.Face[1]传入要抓取的个数,如果想抓去多个的话Face[*]就可以了,findFaces(bitmap,face)得到一个int值,如果其大于1则代表成功那么就开始接下来的操作了。 

public void findFace(Bitmap bitmap) {
    FaceDetector faceDetector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 1);
    FaceDetector.Face[] face = new FaceDetector.Face[1];
    int faces = faceDetector.findFaces(bitmap, face);
    if (faces > 0) {
        camera.stopPreview();
        preview = false;
        camera.setPreviewCallback(null);
        camera.release();
        initMediaRecorder();
    }
}

 2.当获取验证成功以后,实现6秒录制视频。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    setContentView(R.layout.activity_uservideo);
    
    surfaceview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    surfaceview.getHolder().setFixedSize(200, 200);
    surfaceview.getHolder().addCallback(new SurfaceViewCallback());
}
 public void initMediaRecorder() {
        if (mRecorder == null) {
            mRecorder = new MediaRecorder(); // Create MediaRecorder
        }

        try {
            initCamera();

            // 这两项需要放在setOutputFormat之前
            mRecorder.setCamera(videocamera);
            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            // Set output file format
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            // 这两项需要放在setOutputFormat之后
            mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//            mRecorder.setOrientationHint(90);
//            mRecorder.setVideoSize(320, 240);
            CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
            mRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
            // 设置帧频率,录制视频会更加清晰
            mRecorder.setVideoEncodingBitRate(5*1024*1024);
            // mRecorder.setVideoFrameRate(20);
            mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
            file = Constants.FOLDER_PHOTO + System.currentTimeMillis() + ".mp4";
            mRecorder.setOutputFile(file);

            mRecorder.prepare();
            mRecorder.start();   // Recording is now started
            setCountBack();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
private void initCamera() {
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras(); // get cameras number

    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo); // get camerainfo
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            // 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
            try {
                videocamera = Camera.open(camIdx);
                videocamera.setDisplayOrientation(90);
                videocamera.cancelAutoFocus();
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }
    }
    videocamera.unlock();
}

 

void setCountBack() {
    timeCount = 5;
    timetext.setText(timeCount + "秒");
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (timeCount > 0) {
                timetext.setText(--timeCount + "秒");
                handler.postDelayed(this, 1000);
                return;
            }

            timetext.setText("");

            if (mRecorder == null) {
                return;
            }

            try {
                mRecorder.stop();
                //上传视频
                uploadVideo();
            } catch (Exception e) {
                ToastUtil.showToast(AuthRecordingVideoActivity.this, getString(R.string.error_recoder));
            }
        }
    }, 1000);


}

关于SurfaceView预览Camera拉伸问题:https://blog.youkuaiyun.com/illidantao/article/details/51366047

Android 的Face Detector实现人脸识别 很多手机图片管理应用都开始集成人脸识别功能。一提到人脸识别,模式识别,滤波,BlahBlah 一堆复杂的技术名字戳入脑海中,立刻觉得这玩意儿没法碰,太玄乎了。其实Android SDK从1.0版本中(API level 1)就已经集成了简单的人脸识别功能,通过调用FaceDetector 我们可以在Android平台上实现Bitmap多人脸识别(一张图中有多个人脸出现的话)。周五啦,我就简简单单写写,希望感兴趣的同学对这个深藏在Android SDK中的功能有所了解。 流程是这样的: ... 阅读详情

相关推荐

Android开发—浅谈人脸检测的简易实现,成功定级腾讯T3-2

findFaces()方法 Canvas类绘制人脸矩形区域 完整代码 最终效果图 结语 Android中的人脸检测 ======================================================================== 计算机视觉开发在近些年来越发火热,而关于人脸检测或识别等相应功能也成为了大家津津乐道的话题。在智能手机端领域中,人脸识别被广泛用于人脸解锁这项功能中,从简单的2D人脸图像识别,到之后加入的3D结构光技术,人脸识别的精确率在飞速..

m0_64603743的博客 652

FaceDetector(人脸识别)

微软的 how-old.net 把人脸识别技术又大大的火了一把。通过大数据和复杂的算法,能够神奇的预测出照片中人物的性别和年龄。虽然错误率也不低,但是大家都抱着玩一玩乐一乐的心态把照片传上去让机器来鉴定一下自己的颜龄。 Android 早已提供了 FaceDetector 类,今天就来看看如何使用这个类人脸检测吧。 流程: 1.打开文件夹选择照片 2.将照片加载到 bitmap 中并缩...

有的话没说出来之前,你是他的主人,一旦说出来你就成了他的奴隶||想要干好事,别太把自己当人,别把别人太不当人||认识这个人就是开了一扇窗户,就能看到不一样的东西,听到不一样的声音,能让你思考、觉悟,这已经够了 7835

Android音视频开发:录制视频 + 语音识别 + 人脸识别

最近两个月在搞 Android 音视频相关方面的需求,下面是记录一次音视频开发的实操记录; 最下面有demo; 移动端具体的需求是这个样子的: 录制视频 + 同时语音识别 + 同时人脸识别 + 同时语音合成;视频时长大概是一个小时,不能压缩处理。 OK,需求出来我是崩溃的,Android 原生不支持录制视频的同时去实现语音识别,而 iOS 原生支持,这就加长了 Android ...

wuqingsen1的博客 3645

Android下的人脸识别——FaceDetector的使用

这一篇要记录的是Android平台中的人脸识别技术,这里所说的人脸识别是Android系统内置的人脸识别API——FaceDetector,该API可以通过少量代码完成人脸识别,但是这种识别是最基本的识别,即只能识别出图像中的人脸,仅此而已,不能做更精确的识别(比如判断人脸的身份),下面记录我使用FaceDetector的过程: 首先来一张图: 我们的代码即将完成上图中的功能,选择图片

记录技术,记录生活 1万+

Android 人脸检测:实现人脸检测功能的FaceDetector编程

在上述示例代码中,我们首先加载了一个待检测的图片,然后创建了一个FaceDetector实例。接下来,我们将待检测的图片转换为Frame对象,并调用FaceDetector的detect方法进行人脸检测。接着,我们调用detectFaces方法进行人脸检测,得到检测结果faces。在上述代码中,我们创建了一个名为FaceDetectionHelper的辅助类,其中的detectFaces方法接受一个Bitmap对象作为输入,并返回一个SparseArray对象,其中包含检测到的人脸信息。

2301_79326891的博客 623

Android人脸检测类FaceDetector编程

接下来,我们调用FaceDetectionHelper的detectFaces()方法来检测人脸,返回的结果存储在SparseArray中。在detectFaces()方法中,我们将传入一个位图对象,然后使用FaceDetector检测人脸。检测结果以SparseArray的形式返回,其中Key为人脸的索引,Value为对应的Face对象。通过使用FaceDetector类,我们可以方便地进行人脸检测,并获取人脸的位置和关键点信息,从而实现各种人脸相关的应用。我们使用Log.d()方法将结果输出到日志中。

SVIPCODE的博客 438

探索高效面部检测:FaceDetector 开源项目深度解析

探索高效面部检测:FaceDetector 开源项目深度解析 在人工智能领域,面部检测是一个重要的子任务,广泛应用于照片美化、人脸识别系统、视频监控等场景。今天,我们要介绍的是一个名为 的开源项目,它基于Android平台,提供了高效的面部检测解决方案。 项目简介 FaceDetector 是一个轻量级的Android库,其核心目标是快速准确地检测图像或视频流中的面部特征。该项目采用OpenC...

gitblog_00010的博客 805

Android平台人脸识别功能实现详解

本文还有配套的精品资源,点击获取 简介:Android操作系统内置了人脸识别技术,通过API和相机硬件支持提供生物特征识别服务。文章详细介绍了Android人脸检测框架、Face Detection API、具体使用步骤、应用示例以及性能优化和兼容性处理的注意事项。开发者可利用这一技术实现多种基于人脸的应用,提高应用的智能度和个性化水平。 1. Android人脸...

weixin_29840475的博客 3572

Android 系统FaceDetector人脸识别检测,圆形相机预览框,截取图片中的人脸图片(宽高自定义),圆形图片显示。

本内容主要实现了以下功能: 圆形相机预览框 FaceDetector人脸识别检测 截取图片中的人脸图片(宽高自定义) 圆形图片显示 效果图: 以下只说了大致的实现思路和核心入口代码,详情见demo(文末奉上) 1、圆形相机预览 自定义CircleCameraLayout类,自定义一个轮廓提供者裁剪一个圆形,在定义一个相机预览CameraPreview,然后把CameraPrevi...

m13984458297的博客 5651

在Android平台上实现人脸识别功能

本文还有配套的精品资源,点击获取 简介:人脸识别技术已广泛应用于智能设备,特别是在Android系统中,它提供了一种便捷和安全的身份验证方法。Android的人脸识别功能主要依赖于 FaceDetector API和 Face 服务,后者从Android 8.0起为复杂应用提供支持。本文将探讨如何在Android平台上实现人脸识别功能,包括权限处...

weixin_29317963的博客 2931

Android-Facedetector一个实时人脸检测Android库

一个人脸检测Android库,可以轻松插入任何相机API(因为它提供了一种处理其帧的方法)。人脸检测器建立在Firebase ML Kit的人脸检测API之上。

Android FeceDetector(人脸识别)

1. FectDetector 人脸的检测方法是用双眼来检测人脸的位置,也就是说无法检测到嘴、侧脸等,双眼必须同时可见,并且眼镜会影响检测的效果。实际上,FaceDetector检测到的并不是人的全脸,而只是双眼。输入图片必须为Bitmap RGB565格式 图片太小的话检测不到人脸,小于100x100的图片检测不到人脸,由于Android内存有限,图片太...

mazaiting的博客 568

Android SurfaceView拍照录像实现方法

主要为大家详细介绍了Android SurfaceView拍照录像实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Android FaceDetector实现人脸检测,人脸追踪(框出人脸)(MVP模式)

主要流程: 1.通过FaceDetector类来检测人脸,返回获取到的人脸信息,以及人脸的坐标,通过人脸坐标可以做人脸追踪的操作。 2.通过两个surfaceview,一个surfaceview用来做相机的预览,另外一个surfaceview附着在相机预览surfaceview上面,用来绘制人脸的相框。

a289973483的博客 2万+

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash

七、从0开始卷出一个新项目之瑞萨RZN2L 2.2.2 启动模式和flash。

cl234583745的博客 1466

Matlab双目相机标定

1 概述 现在有许多双目相机在出厂时就已经标定好了,用户拿到手后可以直接使用,例如Intel Realsense系列。但是有些相机出厂的时候并没有完成标定工作,因而这个时候就需要我们自己来标定。由于笔者曾改装过一个双目相机,最远可以测至50m,因此有一定的心得体会想给大家分享一下。本文主要介绍双目相机标定的整个过程,以及导出标定数据的方法。 相机标定主要分为手动标定和自动标定,手动标定比较繁琐,这里主要介绍基于matlab工具箱的自动标定方式来对双目相机进行标定。具体的相关标定细节也可以参照这篇博客:m

weixin_46133643的博客 2万+

android 原生人脸检测

在android打开照相机时自动会对焦,并且能自动识别人脸,这个是利用google自带的FaceDetector做人脸检测识别 下面就简单介绍一下Fade Detector 的用法 1,照相机的打开,拍照识别时首先对摄像头进行配置 a,将摄像头Camera和SurfaceView绑定具体,在百度一搜一大堆 ,具体代码如下 @Override protected void onPostC...

lvzongning的专栏 4024

从原理图到代码:深入解析SX1278 LoRa模块与STM32的SPI通信驱动(附完整工程)

本文深入解析了SX1278 LoRa模块与STM32的SPI通信驱动实现,从硬件原理图到完整工程代码,详细介绍了LoRa技术的通信原理、寄存器配置、SPI接口设计及低功耗优化策略。适合物联网开发者和嵌入式工程师提升远距离无线通信能力,附完整工程代码助力快速开发。

weixin_42715608的博客 423

如何让开源项目性能优化成为你的ModSecurity防火墙加速引擎?

在当今高并发Web应用环境中,许多运维团队面临着共同的困境:安全防护与系统性能之间的艰难平衡。当ModSecurity Web应用防火墙部署后,原本流畅的应用响应时间突然增加了200-300毫秒,CPU使用率飙升30%,内存占用翻倍增长。这种性能损耗不仅影响用户体验,更可能在高流量场景下导致服务不可用。问题的核心在于,默认配置往往采用"一刀切"策略,未能针对具体业务场景进行精细化调优。 [![M

gitblog_00409的博客 916

Spring WebFlux响应式编程实战(三):优雅处理异常与高效调试技巧

本文深入探讨了Spring WebFlux响应式编程中的异常处理与调试技巧。文章通过电商订单流处理场景,详细解析了Reactor核心操作符onErrorReturn、onErrorResume和onErrorMap的实战应用,并介绍了如何构建@ControllerAdvice和WebExceptionHandler全局异常处理防线。同时,提供了使用.log()操作符、Hooks.onOperatorDebug()及BlockHound进行高效调试的方法,旨在帮助开发者构建健壮、可维护的响应式应用。

weixin_29252171的博客 65

stm32H743基于CubeMX配置为双ADC多通道DMA规则采样

stm32H743的ADC支持的最大频率为36MHz,有相关资料上说是可以超频,具体技术细节不多讨论。 需求: 使用stm32H743的ADC采集5路ovrc

xtqbp的博客 4361

FaceDetector 项目常见问题解决方案

FaceDetector 是一个用于 Android 应用的面部检测库。它能够在相机预览流中实时检测人脸,并且非常易于使用。该项目主要使用 Java 和 Kotlin 进行开发,同时也使用了 C++ 作为核心算法实现。 ## 新手使用注意事项及解决方案 ### 1. 依赖库的正确配置 **问题描述**:新手在配置项目依赖时可能会遇到版本不匹配或依赖库无法找到的问题。 **解决方案**: ...

gitblog_00187的博客 846

STM32(HAL库)驱动st7789LCD屏幕(7引脚240*240)

屏幕厂家提供的都是标准库,网上找了找没看到好用的HAL库屏幕驱动,因此本文对HAL库驱动TFT屏幕进行详细讲解。

weixin_44597885的博客 6059

安卓人脸检测之FaceDetector

最近看到一个APP的头像上传时,如果你设置的图片里面没有人脸,或者有两张以及以上人脸的时候,会提示你图片不符合规范,让你重新设置,这样是为了确保用户的头像是人! 然后我就在网上查看了一下资料,发现谷歌原生Android里面提供了API,那就是我们今天要介绍的FaceDetector,下面我来给大家介绍一下: FaceDetector检测到的并不是人的全脸,而只是双眼。 实际测试中,...

lixuce1234的博客 4684

QT C++ AI棉花智能变量灌溉工上位机(信创完整版)

北斗履带灌溉机器人/田间分区电磁阀基站 → 多层土壤温湿度/盐分EC传感器实时采集墒情 → 双目AI视觉扫描棉田长势、病苗分布 → AI融合**生育期+土壤墒情+盐分+棉株长势**计算变量灌溉定额、水肥配比、灌溉时长 → 分区电磁阀/变频水泵变量供水,病弱苗地块减量、干旱地块增量;墒情、盐分、长势多因子闭环修正灌水量;多层土壤含水率(0–10/20–40/40–80cm)、土壤EC盐分、土壤温度、空气温湿度、蒸发量、北斗地块坐标、管道水压、水肥罐液位、分区流量计、水泵电机负载、滴灌带压力反馈。

寒寒豆豆软件公司的博客 184

scp 出现Permission denied错误 解决方法

第一种说辞(来源于网络),说是scp涉及root远程登录,默认是没有打开的,只需要把配置文件中的permit打开即可。最后scp的时候发现还不行,只需要将其scp的服务器用户名 修改为root即可。第二种解决方案,将scp 传输的服务器用户名改为root即可。(这是最基本的,一开始我忽视了这个问题,导致一直scp不了)window系统下,向ubuntu操作系统 scp传输文件。

码农研究僧的博客 6727
上一篇: Android快速实现手机号及邮箱验证(手机号正则表达式及邮箱正则表达式)
下一篇: Android 自定义Imageview之RoundCornersImageView(实现圆角及圆形图片)
探索者丶
博客等级 码龄10年 29粉丝 32原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值