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信息
登陆阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台账号管理平台查看AccessKeyID和AccessKeySecret:
3.2 创建Bucket
登陆OSS控制台https://oss.console.aliyun.com/创建Bucket,创建时地域一定要选择上海。
在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目录:
3.3.1 对比照上传
上传方式一
比如上传图片名称为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首页阿里云IoT - 所知不止于感知