首页 > 其他分享 >记录--react native 封装人脸 检测、美颜组件

记录--react native 封装人脸 检测、美颜组件

时间:2022-12-05 18:23:49浏览次数:67  
标签:相机 -- react 人脸 美颜 RCTFaceDetectView 组件 GPUImage

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

本组件目前只能用在React Native 的iOS端

本组件来之实际中的开发需求:可以检测并且标记人脸,实现基本的美颜,可进行拍照、换行镜头等基础相机功能。官方组件封装 教程

本文代码:DEMO 运行demo

$ git clone https://github.com/lianglei777/demos.git
$ cd demos
$ git checkout RNFaceDemo
$ cd RNFaceDemo
$ npm install 
$ cd ios 
$ pod install

如果 pod install 失败,请参考 此文 的 cocoapods 部分。

组件功能

  • 人脸标记,返回人脸个数
  • 滤镜美颜(基于GPUImage),美颜程度可调节(0~9)
  • 相机功能,包括拍照、转换前后镜头,其余相机功能可自行扩展

效果如下图

如何使用

代码文件

  1. 添加 demo 的 ios 文件夹下的 Camera 到自己项目的 ios 目录下,
  2. ios中添加相关相机相册权限配置
  <key>NSCameraUsageDescription</key>
  <string>上传头像时,使用您的相机来拍摄照片</string>
  <key>NSPhotoLibraryAddUsageDescription</key>
  <string>保存图片时,使用您的相册来保存照片</string>
  <key>NSPhotoLibraryUsageDescription</key>
  <string>上传头像时,使用您的相册来获取图片</string>
  1. js 层使用参考 NativeModule/RNFaceDetectView.js 和 Pages/ComponentBridgeDemo.js

安装GPUImage

Podfile 文件中添加如下内容, 运行 pod install

pod 'GPUImage',:git => 'https://github.com/lianglei777/GPUImage.git'

cmd + b 进行编译,如果遇到以下问题

错误1

解决方法: 按照如下途中点击步骤,添加 libGPUImage.a 文件

错误2

解决方法: Build Settings --》 Library Search Paths ,双击添加 "${PODS_CONFIGURATION_BUILD_DIR}/GPUImage",选择 non-recursive

介绍

代码中已经加了比较多的注释,这里主要根据文件来说一些我觉得要关注的点。

GPUImage

GPUImage 是一款利用GPU添加滤镜效果,美化图像的 Object-C 库,但是可惜的是 swift 出现之后作者放弃维护了,需要修改一些代码才能运行在较新的iOS版本中,这里是我修改之后的 GPUImage 库,也是组件中在用的

FSKGPUImageBeautyFilter

FSKGPUImageBeautyFilter 是基于 GPUImage 的美颜滤镜,可以通过三个维度调整美颜效果。

/** 美颜程度 */
@property (nonatomic, assign) CGFloat beautyLevel;
/** 美白程度 */
@property (nonatomic, assign) CGFloat brightLevel;
/** 色调强度 */
@property (nonatomic, assign) CGFloat toneLevel;

这里需要注意 FSKGPUImageBeautyFilter.m 文件中 initWithFragmentShaderFromString 的定义方式,传入的着色器参数如果不懂相关内容请不要修改,也不要为了代码美观去添加空格个或则换行, 这都是我踩过的大坑,目前的代码都是调试实际验证过的,请放心使用。

RCTFaceDetectView

这里是封装组件的主要代码

RCTFaceDetectView.h

// 在 js 组件中使用的回调方法, 必须使用 RCTBubblingEventBlock 来定义
@property(nonatomic,copy)RCTBubblingEventBlock onFaceCallback;
//传入的美颜参数
@property(nonatomic,copy)NSString *beautyLevel;

+ (instancetype)sharedInstance; // 单例
- (UIView *)initBeautifyFaceView;  // 初始化相机界面

//相机切换前后摄像头
- (void)switchCameraFrontOrBack;
//拍照
-(void)takeFaceDetectCamera:(RCTResponseSenderBlock)successBlock;

//设置美颜系数
-(void)setBeautyLevel:(NSString *)level;

// 停止相机捕捉
-(void)stopCamera;

此处需要注意

  • onFaceCallback 是在 js 组件中使用的回调方法,必须使用 RCTBubblingEventBlock 定义,beautyLevel 是 prop 传参,使用正常类型就可以

  • switchCameraFrontOrBack、takeFaceDetectCamera、stopCamera 是组件的功能方法,之前由于需求的原因,没有封装为组件的传参方法,可以自定义相关调用方法暴露到 js 中,目前 demo 中没有添加,暴露方法参考 中原生方法的封装。写法如下:

