react-native人脸识别采坑之旅--人脸采集

本文分享了在React Native中使用react-native-camera组件进行人脸考勤签到的实践经验,包括开发环境配置、核心代码实现、人脸识别坐标点信息解析及绘制相框技巧,以及解决模拟器上人脸识别错误的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为一个只会做前端的开发,做一些普通的开发还好说,每次react-native碰到需要集成别的插件就非常头疼。最近公司考勤会议签到想弄点新花头,要求人脸考勤签到,下面是我在使用react-native-camera做人脸采集时候遇到的一些坑。

首先看官方文档github上面react-native-camera的官方文档部署开发环境:

GitHub - react-native-camera/react-native-camera: A Camera component for React Native. Also supports barcode scanning!

我配置的开发的环境如下:

1.Android Studio 3.0.1
2.react-native 0.57.4
3.react-native-camera 1.4.1
4.模拟器采用Genymotion Google Pixel2- 8.0 -API26

核心代码:

这是官方给出的示例代码,复制上去就可以了,以下我粘贴了一小部分:

      <RNCamera
        ref={ref => {
          this.camera = ref;
        }}
        style={{
          flex: 1,
        }}
        type={this.state.type}
        flashMode={this.state.flash}
        autoFocus={this.state.autoFocus}
        zoom={this.state.zoom}
        whiteBalance={this.state.whiteBalance}
        ratio={this.state.ratio}
        faceDetectionLandmarks={RNCamera.Constants.FaceDetection.Landmarks.all}
        onFacesDetected={this.onFacesDetected}
        onFaceDetectionError={this.onFaceDetectionError}
        onTextRecognized={(d) => {
           console.log('onTextRecognized', d.textBlocks.map(e => e.value));
        }}
        //focusDepth={this.state.depth}
        permissionDialogTitle={'Permission to use camera'}
        permissionDialogMessage={'We need your permission to use your camera phone'}
      >

      </RNCamera>

  onFacesDetected = ({ faces }) => this.setState({ faces });
  onFaceDetectionError = state => console.warn('Faces detection error:', state);

Landmarks 

Face API 可以识别面部特征。

onFacesDetected方法返回的faces包含以下信息:

{
"bottomMouthPosition":{"y":476.8552943638393,"x":229.5662841796875},
"leftEyePosition":{"y":265.12337085178916,"x":284.55173165457586},
"rollAngle":356.2725713253021,
"rightCheekPosition":{"y":356.14336922055196,"x":147.53715297154017},
"yawAngle":0,
"rightEyePosition":{"y":274.54270371936616,"x":162.43976702008928},
"noseBasePosition":{"y":367.66914994376043,"x":222.42982700892856},
"bounds":{"size":{"height":526.1763158525739,"width":355.5161917550223},
"origin":{"y":-2.451317832583473,"x":47.15720476422991}},
"leftCheekPosition":{"y":350.428562436785,"x":300.59786551339283},
"leftMouthPosition":{"y":436.3958052680606,"x":284.8529401506696},
"faceID":0,
"rightMouthPosition":{"y":442.1544989631289,"x":172.94622802734375}
}

效果图

根据faces坐标点信息绘制的相框,相框中的红色点是对应的人脸的眼睛,鼻子,嘴巴的位置,可以根据自己喜好绘制一些别的图案上去

角度

Face API 提供另一个数据:欧拉角。

“欧拉”一词及发音来自于数学家 Leonhard Euler,它用于描述侦测的脸的方向。这个 API 使用 x、y、z 坐标系:

并报告每张脸的下列欧拉角。

1.欧拉 y 角,沿 y 轴进行旋转的角度。当你摇头表示说 no 的时候,你让你的头沿 y 轴来回旋转。只有 face detector 被设置为 ACCURATE_MODE 的时候才能检测出这个角度。

2.欧拉 z 角,沿 z 轴进行旋转的角度。当你将头从一边歪到另一边的时候,你的头就在沿 z 轴来回旋转。

错误预防

模拟器如果你没有装Google Play 那人脸识别会一直报错Faces detection error:可以按照下面文章操作:

https://docs.genymotion.com/latest/Content/03_Virtual_Devices/Emulating_sensors_and_features/OpenGApps.htm?Highlight=google%20play

参考文献

com.google.android.gms.vision.face

com.google.android.gms.vision.face  |  Google Play services  |  Google Developers

Android Google Face API 增强现实教程:

Android Google Face API 增强现实教程_kmyhy的专栏-优快云博客

### 使用 `react-native-vision-camera` 实现人脸识别 为了在 React Native 项目中使用 `react-native-vision-camera` 库来实现人脸识别功能,可以按照以下方法操作: #### 安装依赖库 首先安装必要的 npm 包以及链接原生模块。对于 `react-native-vision-camera` 的安装,请参照官方文档说明[^2]。 ```bash npm install react-native-vision-camera npx pod-install ios ``` #### 请求相机权限 确保应用有访问设备摄像头的权限。这通常涉及修改项目的 Android 和 iOS 平台特定文件以声明所需的权限,并向用户请求授权。 - **Android**: 修改 `AndroidManifest.xml` 文件添加相应权限。 - **iOS**: 更新 `Info.plist` 添加隐私描述键值对用于解释为何需要获取相机权限。 #### 创建自定义组件处理视频流帧数据 创建一个新的 React 组件用来管理 Vision Camera 的实例化过程及其生命周期事件监听器设置。通过该组件捕获每一帧图像并传递给 ML 模型进行分析。 ```javascript import React, { useEffect, useRef } from 'react'; import { View, Text, TouchableOpacity, PermissionsIOS } from 'react-native'; import { Camera, useCameraDevices } from 'react-native-vision-camera'; const FaceRecognitionComponent = ({ onFaceDetected }) => { const cameraRef = useRef(null); let devices = useCameraDevices(); let device = devices.back; async function start() { try { await requestPermission(); if (!device.supportsScanBarcode) console.warn('This device has no laser scanner!'); // 开启实时预览 setPhotoEnabled(true); // 设置每秒最多处理多少帧图片,默认为0表示尽可能多 setFrameProcessorFpsLimit(30); // 注册 frame 处理函数 setOnFrameUpdate((frame) => processImage(frame)); } catch(error){ console.error("Failed to initialize the camera.", error); } } function processImage(imageBuffer){ // 这里调用机器学习模型去检测人脸... // 假设我们有一个名为 detectFacesFromImage 的异步函数来做这件事 detectFacesFromImage(imageBuffer).then(faces=>{ faces.forEach(face=>onFaceDetected(face)) }).catch(console.error) } return ( <View> {/* 如果支持则显示相机 */} {!!device && ( <Camera ref={cameraRef} style={{ width: '100%', height: '100%' }} device={device} isActive={true} photo={photoEnabled} frameProcessorFPS={frameProcessorFpsLimit} onFrameUpdate={(buffer) => buffer ? processImage(buffer) : null} /> )} </View> ); }; export default FaceRecognitionComponent; ``` 上述代码片段展示了如何构建一个简单的界面元素,它能够启动摄像机并将每一帧的数据发送到指定的方法中进一步处理。这里假设存在一个叫做 `detectFacesFromImage()` 的辅助函数负责执行实际的人脸识别逻辑[^3]。 #### 整合人脸识别算法 最后一步就是集成具体的人脸识别 SDK 或者训练好的模型来进行面部特征提取与匹配工作。这部分可能涉及到 TensorFlow Lite、ML Kit 或其他第三方服务的选择和配置。根据所选方案的不同,具体的 API 调用方式也会有所差异。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖狗-小强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值