HaaS AI 应用实践“老板来了”系列之三:OSS图像上传

在这里插入图片描述

1、OSS简介

阿里云对象存储OSS(Object Storage Service)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音视频在内的各类数据文件。

2、为什么使用OSS

视觉智能平台通过访问上传到OSS中的图片内容进行人脸识别对比,因此需要通过拍照上传一张待识别的人脸图片到OSS对象存储中,然后再实时上传当前采集的人脸图片进行对比。

3、OSS上传流程

本Demo中提供了默认的OSS账户,如果开发者想要使用自己的OSS账户,请登陆www.aliyun.com先注册阿里云账号,然后参考《OSS对象存储》来使用OSS。在使用OSS应用开发中上传图片时需要填入几个重要的参数:

a. AccessKeyId

b. AccessKeySecret

c. Endpoint

d. BucketName

e. SecretToken(可以不填)

3.1 获取AccessKey信息

登陆https://ram.console.aliyun.com/账号管理平台查看AccessKeyID和AccessKeySecret:

image.png

image.png

3.2 创建Bucket

登陆OSS控制台https://oss.console.aliyun.com/创建Bucket,创建时地域一定要选择上海

image.png

image.png

image.png

在Bucket创建好后,从上图我们可以看到:

Endpoint:oss-cn-shanghai.aliyuncs.com

BucketName就是我们创建Bucket取的名字oss-ai-dev。

3.3 OSS应用开发

在AliOS Things上移植OSS SDK,SDK路径位于:

$components/service/ucloud/oss

通过OSS SDK我们可以将本地采集的图片上传到刚才创建好的Bucket中,只需要将前面获取到的AccessKey等信息以及本地图像数据地址:

char* upload_local_file(char* localfilepath, char *keyId, char *keySecret, char *secretToken, char *endPoint, char *bucketName)
{
    /* 初始化OSS账号信息 */
    std::string AccessKeyId;
    std::string AccessKeySecret;
    std::string Endpoint;
    std::string BucketName;
    std::string SecretToken;
    /* yourObjectName表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg */
    std::string ObjectName ;

    char *p_url;
    char *pfile_path,file_path[256];

    AccessKeyId = keyId;
    AccessKeySecret = keySecret;
    Endpoint = endPoint;
    BucketName = bucketName;
    SecretToken = secretToken;

#ifdef OSS_DEBUG
    std::cout << "Input_AccessKeyId:" << AccessKeyId <<std::endl;
    std::cout << "Input_AccessKeySecret:" << AccessKeySecret <<std::endl;
    std::cout << "Input_Endpoint:" << Endpoint <<std::endl;
    std::cout << "Input_BucketName:" << BucketName <<std::endl;
    std::cout << "Input_SecretToken:" << SecretToken <<std::endl;
#endif
    memset(file_path,0,256);
    pfile_path = localfilepath;
    strncpy(file_path,&pfile_path[1],strlen(pfile_path)-1);

    /* 初始化网络等资源 */
    InitializeSdk();

    ClientConfiguration conf;
    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
    //OssClient client(Endpoint, AccessKeyId, AccessKeySecret,SecretToken, conf);

    /* 上传文件 */
    auto fileSize = getFileSize(localfilepath);
#ifdef OSS_DEBUG
    std::cout << "localfile_path size:" << fileSize <<std::endl;
#endif
    std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(localfilepath, std::ios::in | std::ios::binary);
#ifdef OSS_DEBUG
    std::cout << "localfile_path:" << localfilepath <<std::endl;
#endif
    ObjectName = file_path;
    std::cout << "objectfile_path:" << ObjectName <<std::endl;
    PutObjectRequest request(BucketName, ObjectName, content);

    TransferProgress progressCallback = { ProgressCallback };
    request.setTransferProgress(progressCallback);

    auto outcome = client.PutObject(request);
    g_url = g_ags_url.toString();
    std::cout << "oss ->url:" << g_url << std::endl;
    p_url = (char *)(g_url.data());

    if (!outcome.isSuccess()) {
        /* 异常处理 */
        std::cout << "PutObject fail" <<
                  ",code:" << outcome.error().Code() <<
                  ",message:" << outcome.error().Message() <<
                  ",requestId:" << outcome.error().RequestId() << std::endl;
        ShutdownSdk();
        return NULL;
    }
    std::cout << __FUNCTION__ << " success, ETag:" << outcome.result().ETag() << std::endl;
    /* 释放网络等资源 */
    ShutdownSdk();
    return p_url;
}

下面是上传本地/data/capture.jpg到OSS Bucket oss-ai-dev中:

upload_local_file("/data/capture.jpg", OSS_ACCESS_KEY, \
            OSS_ACCESS_SECRET, NULL , OSS_ENDPOINT, OSS_BUCKET);

上传成功后会oss-ai-dev Bucket中生成一个/data目录:

image.png

3.3.1 对比照上传

上传方式一

image.png

比如上传图片名称为myface.jpg,上传成功后,图片的固定路径是:

http://oss-ai-dev.oss-cn-shanghai.aliyuncs.com/data%2Fmyface.jpg

上传方式二

tmp_upload_url = upload_local_file("/data/myface.jpg", OSS_ACCESS_KEY, \
            OSS_ACCESS_SECRET, NULL , OSS_ENDPOINT, OSS_BUCKET);

上传成功后返回的值就是oss上的路径。

3.3.2 实时人脸图片上传

事件注册

在Demo初始化时注册一个WiFi摄像头图像数据采集完成的事件,当采集到一张JPEG图像后便触发该事件进行响应。

int application_start(int argc, char **argv)
{
    ......
    aos_register_event_filter(EV_NETWORK, wificamera_service_event, NULL);
    ......
}

static void wificamera_service_event(input_event_t *event, void *priv_data)
{
    int ret;
    if (event->type != EV_NETWORK) {
        return;
    }

    if (event->code != CODE_ON_GOT_WIFICAMERA_IMAGE) {
        return;
    }
    /*upload to cloud to compare facebody*/
    do_comparing_facebody_process();
}

事件触发

在存储图像数据到本地后,将抛出一个事件进行A

static int32_t http_stream_process(char* url)
{
        ......
        /*post event to facebody comparing service*/
        aos_post_event(EV_NETWORK, CODE_ON_GOT_WIFICAMERA_IMAGE, 0);
        ......
    }
    return ret;
}

数据上传

前面提到在保存JPEG后就会触发event进入异步人脸对比的流程,会实时将采集的JPEG上传到OSS Bucket中,每次上传的图片会覆盖之前上传的。

void do_comparing_facebody_async(void)
{
    int len;
    char *tmp_upload_url, p_upload_url[128];
    char *p_myface_url;

    aos_mutex_lock(&g_mutex, AOS_WAIT_FOREVER);
    /*update capture.jpg to oss*/
    tmp_upload_url = upload_local_file("/data/capture.jpg", OSS_ACCESS_KEY, \
            OSS_ACCESS_SECRET, NULL , OSS_ENDPOINT, OSS_BUCKET);
    if (!tmp_upload_url) {
        LOGE(TAG, "url is null\n");
        return -1;
    }
    aos_mutex_unlock(&g_mutex);
    ......
    return;
}

4、总结

至此,图像数据上传到OSS中已经完成,那么接下来就是要进行人脸比对了,我们继续期待《HaaS AI 应用实践“老板来了”系列之四- 人脸比对》。

五、开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/

猜你喜欢

转载自blog.csdn.net/HaaSTech/article/details/113321527