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:
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首页https://iot.aliyun.com/
转载:https://blog.csdn.net/HaaSTech/article/details/113321527