react-native-camera插件的使用,以及实现人脸识别

news2024/10/6 21:28:02

一、git地址和环境版本

(1)Git地址:https://github.com/react-native-camera/react-native-camera/tree/master
(2)node版本:14 +
(3)react-native版本:0.72

二、环境配置

(1)先安装插件

npm i react-native-camera

(2)在 android/setting.gradle 添加如下代码

include ':react-native-camera'
project(':react-native-camera').projectDir = new File(rootProject.projectDir,   '../node_modules/react-native-camera/android')

图例:
在这里插入图片描述

(3)在 android/app 目录下build.gradle 添加如下数据

  • android.defaultConfig中添加下面一行代码:
missingDimensionStrategy 'react-native-camera', 'mlkit'

图例:
在这里插入图片描述

  • dependencies中添加下面一行代码:
implementation project(':react-native-camera')

图例:
在这里插入图片描述

  • 在最下面添加一行如下代码:
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

图例:
在这里插入图片描述

(4)在android 目录下的build.gradle 文件中的dependencies对象中添加一行代码:

classpath("com.google.android.gms:strict-version-matcher-plugin:1.2.1")

图例:
在这里插入图片描述
(5)如果报错Invariant Violation: ViewPropTypes has been removed from React Native. Migrate to ViewPropTypes expo ,则报错解决如下:

  • 安装npm install deprecated-react-native-prop-types
  • 进入node_modules/react-native/index.js,从第436行开始修改:
    -
    修改为:
  // Deprecated Prop Types
  get ColorPropType(): $FlowFixMe {
    return require("deprecated-react-native-prop-types").ColorPropType
  },
  get EdgeInsetsPropType(): $FlowFixMe {
    return require("deprecated-react-native-prop-types").EdgeInsetsPropType
  },
  get PointPropType(): $FlowFixMe {
    return require("deprecated-react-native-prop-types").PointPropType
  },
  get ViewPropTypes(): $FlowFixMe {
    return require("deprecated-react-native-prop-types").ViewPropTypes
  },
  • 执行npx patch-package react-native命令保存补丁。
  • package.json文件中加入 ,"postinstall": "patch-package",如下图:
    在这里插入图片描述

三、react-native-camera 使用,直接上代码:

// 请勿直接粘贴使用,这是我项目中删减下来只关于识别人脸部分的代码

import { RNCamera } from 'react-native-camera';

export default class LoginCode extends Component {
  constructor(props) {
    super(props);
    this.state = {
      RNCameraType: RNCamera.Constants.Type.front,
      canDetectFaces: true,
      facePath: '', // type= 8 上传人脸图片返回的图片路径
    };
  }
  // 拍照
  takePhoto = async () => {
    const options = {
      quality: 0.5,
      base64: true,
      width: setWidthDp(1027),
      height: setHeightDp(426),
    };
    if (this.camera) {
      const data = await this.camera.takePictureAsync(options);
      console.log('data: ', data);
      // this._faceLogin(data)
    }
  };
  //改方法用于是否检测到人脸信息
  onFacesDetected = ({ faces }) => {
    console.log('faces: ', faces);
    if (faces.length > 0) {
      // 检测到人脸就拍下来,停止检测
      setTimeout(() => {
        this.takePhoto();
      }, 1000);
      this.setState({
        canDetectFaces: false,
      });
    } else {
      this.setState({
        canDetectFaces: true,
      });
    }
  };
  onFaceDetectionError = state => {
    console.warn('Faces detection error:', state);
  };

  render () {
    return (
      <View style={styles.container}>
        <ImageBackground
          source={require('@/assets/images/background/main_background.png')}
          style={styles.backgroundImageBg}>
          <View style={styles.cameraWarp}>
            <RNCamera
              ref={cam => {
                this.camera = cam;
              }} // 用于获取拍照录像函数
              type={this.state.RNCameraType}
              style={[styles.preview]}
              orientation={RNCamera.Constants.Orientation.landscapeRight} // 改变摄像头方向
              faceDetectionLandmarks={
                RNCamera.Constants.FaceDetection.Landmarks.all
              }
              onFacesDetected={
                this.state.canDetectFaces ? this.onFacesDetected : null
              }
              onFaceDetectionError={this.onFaceDetectionError}
              faceDetectionMode={
                RNCamera.Constants.FaceDetection.Mode.accurate
              }
            />
          </View>
        </ImageBackground>
      </View >
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
  backgroundImageBg: {
    flex: 1,
    resizeMode: 'cover',
  },
  cameraWarp: {
    position: 'absolute',
    width: setWidthDp(1027),
    height: setHeightDp(426),
    top: setWidthDp(110),
    zIndex: 99,
    backgroundColor: 'rgba(0,0,0,0.5)',
  },
  preview: {
    width: setWidthDp(1027),
    height: setHeightDp(426),
    justifyContent: 'center',
    alignItems: 'center',
    overflow: 'hidden',
  },
})


上面组件使用的属性解析:

