「有一個程式員男友是一種什么樣的體驗?」
知乎上這道題里堆滿了狗糧,我廠阿強的女友阿珍,也貢獻了一個有技術含量的答案——因為程式員男友,作為人民教師的阿珍,榮登學校最受歡迎直播網課榜,
事情是這樣的,去年疫情期間,學校推出停課不停學的直播課程,于是新晉主播阿珍,為直播課絞盡腦汁:怎樣讓宅家小朋友“身臨其境”感受世界地理歷史知識,輕松“抵達”東京、紐約和巴黎,覽遍故宮、葉宮、盧浮宮?
就在阿珍百思不得其解之時,阿強舉手表示:這題我會!
程式員阿強仔細分析了女友的需求,為她量身打造一款“身臨其境”的線上課堂App,這款App,通過手勢就可以快速自如地切換直播背景,并且逼真到每個像素點都可標簽化,阿珍的一根頭發絲都可以完整保留!
效果示例

實作原理
通過手勢在直播中更換背景是通過機器學習影像分割和手部關鍵點識別兩大技術來實作的,
影像分割功能可以將圖片中相同元素(如人體、植物、天空等)的部分從影像整體中“分割”出來,當前支持人像、天空、植物、美食、貓狗、花朵、水面、沙面、建筑、山峰、其他等11大類元素的分割,支持靜態圖片分割和動態視頻流分割,
手部關鍵點識別功能支持識別21個手部關鍵點(包括每個手指指尖、關節點,以及手腕點),并回傳關鍵點的位置資料,手勢識別能力能夠檢測并回傳圖片或視頻中的所有手部矩形框位置,以及手勢的類別和置信度,支持識別14種手勢,包括點贊、差評、OK、握拳、單手比心、數 字1-9,手部關鍵點識別能力與手勢識別能力都支持靜態圖片識別、實時視頻流識別,
開發步驟
1.添加HUAWEI agcp插件以及Maven代碼庫,
buildscript {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
...
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}
}
allprojects {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
}
2.Full SDK方式集成
dependencies{
// 引入影像分割基礎SDK
implementation 'com.huawei.hms:ml-computer-vision-segmentation:2.0.4.300'
// 引入多類別分割模型包
implementation 'com.huawei.hms:ml-computer-vision-image-segmentation-multiclass-model:2.0.4.300'
// 引入人像分割模型包
implementation 'com.huawei.hms:ml-computer-vision-image-segmentation-body-model:2.0.4.300'
// 引入手勢識別基礎SDK
implementation 'com.huawei.hms:ml-computer-vision-handkeypoint:2.0.4.300'
// 引入手部關鍵點檢測模型包
implementation 'com.huawei.hms:ml-computer-vision-handkeypoint-model:2.0.4.300'
}
3.在檔案頭添加配置,
在apply plugin: 'com.android.application'后添加apply plugin: 'com.huawei.agconnect'
4.自動更新機器學習模型
在AndroidManifest.xml檔案中添加
<manifest
...
<meta-data
android:name="com.huawei.hms.ml.DEPENDENCY"
android:value="imgseg,handkeypoint" />
...
</manifest>
5.創建影像分割檢測器,
MLImageSegmentationAnalyzer imageSegmentationAnalyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer();//影像分割分析器
MLHandKeypointAnalyzer handKeypointAnalyzer = MLHandKeypointAnalyzerFactory.getInstance().getHandKeypointAnalyzer();//手勢識別分析器
MLCompositeAnalyzer analyzer = new MLCompositeAnalyzer.Creator()
.add(imageSegmentationAnalyzer)
.add(handKeypointAnalyzer)
.create();
6.創建識別結果處理類
public class ImageSegmentAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLImageSegmentation> {
@Override
public void transactResult(MLAnalyzer.Result<MLImageSegmentation> results) {
SparseArray<MLImageSegmentation> items = results.getAnalyseList();
// 開發者根據需要處理識別結果,需要注意,這里只對檢測結果進行處理,
// 不可呼叫ML Kit提供的其他檢測相關介面,
}
@Override
public void destroy() {
// 檢測結束回呼方法,用于釋放資源等,
}
}
public class HandKeypointTransactor implements MLAnalyzer.MLTransactor<List<MLHandKeypoints>> {
@Override
public void transactResult(MLAnalyzer.Result<List<MLHandKeypoints>> results) {
SparseArray<List<MLHandKeypoints>> analyseList = results.getAnalyseList();
// 開發者根據需要處理識別結果,需要注意,這里只對檢測結果進行處理,
// 不可呼叫ML Kit提供的其他檢測相關介面,
}
@Override
public void destroy() {
// 檢測結束回呼方法,用于釋放資源等,
}
}
7.設定識別結果處理器,實作分析器與結果處理器的系結
imageSegmentationAnalyzer.setTransactor(new ImageSegmentAnalyzerTransactor());
handKeypointAnalyzer.setTransactor(new HandKeypointTransactor());
8.創建LensEngine
Context context = this.getApplicationContext();
LensEngine lensEngine = new LensEngine.Creator(context,analyzer)
// 設定攝像頭前后置模式,LensEngine.BACK_LENS為后置,LensEngine.FRONT_LENS為前置,
.setLensType(LensEngine.FRONT_LENS)
.applyDisplayDimension(1280, 720)
.applyFps(20.0f)
.enableAutomaticFocus(true)
.create();
9.啟動相機,讀取視頻流,進行識別
// 請自行實作SurfaceView控制元件的其他邏輯,
SurfaceView mSurfaceView = new SurfaceView(this);
try {
lensEngine.run(mSurfaceView.getHolder());
} catch (IOException e) {
// 例外處理邏輯,
}
10.檢測完成,停止分析器,釋放檢測資源
if (analyzer != null) {
try {
analyzer.stop();
} catch (IOException e) {
// 例外處理,
}
}
if (lensEngine != null) {
lensEngine.release();
}
>>訪問機器學習服務開源倉庫地址:GitHub、 Gitee
>>訪問華為開發者聯盟官網,了解更多相關內容
>>獲取開發指導檔案
>>華為移動服務開源倉庫地址:GitHub、Gitee
關注我們,第一時間了解華為移動服務最新技術資訊~
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/279620.html
標籤:其他
