• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

从菜鸟到高手-HMS-Core图像分割服务教你如何在复杂背景里精细抠图

android 搞代码 3年前 (2022-03-09) 24次浏览 已收录 0个评论

2021年以来,主动驾驶赛道进入暴发期,该行业成为大厂以及初创企业的必争之地。其中泛滥公司都采纳了计算机视觉作为主动驾驶的技术底座,通过图像宰割技术,汽车才可能无效了解路线场景,分分明哪里是路,哪里是人。除了主动驾驶畛域,图像宰割技术也常呈现在其余重要的场景中,比方:

  • 医疗图像宰割:帮忙医生进行诊断测试
  • 卫星图像剖析:适宜深入研究大量图像数据
  • 影像娱乐类App:人像抠图、防止视频弹幕遮住人脸

因而,图像宰割技术的利用非常重要且宽泛。HMS Core机器学习服务图像宰割服务采纳了具备翻新意义的语义宰割框架。这种框架将图像中的每个像素点都标签化,即便是发丝细节都能够清晰残缺的保留。另外,图像宰割服务还晋升了对于不同画质、不同尺寸图片的解决能力,针对宰割算法经常呈现的白边,采纳更加结构化学习的训练形式,使边缘更加天然。

那么如此稳固、精细化的宰割能力,到底如何实现?

开发实战

一、开发筹备

Maven仓和SDK的配置步骤能够参考开发者网站中的利用开发介绍:
https://developer.huawei.com/…

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" />

二、开发步骤

@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);

6 更换图片背景

MLFrame mlFrame = new MLFrame.Creator().setBitmap(this.originBitmap).create();

(demo演示视频如下)

理解更多详情>>

拜访华为开发者联盟官网
获取开发领导文档
华为挪动服务开源仓库地址:GitHub、Gitee

关注咱们,第一工夫理解 HMS Core 最新技术资讯~


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:从菜鸟到高手-HMS-Core图像分割服务教你如何在复杂背景里精细抠图

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址