靜態模型一鍵動態化,教你如何集成動作捕捉能力

  • 2022 年 3 月 10 日
  • 筆記

有趣的靜態模型動態化是如何實現的?

華為3D建模服務(3D Modeling Kit)的動作捕捉能力,利用人體檢測技術以及模型加速與壓縮技術、基於深度學習的單目姿態估計演算法,僅需要普通手機的RGB攝影機,就可以捕獲人體24個骨骼關鍵點三維資訊,輕鬆實現靜態模型動態化,讓我們的模型更加生動鮮活。

想要實現此功能也很簡單,一起看下集成步驟吧!

應用場景

該服務廣泛應用於3D內容製作領域,特別是遊戲、影視、醫療等行業。例如,UGC遊戲中角色的驅動及動畫影片製作,虛擬主播的實時驅動,醫療行業的康復指導等。

集成程式碼

1 開發準備

詳細準備步驟可參考華為開發者聯盟官網:

配置AppGallery Connect-開發準備-Android-3D建模服務 (huawei.com)

2 編輯工程集成

在開始API開發工作之前,您需要先3.3.1 配置AppGallery Connect,同時請確保您的工程中已經配置HMS Core SDK的Maven倉地址,並且完成了本服務的3.3.2 集成HMS Core SDK。

2.1創建動作捕捉引擎。
// 自定義參數配置。 
Modeling3dMotionCaptureEngineSetting setting = new Modeling3dMotionCaptureEngineSetting.Factory() 
    // 設置檢測模式。 
    // Modeling3dMotionCaptureEngineSetting.TYPE_3DSKELETON_QUATERNION:輸出人體姿態對應的骨骼點四元數。 
    // Modeling3dMotionCaptureEngineSetting.TYPE_3DSKELETON:輸出人體姿態對應的骨骼點坐標。 
.setAnalyzeType(Modeling3dMotionCaptureEngineSetting.TYPE_3DSKELETON_QUATERNION 
                        | Modeling3dMotionCaptureEngineSetting.TYPE_3DSKELETON) 
.create(); 
Modeling3dMotionCaptureEngine engine = Modeling3dMotionCaptureEngineFactory.getInstance().getMotionCaptureEngine(setting);

Modeling3dFrame封裝了源自相機的影片幀或靜態圖片數據,以及相關的數據處理邏輯。

您可以自行處理影片流,將影片幀轉換為Modeling3dFrame對象,用於檢測影片幀,支援NV21格式。

通過android.graphics.Bitmap創建Modeling3dFrame對象,用於動作捕捉引擎檢測圖片,支援的圖片格式包括:JPG/JPEG/PNG。

// 通過bitmap創建Modeling3dFrame。 
Modeling3dFrame frame = Modeling3dFrame.fromBitmap(bitmap); 
// 通過影片幀創建Modeling3dFrame。 
Modeling3dFrame.Property property = new Modeling3dFrame.Property.Creator().setFormatType(ImageFormat.NV21) 
    // 設置影片幀寬度。 
    .setWidth(width) 
    // 設置影片幀高度。 
    .setHeight(height) 
    // 設置影片幀旋轉角度。 
    .setQuadrant(quadant) 
    // 設置影片幀序號。 
    .setItemIdentity(framIndex) 
    .create(); 
Modeling3dFrame frame = Modeling3dFrame.fromByteBuffer(byteBuffer, property);
2.2調用同步或非同步方法進行動作捕捉檢測。

asyncAnalyseFrame非同步方法示例程式碼:

Task<List<Modeling3dMotionCaptureSkeleton>> task = engine.asyncAnalyseFrame(frame); 
task.addOnSuccessListener(new OnSuccessListener<List<Modeling3dMotionCaptureSkeleton>>() { 
    @Override 
    public void onSuccess(List<Modeling3dMotionCaptureSkeleton> results) { 
        // 檢測成功。 
    } 
}).addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(Exception e) { 
        // 檢測失敗。 
    } 
});

analyseFrame同步方法示例程式碼:

SparseArray<Modeling3dMotionCaptureSkeleton> sparseArray = engine.analyseFrame(frame); 
for (int i = 0; i < sparseArray.size(); i++) { 
    // 檢測結果處理。 
};
2.3檢測完成,停止引擎,釋放檢測資源。
try { 
    if (engine != null) { 
        engine.stop(); 
    } 
} catch (IOException e) { 
    // 異常處理。 
}

Demo演示

集成開發過程中,您有任何問題都可以在線提單,將有專人為您解答。

了解更多詳情>>

訪問華為開發者聯盟官網
獲取開發指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關注我們,第一時間了解 HMS Core 最新技術資訊~