• 【阿里云】图像识别


    一、阿里云官网资料及配置本地
    二、配置环境变量
    三、C语言调用阿里云Python接口

    一、阿里云官网资料及配置本地

    阿里云官网
    垃圾识别分类

    sudo apt install python3-pip
    pip3 install alibabacloud_imagerecog20190930
    
    • 1
    • 2

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可能出现的网络问题

    二、配置环境变量

    配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。

    • Linux和macOS系统配置方法

      • 在IntelliJ IDEA中打开终端Terminal。

      • 执行以下命令,配置环境变量。

    需替换为您RAM用户的AccessKey ID,替换为您RAM用户的AccessKey Secret。如果后续需要进行更多权限相关的配置,具体操作请参见使用RAM Policy控制访问权限。

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
    
    • 1
    • 2

    vi ~/.bashrc/etc/profile #然后在末尾输入上面两行后保存
    在这里插入图片描述
    在这里插入图片描述
    然后退出终端重新登录下,此时再执行export,能看到这两个Key的存在

    export
    declare -x ALIBABA_CLOUD_ACCESS_KEY_ID="你的阿里云Key ID"
    declare -x ALIBABA_CLOUD_ACCESS_KEY_SECRET="你的阿里云Key Secret"
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    • Windows系统配置方法
      新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。然后重启Windows系统。本操作以Windows 10为例进行说明。

      • 打开文件资源管理器,在此电脑上右键单击属性。

      • 在右侧导航栏,单击高级系统配置。

      • 在系统属性对话框的高级页签下,单击环境变量。

      • 在环境变量对话框中,单击新建(W)。
        在这里插入图片描述

      • 在弹出的新建系统变量对话框中,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。

      • 重启Windows系统,使配置生效。

    示例代码

    文件在本地或文件不在同一地域OSS

    # -*- coding: utf-8 -*-
    # 引入依赖包
    # pip install alibabacloud_imagerecog20190930
    
    import os
    import io
    from urllib.request import urlopen
    from alibabacloud_imagerecog20190930.client import Client
    from alibabacloud_imagerecog20190930.models import ClassifyingRubbishAdvanceRequest
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_tea_util.models import RuntimeOptions
    
    config = Config(
      # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
      # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
      # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
      access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
      access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
      # 访问的域名
      endpoint='imagerecog.cn-shanghai.aliyuncs.com',
      # 访问的域名对应的region
      region_id='cn-shanghai'
    )
    #场景一:文件在本地
    #img = open(r'/tmp/ClassifyingRubbish1.jpg', 'rb')
    #场景二:使用任意可访问的url
    url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/imagerecog/ClassifyingRubbish/ClassifyingRubbish1.jpg'
    img = io.BytesIO(urlopen(url).read())
    classifying_rubbish_request = ClassifyingRubbishAdvanceRequest()
    classifying_rubbish_request.image_urlobject = img
    runtime = RuntimeOptions()
    try:
      # 初始化Client
      client = Client(config)
      response = client.classifying_rubbish_advance(classifying_rubbish_request, runtime)
      # 获取整体结果
      print(response.body)
    except Exception as error:
      # 获取整体报错信息
      print(error)
      # 获取单个字段
      print(error.code)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    场景一是从本地读取文件
    场景二是从网址上访问读取文件
    将场景二注释,场景一代码打开,并修改输入自己测试图片的路径,如下:
    在这里插入图片描述
    其中“/home/orangepi/Image_recognition/test.png”为本地测试用图片路径(根据在线文档要求:图像类型:JPEG、JPG、PNG,图像大小:不大于3 MB,图像分辨率:不限制图像分辨率,但图像分辨率太高可能会导致API识别超时,超时时间为5秒)
    在这里插入图片描述
    如上,测试成功,说明阿里云垃圾分类方案对接成功。

    三、C语言调用阿里云Python接口

    在这里插入图片描述

    调用前先测试下

    改造下garbage.py里面的代码,封装成一个函数,供后C程序调用

    # garbage.py
    # -*- coding: utf-8 -*-
    # 引入依赖包
    # pip install alibabacloud_imagerecog20190930
    
    import os
    import io
    from urllib.request import urlopen
    from alibabacloud_imagerecog20190930.client import Client
    from alibabacloud_imagerecog20190930.models import ClassifyingRubbishAdvanceRequest
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_tea_util.models import RuntimeOptions
    
    config = Config(
      # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
      # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
      # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
      access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
      access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
      # 访问的域名
      endpoint='imagerecog.cn-shanghai.aliyuncs.com',
      # 访问的域名对应的region
      region_id='cn-shanghai'
    )
    
    def alibaba_garbage():
      # 场景一:文件在本地
      img = open(r'/home/orangepi/Image_recognition/test.png', 'rb')
      # 场景二:使用任意可访问的url
      # url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/imagerecog/ClassifyingRubbish/ClassifyingRubbish1.jpg'
      # img = io.BytesIO(urlopen(url).read())
      classifying_rubbish_request = ClassifyingRubbishAdvanceRequest()
      classifying_rubbish_request.image_urlobject = img
      runtime = RuntimeOptions()
      try:
        # 初始化Client
        client = Client(config)
        response = client.classifying_rubbish_advance(classifying_rubbish_request, runtime)
        # 获取整体结果
        # print(response.body)
        # 打印并返回需要的结果
        print(response.body.to_map()['Data']['Elements'][0]['Category'])
        return response.body.to_map()['Data']['Elements'][0]['Category']
      except Exception as error:
        # 获取整体报错信息
        # print(error)
        print(type('获取失败'))
        return '获取失败'
        # 获取单个字段
        # print(error.code)
    
    if __name__ == "__main__":
      alibaba_garbage()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    garbage.c

    #if 1
    #include 
    
    int main() {
        // 初始化Python解释器
        Py_Initialize();
    
        // 获取sys.path对象
        PyObject* sysPath = PySys_GetObject("path");
    
        // 将当前路径添加到sys.path中
        PyList_Append(sysPath, PyUnicode_DecodeFSDefault(".")); // PyUnicode_FromString将c字符串转换成Python字符串
    
        // 导入Python模块
        PyObject* pModule = PyImport_ImportModule("garbage");
    
        if (pModule != NULL) {
            // 获取Python函数对象
            PyObject* pFunction = PyObject_GetAttrString(pModule, "alibaba_garbage");
    
            if (pFunction != NULL && PyCallable_Check(pFunction)) {
                // 调用Python函数,这里是无参数调用
                PyObject* pArgs = PyTuple_New(0);  // 传递空参数元组
                PyObject* pResult = PyObject_CallObject(pFunction, pArgs);
    
                if (pResult != NULL) {
                  // 将返回值转换为C类型
                  char *result = NULL;
      
                  if (!PyArg_Parse(pResult, "s", &result)) {
                    PyErr_Print();
                    printf("Error: parse failed\n");
                  }
      
                  // 打印返回值
                    printf("pResult = %s\n", result);
                    Py_DECREF(pResult);
                } else {
                    PyErr_Print(); // 打印Python错误信息
                }
    
                Py_DECREF(pFunction);
                Py_DECREF(pArgs);
            } else {
                PyErr_Print();
            }
    
            Py_DECREF(pModule);
        } else {
            PyErr_Print();
        }
    
        // 关闭Python解释器
        Py_Finalize();
    
        return 0;
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    在这里插入图片描述

    c调用python代码garbage.py里函数, 封装并实现以下代码

    garbage.h

    #ifndef __GARBAGE__H
    #define __GARBAGE__H
    
    void garbage_init();
    void garbage_final();
    char *garbage_category(char *category);
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    garbage.c

    #if 1
    #include 
    #include "garbage.h"
    
    void garbage_init()
    {
        // 初始化Python解释器
        Py_Initialize();
    
        // 获取sys.path对象
        PyObject* sysPath = PySys_GetObject("path");
    
        // 将当前路径添加到sys.path中
        PyList_Append(sysPath, PyUnicode_DecodeFSDefault(".")); // PyUnicode_FromString将c字符串转换成Python字符串
    }
    
    void garbage_final()
    {
        // 关闭Python解释器
        Py_Finalize();
    }
    
    char *garbage_category(char *category) 
    {
        // 导入Python模块
        PyObject* pModule = PyImport_ImportModule("garbage");
    
        if (pModule != NULL) {
            // 获取Python函数对象
            PyObject* pFunction = PyObject_GetAttrString(pModule, "alibaba_garbage");
    
            if (pFunction != NULL && PyCallable_Check(pFunction)) {
                // 调用Python函数,这里是无参数调用
                PyObject* pArgs = PyTuple_New(0);  // 传递空参数元组
                PyObject* pResult = PyObject_CallObject(pFunction, pArgs);
    
                if (pResult != NULL) {
                  // 将返回值转换为C类型
                  char *result = NULL;
      
                  if (!PyArg_Parse(pResult, "s", &result)) {
                    PyErr_Print();
                    printf("Error: parse failed\n");
                  }
      
                    // 打印返回值
                    printf("pResult = %s\n", result);
                    
                    // 为垃圾分类信息分配内存,复制返回值
                    category = (char *)malloc(sizeof(char) * (strlen(result) + 1));
                    memset(category, 0, (strlen(result) + 1));
                    strncpy(category, result, (strlen(result) + 1));
                     
                    Py_DECREF(pResult);
                } else {
                    PyErr_Print(); // 打印Python错误信息
                }
    
                Py_DECREF(pFunction);
                Py_DECREF(pArgs);
            } else {
                PyErr_Print();
            }
    
            Py_DECREF(pModule);
        } else {
            PyErr_Print();
        }
        return category;
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    garbage_test.c

    //garbage_test.c
    #include 
    #include 
    #include "garbage.h"
    
    int main(int argc, char *argv[])
    {
    	char *category = NULL;
    
    	garbage_init();
    	category = garbage_category(category);
    	printf("category = %s\n", category);
    	garbage_final();
      
      if (category) {
    	  free(category);
      }
         
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    编译和运行这个程序,可以使用以下命令(假设使用的是gcc编译器和Python 3.10版本):

    gcc -o garbage_test garbage.h garbage.c garbage_test.c -I /usr/include/python3.10/ -l python3.10
    ./garbage_test
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    Vue使用ElementUi进行模糊搜索
    【Mac开发环境搭建】Docker安装Redis、Nacos
    qt学习总结之探索Qt的安装目录结构
    《Flink学习笔记》——第十二章 Flink CEP
    归一化与标准化
    Unity关键词语音识别
    记录Centos7.9 安装mongodb 6.0 过程遇到的坑和解决办法
    【C++】STL简介 | STL六大组件 | string类 | string类对象操作
    day3 力扣
    C++ 内存模型 write_x_read_y 试例构造
  • 原文地址:https://blog.csdn.net/m0_62140641/article/details/134467078