  • ref属性: 用于获取RNCamera组件的引用,以便在其他地方调用拍照和录像的函数。
  • type属性: 指定相机的类型,这里使用了this.state.RNCameraType来动态设置相机类型。
  • orientation属性: 用于设置相机的方向,这里设置为RNCamera.Constants.Orientation.landscapeRight,表示横向右侧。
  • faceDetectionLandmarks属性: 用于指定人脸检测时要检测的特征点,这里设置为
    RNCamera.Constants.FaceDetection.Landmarks.all,表示检测所有特征点。
  • onFacesDetected属性: 当检测到人脸时触发的回调函数,通过this.state.canDetectFaces来判断是否启用人脸检测,如果为true则调用this.onFacesDetected函数。
  • onFaceDetectionError属性: 当人脸检测发生错误时触发的回调函数,调用this.onFaceDetectionError函数处理错误。
  • faceDetectionMode属性: 用于设置人脸检测的模式,这里设置为RNCamera.Constants.FaceDetection.Mode.accurate,表示使用准确模式进行人脸检测。
  • 通过使用RNCamera组件和相关属性,你可以在React Native应用中实现相机功能,并进行人脸检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统——第五章 进程信号

目录 信号概念 用kill -l命令可以察看系统定义的信号列表 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异常产生信号 阻塞信号 1. 信号其他相关常见概念 2. 在内核中的表示 3. sigset_t 4.…

spring.aop 随笔4 如何借助jdk代理类实现aop

0. 下了有一个月的雨&#xff0c;这对鼻炎来说来吗&#xff1f;不好 其实这也算6月份的博客&#xff0c;之前一直疏于整理 本文仅关注jdk代理所实现的spring.aop下&#xff0c;两者的关系完整的aop源码走读请移步相关 spring.aop 的其他随笔 1. 反编译追踪源码 1.1 jdk代理类…

BPMN2.0规范简介

1 概述 BPMN(Business Process Model & Notation)&#xff0c;中文名为业务流程模型与符号。BPMN2.0是OMG(Object Management Group&#xff0c;对象管理组织)制定的&#xff0c;其主要目的是既给用户提供一套简单的、容易理解的机制&#xff0c;以便用户创建流程模型&…

项目性能优化-内存泄漏检测与修改

最近终于有空优化一波项目的性能了&#xff0c;第一波借助Android Studio自带的Profiler工具检测内存泄漏。 第一步、创建Profiler的SESSIONS 第二步、进入MEMORY内存监控 右侧带有绿色原点的就是此时运行的Profiler的SESSION,点击右侧MEMORY进入内存监控的详情模块 第三步…

缓存三击-缓存穿透、缓存雪崩、缓存击穿

缓存三击-缓存穿透、缓存雪崩、缓存击穿 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ Spring专栏&#x1f449;https://blog.csdn.net/weixin_53580595/category_12279…

【产品设计】掌握“4+X”模型,从0到1构建B端产品

“4X”模型是什么 4个阶段&#xff1a;规划阶段&#xff0c;设计阶段&#xff0c;实现阶段&#xff0c;迭代阶段 X:项目管理&#xff0c;数据分析&#xff0c;产品运营 1、规划阶段 这是一个产品的开始&#xff0c;它决定了产品的设计方向和基调。主要包括用户分析、市场分…

爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

文章目录 动态网页爬取静态网页与动态网页的区别使用Selenium实现动态网页爬取Selenium 的语法及介绍Selenium简介安装和配置创建WebDriver对象页面交互操作 元素定位 等待机制页面切换和弹窗处理截图和页面信息获取关闭WebDriver对象 使用API获取动态数据未完待续.... 动态网页…

JVM-垃圾回收-基础知识

基础知识 什么是垃圾 简单说就是没有被任何引用指向的对象就是垃圾。后面会有详细说明。 和C的区别 java&#xff1a;GC处理垃圾&#xff0c;开发效率高&#xff0c;执行效率低 C&#xff1a;手工处理垃圾&#xff0c;如果忘记回收&#xff0c;会导致内存泄漏问题。如果回…

Linux Mint 21.2“Victoria”Beta 发布

导读近日消息&#xff0c;Beta 版 Linux Mint 21.2 “Victoria” 于今天发布&#xff0c;用户可以访问官网下载镜像。 Linux Mint 21.2 代号 “Victoria” &#xff0c;基于 Canonical 长期支持的 Ubuntu 22.04 LTS&#xff08;Jammy Jellyfish&#xff09;操作系统&#xff0…

2023年第三届工业自动化、机器人与控制工程国际会议

会议简介 Brief Introduction 2023年第三届工业自动化、机器人与控制工程国际会议&#xff08;IARCE 2023&#xff09; 会议时间&#xff1a;2023年10月27 -30日 召开地点&#xff1a;中国成都 大会官网&#xff1a;www.iarce.org 2023年第三届工业自动化、机器人与控制工程国际…

JAVA http

javahttp 请求数据格式servletservlet生命周期servletrequest获取请求数据解决乱码response相应字符&字节数据 请求数据格式 servlet servlet生命周期 servlet request获取请求数据 解决乱码 response相应字符&字节数据 response.setHeader("content-type",…

A. Portal(dp优化枚举)

Problem - 1580A - Codeforces CQXYM发现了一个大小为nm的矩形。矩形由n行m列的方块组成&#xff0c;每个方块可以是黑曜石方块或空方块。CQXYM可以通过一次操作将黑曜石方块变为空方块&#xff0c;或将空方块变为黑曜石方块。 一个大小为ab的矩形M被称为传送门&#xff0c;当…

【Linux】程序员的基本素养学习

这是目录 写在前面一、内存管理1、分段2、分页 二、线程管理三、静态库1、编译1.1、预处理1.2、编译1.3、汇编1.4、链接2、编译器3、目标文件**.text****.data****.bss****__attribute__** 3.1、符号3.2、兼容C语言 -- extern C4、链接 -- ld 写在前面 本文记录自己的学习生涯…

五.组合数据类型

目录 1、数组类型 声明数组 初始化数组 数组赋值 访问数组元素 2、切片类型 1、定义切片 2、切片初始化 3、访问 4、空(nil)切片 5、切片的增删改查操作&#xff1a; 3、指针类型 1、什么是指针 2、如何使用指针、指针使用流程&#xff1a; 3、Go 空指针 4、指…

chatgpt赋能python:如何将Python打包-一个SEO优化指南

如何将Python打包 - 一个SEO优化指南 作为一名拥有10年Python编程经验的工程师&#xff0c;我意识到很多Python开发者面临一个共同的问题&#xff1a;如何将他们的Python项目打包并发布到PyPI上&#xff1f;打包一个Python项目不仅可以让您的代码更加组织化&#xff0c;也可以…

如何拆分PDF?拆分PDF软件分享!​

那么如何拆分PDF&#xff1f;PDF是一种流行的电子文档格式&#xff0c;它可以在不同的操作系统和设备上进行查看和共享&#xff0c;而不会因为不同的软件或硬件而出现兼容性问题。同时&#xff0c;在使用的过程中&#xff0c;PDF拆分PDF文件是一个比较常见的需求&#xff0c;它…

threejs入门

个人博客地址: https://cxx001.gitee.io 前言 随着HTML5的发布&#xff0c;我们可以通过WebGL在浏览器上直接使用显卡资源来创建高性能的二维和三维图形&#xff0c;但是直接使用WebGL编程来创建三维场景十分复杂而且还容易出问题。而使用Three.js库可以简化这个过程&#xff…

机器学习——决策树1(三种算法)

要开始了…内心还是有些复杂的 因为涉及到熵…单纯的熵&#xff0c;可以单纯 复杂的熵&#xff0c;如何能通俗理解呢… 我也没有底气&#xff0c;且写且思考吧 1. 决策树分类思想 首先&#xff0c;决策树的思想&#xff0c;有点儿像KNN里的KD树。 KNN里的KD树&#xff0c;是每…

如何将非平稳的时间序列变为平稳的时间序列?

可以采用现代信号处理算法&#xff0c;比如小波分解&#xff0c;经验模态分解&#xff0c;变分模态分解等算法。 以经济金融领域的数据为例&#xff0c;经济金融领域的数据作为一种时间序列&#xff0c;和我们平常工程领域分析的信号具有相同特性。一般来说&#xff0c;信号是…

在 Maya、ZBrush 和 Arnold 中重塑来自邪恶西部的 Edgar Gravenor

今天瑞云渲染小编给大家带来Giancarlo Penton 介绍的Edgar Gravenor项目背后过程&#xff0c;展示了皮肤纹理和头发是如何制作的&#xff0c;并解释了详细的服装是如何设置的。 介绍 大家好&#xff0c;我的名字是Giancarlo Penton。我是一名3D角色艺术家&#xff0c;最近毕业…