“媽,今年我就不回家過年啦,”
給正在老家熱火朝天備年貨的老媽打完電話,難掩失落,牛年春節注定與眾不同,沒有老媽催我起床大掃除,不能在年飯桌上吃上一口朝思慕想的“媽媽牌”餃子,貼春聯的任務今年也不能認領……那些年月里微小而溫情的事兒,今年都得在回憶里復習,心里尤為惦念的,還有每年過年一家子團聚時必不可少的全家福,好在,今年雖然不能相聚餐桌前,大家在全家福里依然能相聚,
如果今年你也不回家過年,教你一招,借助華為機器學習服務,讓身在異地的家人們,完成一張不缺席的溫暖全家福,
合成全家福功能演示:

原理解釋
應用華為機器學習服務中的影像分割能力,把照片中人像元素的部分從影像整體中分割出來,再將背景替換為家人合照的背景,
全家福生成開發步驟詳解
一、開發準備
1. 配置華為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. 添加編譯SDK依賴
dependencies {
// 引入基礎SDK
implementation 'com.huawei.hms:ml-computer-vision-segmentation:2.1.0.301'
// 引入人像分割模型包
implementation 'com.huawei.hms:ml-computer-vision-image-segmentation-body-model:2.1.0.303'
}
3. 在AndroidManifest.xml中添加權限
// 使用存盤權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
二、具體開發步驟
1. 動態權限申請
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!allPermissionsGranted()) {
getRuntimePermissions();
}
}
private boolean allPermissionsGranted() {
for (String permission : getRequiredPermissions()) {
if (!isPermissionGranted(this, permission)) {
return false;
}
}
return true;
}
private void getRuntimePermissions() {
List<String> allNeededPermissions = new ArrayList<>();
for (String permission : getRequiredPermissions()) {
if (!isPermissionGranted(this, permission)) {
allNeededPermissions.add(permission);
}
}
if (!allNeededPermissions.isEmpty()) {
ActivityCompat.requestPermissions(
this, allNeededPermissions.toArray(new String[0]), PERMISSION_REQUESTS);
}
}
private static boolean isPermissionGranted(Context context, String permission) {
if (ContextCompat.checkSelfPermission(context, permission)
== PackageManager.PERMISSION_GRANTED) {
return true;
}
return false;
}
private String[] getRequiredPermissions() {
try {
PackageInfo info =
this.getPackageManager()
.getPackageInfo(this.getPackageName(), PackageManager.GET_PERMISSIONS);
String[] ps = info.requestedPermissions;
if (ps != null && ps.length > 0) {
return ps;
} else {
return new String[0];
}
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
return new String[0];
}
}
2. 創建圖片分割檢測器
MLImageSegmentationSetting setting = new MLImageSegmentationSetting.Factory()
// 設定為人像分割
.setAnalyzerType(MLImageSegmentationSetting.BODY_SEG)
.create();
this.analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);
3. 通過android.graphics.Bitmap創建“MLFrame”物件用于分析器檢測圖片
MLFrame mlFrame = new MLFrame.Creator().setBitmap(this.originBitmap).create();
4. 呼叫“asyncAnalyseFrame ”方法進行影像分割
// 創建一個task,處理影像分割檢測器回傳的結果,
Task<MLImageSegmentation> task = this.analyzer.asyncAnalyseFrame(mlFrame);
// 異步處理影像分割檢測器回傳的結果,
task.addOnSuccessListener(new OnSuccessListener<MLImageSegmentation>() {
@Override
public void onSuccess(MLImageSegmentation mlImageSegmentationResults) {.
if (mlImageSegmentationResults != null) {
//獲得從圖片中分割出的人像前景圖
foreground = mlImageSegmentationResults.getForeground();
preview.setImageBitmap(MainActivity.this.foreground);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
return;
}
});
5. 更換圖片背景
// 從相冊中獲取圖片
backgroundBitmap = Utils.loadFromPath(this, id, targetedSize.first, targetedSize.second);
BitmapDrawable drawable = new BitmapDrawable(backgroundBitmap);
preview.setBackground(drawable);
preview.setImageBitmap(this.foreground);
根據以上的步驟,就可以實作這個好玩的全家福生成功能了,就地過年不能團圓,全家福依然“缺一不可”,你還可以在此功能基礎上做很多有意思的拓展,比如用華為影像服務給全家福添加一些小貼紙,讓照片年味更足、更有趣味,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/258766.html
標籤:其他
下一篇:app自動化
