飞道的博客

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

447人阅读  评论(0)

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等信息以及本地图像数据地址:


  
  1. char* upload_local_file(char* localfilepath, char *keyId, char *keySecret, char *secretToken, char *endPoint, char *bucketName)
  2. {
  3. /* 初始化OSS账号信息 */
  4. std::string AccessKeyId;
  5. std::string AccessKeySecret;
  6. std::string Endpoint;
  7. std::string BucketName;
  8. std::string SecretToken;
  9. /* yourObjectName表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg */
  10. std::string ObjectName ;
  11. char *p_url;
  12. char *pfile_path,file_path[256];
  13. AccessKeyId = keyId;
  14. AccessKeySecret = keySecret;
  15. Endpoint = endPoint;
  16. BucketName = bucketName;
  17. SecretToken = secretToken;
  18. #ifdef OSS_DEBUG
  19. std::cout << "Input_AccessKeyId:" << AccessKeyId <<std::endl;
  20. std::cout << "Input_AccessKeySecret:" << AccessKeySecret <<std::endl;
  21. std::cout << "Input_Endpoint:" << Endpoint <<std::endl;
  22. std::cout << "Input_BucketName:" << BucketName <<std::endl;
  23. std::cout << "Input_SecretToken:" << SecretToken <<std::endl;
  24. #endif
  25. memset(file_path,0,256);
  26. pfile_path = localfilepath;
  27. strncpy(file_path,&pfile_path[1],strlen(pfile_path)-1);
  28. /* 初始化网络等资源 */
  29. InitializeSdk();
  30. ClientConfiguration conf;
  31. OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
  32. //OssClient client(Endpoint, AccessKeyId, AccessKeySecret,SecretToken, conf);
  33. /* 上传文件 */
  34. auto fileSize = getFileSize(localfilepath);
  35. #ifdef OSS_DEBUG
  36. std::cout << "localfile_path size:" << fileSize <<std::endl;
  37. #endif
  38. std::shared_ptr<std::iostream> content = std::make_shared <std::fstream>(localfilepath, std::ios::in | std::ios::binary);
  39. #ifdef OSS_DEBUG
  40. std::cout << "localfile_path:" << localfilepath <<std::endl;
  41. #endif
  42. ObjectName = file_path;
  43. std::cout << "objectfile_path:" << ObjectName <<std::endl;
  44. PutObjectRequest request(BucketName, ObjectName, content);
  45. TransferProgress progressCallback = { ProgressCallback };
  46. request.setTransferProgress(progressCallback);
  47. auto outcome = client.PutObject(request);
  48. g_url = g_ags_url.toString();
  49. std::cout << "oss ->url:" << g_url << std::endl;
  50. p_url = (char *)(g_url.data());
  51. if (!outcome.isSuccess()) {
  52. /* 异常处理 */
  53. std::cout << "PutObject fail" <<
  54. ",code:" << outcome.error().Code() <<
  55. ",message:" << outcome.error().Message() <<
  56. ",requestId:" << outcome.error().RequestId() << std::endl;
  57. ShutdownSdk();
  58. return NULL;
  59. }
  60. std::cout << __FUNCTION__ << " success, ETag:" << outcome.result().ETag() << std::endl;
  61. /* 释放网络等资源 */
  62. ShutdownSdk();
  63. return p_url;
  64. }

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


  
  1. upload_local_file("/data/capture.jpg", OSS_ACCESS_KEY, \
  2. 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

上传方式二


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

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

3.3.2 实时人脸图片上传

事件注册

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


  
  1. int application_start(int argc, char **argv)
  2. {
  3. ......
  4. aos_register_event_filter(EV_NETWORK, wificamera_service_event, NULL);
  5. ......
  6. }
  7. static void wificamera_service_event(input_event_t *event, void *priv_data)
  8. {
  9. int ret;
  10. if (event->type != EV_NETWORK) {
  11. return;
  12. }
  13. if (event->code != CODE_ON_GOT_WIFICAMERA_IMAGE) {
  14. return;
  15. }
  16. /*upload to cloud to compare facebody*/
  17. do_comparing_facebody_process();
  18. }

事件触发

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


  
  1. static int32_t http_stream_process(char* url)
  2. {
  3. ......
  4. /*post event to facebody comparing service*/
  5. aos_post_event(EV_NETWORK, CODE_ON_GOT_WIFICAMERA_IMAGE, 0);
  6. ......
  7. }
  8. return ret;
  9. }

数据上传

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


  
  1. void do_comparing_facebody_async(void)
  2. {
  3. int len;
  4. char *tmp_upload_url, p_upload_url[128];
  5. char *p_myface_url;
  6. aos_mutex_lock(&g_mutex, AOS_WAIT_FOREVER);
  7. /*update capture.jpg to oss*/
  8. tmp_upload_url = upload_local_file("/data/capture.jpg", OSS_ACCESS_KEY, \
  9. OSS_ACCESS_SECRET, NULL , OSS_ENDPOINT, OSS_BUCKET);
  10. if (!tmp_upload_url) {
  11. LOGE(TAG, "url is null\n");
  12. return -1;
  13. }
  14. aos_mutex_unlock(&g_mutex);
  15. ......
  16. return;
  17. }

4、总结

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

 

五、开发者技术支持

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

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


转载:https://blog.csdn.net/HaaSTech/article/details/113321527
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场