#pragma mark - 人脸检测相机:拍照回调拍照图片base64
RCT_REMAP_METHOD(takeFaceDetectCameraWithCallback,takeFaceDetectCamera:(RCTResponseSenderBlock)successBlock){
  
  dispatch_async(dispatch_get_main_queue(), ^{
    [[RCTFaceDetectView sharedInstance] takeFaceDetectCamera:successBlock];
  });
}

#pragma mark - 人脸检测相机:前后摄像头切换
RCT_REMAP_METHOD(switchCameraFrontOrBack,switchCameraFrontOrBack){
  dispatch_async(dispatch_get_main_queue(), ^{
    [[RCTFaceDetectView sharedInstance] switchCameraFrontOrBack];
  });
}

#pragma mark - 人脸检测相机:美颜系数
RCT_REMAP_METHOD(setFilterLevel,setBeautyLevel:(float)level){
  dispatch_async(dispatch_get_main_queue(), ^{
    [[RCTFaceDetectView sharedInstance] setBeautyLevel: [NSString stringWithFormat:@"%f",level]];
  });
}

#pragma mark --停止视频流--
RCT_EXPORT_METHOD(stopFaceDetectCamera) {
   [[RCTFaceDetectView sharedInstance] stopCamera];
   [[RCTFaceDetectView sharedInstance] unobserveGlobalNotifications];
}

RCTFaceDetectView.m

要点介绍

如何获取到人脸相关的参数

需要实现ios的代理方法,如下

#pragma mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
  ...
}

metadataObjects 参数中即包含了面部个数以及面部在摄像头中的坐标位置。

如何绘制面部框

此处需要进行坐标转换,将面部在摄像头中的坐标转为在屏幕中的坐标,此处需要使用 transformedMetadataObjectForMetadataObject 方法,具体请查看代码

如何进行美颜

在 GPUImage 中使用 FSKGPUImageBeautyFilter 滤镜,常规写法。

RCTFaceDetectViewManager

将 RCTFaceDetectView 封装的原生组件,暴露到 js 层

更多内容,运行 demo,阅读代码

https://juejin.cn/post/6978297307733164068

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:相机,--,react,人脸,美颜,RCTFaceDetectView,组件,GPUImage
From: https://www.cnblogs.com/smileZAZ/p/16953093.html

相关文章

  • AMS和Zygote通信为什么采用socket而不是Binder
    参考:为什么SystemServer进程与Zygote进程通讯采用Socket而不是Binder1、AMS、WMS等系统服务处于SystemServer进程中2、SystemServer(SystemService)与ServiceManager勿混......
  • bat 练习
    bat常用命令1.help命令语法:命令/?可显示此命令的帮助信息1.1例子C:\Users\m>pause/?暂停批处理程序,并显示以下消息:请按任意键继续...C:\Users\m>e......
  • 300005 建筑的分类
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='建筑的分类';/......
  • 【车间订单拣选优化】基于遗传优化的车间订单拣选优化matlab仿真
    一、概述汽车生产需要进行上千个零件的组装,而主机厂采用柔性生产,对于每种零部件的需求呈现小批量,多频次的特点,而对于服务于主机厂的区域分拨中心,需要对主机厂的订单进行拣......
  • JUC并发编程
    什么是JUCJDK1.5出现的,用来处理线程的工具包进程与线程进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程一-资源分配的最小单位。线程:系统分配处理器时......
  • 4.2.2 等差数列的综合应用
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高二数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2875423.html)\({\col......
  • 同时引用同一个组件的两个版本
    在我们开发项目时,引用组件一般都是使用Nuget获取最新稳定版本,不可能出现同一个组件,引用两个版本。但是有些小伙伴维护老系统时,发现有些组件是用以前的低版本,无法直接升......
  • JavaScript习题之填空题
    1.JavaScript有两种引⽤数据类型:__数组___、__对象__。2.Javascript通过__setTimeout___延迟指定时间后,去执⾏某程序。3.Javascript⾥String对象通过__indexOf__⽅法取......
  • 安装CKA考试环境(二)
    1.1安装前说明官方文档:https://kubernetes.io/docs/setup/production-environment/安装步骤:安装Runtime安装kubeadm和kubeletmaster节点初始化node节点配置CNI网......
  • Web API-day02
    WebAPI第二天>>>>>>>事件什么是事件?事件是在编程时系统内发生的动作或者发生的事情比如用户在网页上单击一个按钮什么是事件监听?就是让程序检测是否有事件产生,一......