記錄--react native 封裝人臉 檢測、美顏組件

来源:https://www.cnblogs.com/smileZAZ/archive/2022/12/05/16953093.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 本組件目前只能用在React Native 的iOS端 本組件來之實際中的開發需求:可以檢測並且標記人臉,實現基本的美顏,可進行拍照、換行鏡頭等基礎相機功能。官方組件封裝 教程 本文代碼:DEMO 運行demo $ git clone h ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

本組件目前只能用在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

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:王權富貴 1.概述 MySQL的分區表沒有禁止NULL值作為分區表達式的值,無論它是列值還是用戶提供的表達式的值,需要記住NULL值不是數字。My ...
  • 什麼是直方圖,在MySQL 8.0.3如何創建直方圖?MySQL的直方圖是如何影響執行計劃生成的?創建直方圖有哪些註意事項?直方圖和索引對優化器的選擇上有什麼差異,又該如何選擇?如何判斷直方圖對執行計劃的影響?MySQL官方blog的這篇文章用非常具體的示例回答了這一系列問題,let's go。原文 ...
  • 我國製造業擁有31個大類、179個中類和609個小類,是全球產業門類最齊全、產業體系最完整的製造業。二十大報告中強調:“堅持把發展經濟的著力點放在實體經濟上”“推動製造業高端化、智能化、綠色化發展”。這為中國製造邁向高質量發展指明瞭方向。 疫情發生以來,製造業面臨用工難、復產復工難、成本高、數據管理 ...
  • 1.4 Apache Hadoop 完全分散式集群搭建 軟體和操作系統版本 Hadoop框架是採用Java語言編寫,需要java環境(jvm) JDK版本:JDK8版本 集群: 知識點學習:統一使用vmware虛擬機虛擬三台linux節點,linux操作系統:Centos7 生產階段:建議最少5台服 ...
  • 本次我把CSS中的重難點整理出來,總共54個核心知識點,供大家複習,希望能幫到大家。這些重難點是進階高薪必需要掌握的知識點,同時也是面試必問的內容。 因為涉及的內容較多,我分5篇內容發出來,好逐一進行讓大家消化這些內容,本次我把前1-12個CSS重難點整理出來,具體內容如下: CSS選擇器與優先順序 ...
  • jQuery05 9.作業 9.1homework01 對多選框進行操作,輸出選中的多選框的個數,並且把選中愛好的名稱顯示。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>homework01</title ...
  • 前端開發之JavaScript 一、JavaScript簡介 ​ Javascript(簡稱‘JS’),是一門解釋型編程語言,主要用於Web、和瀏覽器中網頁中的動態渲染 ​ 是一門前端工程師的編程語言,相比於python它的邏輯並不是那麼嚴謹 二、JS基礎 語法註釋 單行註釋 //註釋內容 多行註釋 ...
  • JS簡介 JavaScript(簡稱JS) 是一種具有函數優先的輕量級,解釋型或即時編譯型編程語言雖然它是作為開發Web頁面的腳本語言而出名,但是它也被用到了很多非瀏覽器環境中,JavaScript 基於原型編程、多範式的動態腳本語言,並且支持面向對象、命令式、聲明式、函數式編程範式 ==JavaS ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...