全民互联时代,即使足不出户,我们也能在朋友圈以及各大社交媒体平台纵览世界各地的风景。

你有没有过这样的尴尬。在朋友圈瞬间种草的美景、却不知道具体位置在哪里;想跟好友就分享的出游照打开话题,奈何地标知识储备不足,自行检索的操作损耗太大,转而悄悄点赞作罢……

这一切,华为机器学习地标识别能力都能轻松handle,开发一款地标识别应用,17000+著名地标,教你变身世界名胜小百科。

 

识别服务简介 

集成地标识别服务,你会获得输入图片的地标名称、经纬度、可信度等信息,可信度越高代表输入图片中的地标越有可能是识别出的地标。基于获得的信息,你可以为用户创造更加个性化应用体验。目前已经支持分布在全球超过17,000处地标的识别。

地标识别服务是端侧调用云侧API进行检测,检测算法模型在云侧运行。因此,调测和使用时需保证设备可正常访问互联网。

集成准备

开发环境配置

1、需要在华为开者联盟上创建应用:

此步骤具体可以详见下方的链接:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started#createproject?ha_source=hms1

 

2、打开机器学习服务:

具体开启步骤可以查看下方的链接:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/enable-service-0000001050038078-V5?ha_source=hms1

3、创建完应用之后,会自动生成agconnect-services.json文件, 需要手动将agconnect-services.json文件拷贝到应用级根目录下

4、配置HMS Core SDK的Maven仓地址。

关于Maven仓的配置可以查看下方的链接:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/config-maven-0000001050040031?ha_source=hms1

5、集成地标识别服务SDK

  • 在app目录下的build.gradle文件中配置相应的sdk
// 引入地标识别服务SDK
implementation 'com.huawei.hms:ml-computer-vision-cloud:2.0.5.304'
  • 根据实际情况声明AGC插件配置,有两种方式
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
或
plugins {
    id 'com.android.application'
    id 'com.huawei.agconnect'
}

应用开发编码阶段

1、取得 相机 权限,便于拍照和选择照片

设置静态权限(必须)

<uses-permission android:name="android.permission.CAMERA" />
动态权限获取(必须)
ActivityCompat.requestPermissions(
        this, new String[]{Manifest.permission. CAMERA
}, 1);

2、设置ApiKey,因为此服务需要在云端进行检测,所以需要通过APIKey设置云端鉴权信息,此处必须设置,否则程序运行时会报错。

//设置应用访问云服务的ApiKey。
private void setApiKey() {
//解析agconnect-services.json文件,以便获取此文件中的信息
AGConnectServicesConfig config = AGConnectServicesConfig.fromContext(getApplication());
//设置ApiKey
MLApplication.getInstance().setApiKey(config.getString("client/api_key"));

    }

3、创建地标分析器,有两种方式,一种是使用默认的方式,一种是可以通过地标识别自定义参数类MLRemoteLandmarkAnalyzerSetting创建分析器。

// 方式1:使用默认的参数配置。
MLRemoteLandmarkAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteLandmarkAnalyzer();

// 方式2:使用自定义的参数配置。

/**
 * 使用自定义的参数配置。
 * setLargestNumOfReturns 识别结果的最大数量。
 * setPatternType  分析器使用的模式。
 * MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN:值为1,即稳定模式。
 * MLRemoteLandmarkAnalyzerSetting.NEWEST_PATTERN:值为2,即最新模式。
 */
private void initLandMarkAnalyzer() {
    settings = new MLRemoteLandmarkAnalyzerSetting.Factory()
            .setLargestNumOfReturns(1)
            .setPatternType(MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN)
            .create();
    analyzer = MLAnalyzerFactory.getInstance().getRemoteLandmarkAnalyzer(settings);
}

4、通过拍照或者选择相册的图片,将获取的图片转为Bitmap类型,此步骤需要接入方自己实现,地标识别SDK没有提供此能力。

//选择图片
private void selectLocalImage() {
    Intent intent = new Intent(Intent.ACTION_PICK, null);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(intent, REQUEST_SELECT_IMAGE);
}

在回调方法中开启检测地标的服务
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //图片选择成功
    if (requestCode == REQUEST_SELECT_IMAGE && resultCode == RESULT_OK) {
        if (data != null) {
            //通过getData()方法 拿到imageUri
            imageUri = data.getData();
//BitmapUtils类需要接入方自己实现,可以通过uri得到Bitmap对象 bitmap = BitmapUtils.loadFromPath(this, imageUri, getMaxWidthOfImage(), getMaxHeightOfImage());
        }
        //开始地标的检测
        startAnalyzerImg(bitmap);
    }
}

5、获取到图片的bitmap对象之后,就可以进行地标的检测了, 因为地标的检测是在云测进行的,如果网络不好的情况下,数据传输比较慢,所以建议在检测之前,开启遮罩层。

//开始检测地标
private void startAnalyzerImg(Bitmap bitmap) {
    if (imageUri == null) {
        return;
    }
    //开启遮罩层
    progressBar.setVisibility(View.VISIBLE);
    img_analyzer_landmark.setImageBitmap(bitmap);

    //通过android.graphics.Bitmap构造MLFrame,支持的图片格式包括:jpg/jpeg/png/bmp,建议图片尺寸不小于640*640像素。
    MLFrame mlFrame = new MLFrame.Creator().setBitmap(bitmap).create();
    Task<List<MLRemoteLandmark>> task = analyzer.asyncAnalyseFrame(mlFrame);
    task.addOnSuccessListener(new OnSuccessListener<List<MLRemoteLandmark>>() {
        public void onSuccess(List<MLRemoteLandmark> landmarkResults) {
            progressBar.setVisibility(View.GONE);
            // 识别成功的处理逻辑。
            Log.d("BitMapUtils", landmarkResults.get(0).getLandmark());
        }
    }).addOnFailureListener(new OnFailureListener() {
        public void onFailure(Exception e) {
            progressBar.setVisibility(View.GONE);
            // 识别失败的处理逻辑。
            // Recognition failure.
            try {
                MLException mlException = (MLException) e;
                // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。
                int errorCode = mlException.getErrCode();
                // 获取报错信息,开发者可以结合错误码,快速定位问题。
                String errorMessage = mlException.getMessage();
                //将错误码和错误信息 以日志的形式打印出来
                Log.d("BitMapUtils", "errorCode: " + errorCode + "; errorMessage: " + errorMessage);
            } catch (Exception error) {
                // 转换错误处理。
            }
        }
    });
}

运行测试 

以识别上海东方明珠塔和字塔为例:

 

其他

1. 行地标检测之前,必须设置ApiKey,进行云端的鉴权,否则,应用会报错。
2. 标检测是在云端进行的,会有一定的耗时,所以在进行地标检测的时候,最好开启遮罩层。
3. 读者对ML Kit其他模块感兴趣的话,可以查看华为ML Kit提供的相关集成文档

>>访问华为机器学习服务官网,了解更多相关内容
>>获取华为机器学习服务开发指导文档
>>华为机器学习服务开源仓库地址:GitHubGitee

点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