本文为您介绍如何使用阿里云视觉智能开放平台相关服务的C# SDK,包括SDK的获取和安装方法,以及SDK代码示例。
阿里云视觉智能开放平台各类目视觉AI能力SDK接入、接口使用或问题咨询等,请通过钉钉群(23109592)加入阿里云视觉智能开放平台咨询群联系我们。
该版本SDK最低环境要求.NET Framework 4.5或.NET Core 2.0,如不满足请升级C#版本。
准备工作
在安装和使用阿里云SDK前,确保您已经注册阿里云账号并生成访问密钥(AccessKey)。具体操作,请参见创建AccessKey。
安装对应算法类目的SDK包。 具体操作步骤如下:
(推荐)通过NuGet方式安装。
如果您的Visual Studio没有安装NuGet,请先安装NuGet。
在Visual Studio中新建或者打开已有的项目,选择工具 > NuGet包管理器 > 管理解决方案的NuGet程序包。
搜索Facebody20191230,在结果中找到AlibabaCloud.SDK.Facebody20191230,选择最新版本,单击安装。
通过.Net CLI方式安装。执行
dotnet add package AlibabaCloud.SDK.Facebody20191230
安装阿里云核心库.NET SDK。AI类目
SDK链接
Github链接
生成专区
人脸人体
文字识别
商品理解
内容审核
图像识别
图像生产
分割抠图
目标检测
视觉搜索
图像分析处理
视频生产
视频理解
视频分割
异步任务管理
人脸核身服务端20200910专用版本
配置环境变量
配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户。
请不要将AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
Linux和macOS系统配置方法
在IntelliJ IDEA中打开终端Terminal。
执行以下命令,配置环境变量。
<access_key_id>
需替换为您RAM用户的AccessKey ID,<access_key_secret>
替换为您RAM用户的AccessKey Secret。如果后续需要进行更多权限相关的配置,具体操作请参见使用RAM Policy控制访问权限。export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
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系统,使配置生效。
代码示例
本文以RecognizeBankCard为例。
文件在上海地域OSS
每个类目的访问域名与对应Region开通能力,请参见访问域名。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
// 1、这里只是以ocr为例,其他能力请引入相应类目的包。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.com/document_detail/151960.html,可以知道该能力属于分割抠图类目,能力名称为SegmentCommonImage,那么您需要将代码中Ocr20191230改为Imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
using AlibabaCloud.SDK.Ocr20191230.Models;
using Tea;
using Tea.Utils;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static AlibabaCloud.SDK.Ocr20191230.Client CreateClient(string accessKeyId, string accessKeySecret)
{
//初始化配置对象AlibabaCloud.OpenApiClient.Models.Config。Config对象存放AccessKeyId、AccessKeySecret、Endpoint等配置。
AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
{
AccessKeyId = accessKeyId,
AccessKeySecret = accessKeySecret,
};
// 2、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html
config.Endpoint = "ocr.cn-shanghai.aliyuncs.com";
// 3、这里只是以ocr为例,其他能力请使用相应类目的包下面的Client类
return new AlibabaCloud.SDK.Ocr20191230.Client(config);
}
public static void Main(string[] args)
{
// 4、创建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。运行示例前必须先配置环境变量。
// 这里只是以ocr为例,其他能力请使用相应类目的包下面的Client类
AlibabaCloud.SDK.Ocr20191230.Client client = CreateClient(Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"), Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// 5、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,具体入参设置需要参考具体能力的文档
AlibabaCloud.SDK.Ocr20191230.Models.RecognizeBankCardRequest recognizeBankCardRequest = new AlibabaCloud.SDK.Ocr20191230.Models.RecognizeBankCardRequest();
recognizeBankCardRequest.ImageURL = "http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg";
AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
try
{
// 6、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意,RecognizeBankCardWithOptions方法名也需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的,如能力名称为SegmentCommonImage,对应方法名应该为SegmentCommonImageWithOptions。
AlibabaCloud.SDK.Ocr20191230.Models.RecognizeBankCardResponse recognizeBankCardResponse = client.RecognizeBankCardWithOptions(recognizeBankCardRequest, runtime);
// 获取整体结果
Console.WriteLine(AlibabaCloud.TeaUtil.Common.ToJSONString(recognizeBankCardResponse.Body));
// 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
Console.WriteLine(recognizeBankCardResponse.Body.Data.CardNumber);
}
catch (TeaException error)
{
// 如有需要,请打印 error
Console.WriteLine(error.Message);
}
catch (Exception _error)
{
TeaException error = new TeaException(new Dictionary<string, object>
{
{ "message", _error.Message }
});
// 如有需要,请打印 error
Console.WriteLine(error.Message);
}
}
}
}
需要修改的地方均在上述代码注释中标明,总结如下:
引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。
例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错
InvalidAction.NotFound
。关于域名详情,请参见访问域名。Client类需要使用相应类目的包下的Client类。
Request和Response需要使用相应类目的包和类。
调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的。例如,能力名称为SegmentCommonImage,对应方法名应该为SegmentCommonImageWithOptions。
文件在本地或可访问的URL
文件在本地、文件不在同一地与文件在同地域区别在于需要使用xxxAdvanceRequest,文件是以Stream形式通过ImageURLObject参数传入。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
// 1、这里只是以ocr为例,其他能力请引入相应类目的包。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.com/document_detail/151960.html,可以知道该能力属于分割抠图类目,能力名称为SegmentCommonImage,那么您需要将代码中Ocr20191230改为Imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
using AlibabaCloud.SDK.Ocr20191230.Models;
using Tea;
using Tea.Utils;
using static System.Net.WebRequestMethods;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static AlibabaCloud.SDK.Ocr20191230.Client CreateClient(string accessKeyId, string accessKeySecret)
{
//初始化配置对象AlibabaCloud.OpenApiClient.Models.Config。Config对象存放AccessKeyId、AccessKeySecret、Endpoint等配置。
AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
{
AccessKeyId = accessKeyId,
AccessKeySecret = accessKeySecret,
};
// 2、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html
config.Endpoint = "ocr.cn-shanghai.aliyuncs.com";
// 3、这里只是以ocr为例,其他能力请使用相应类目的包下面的Client类
return new AlibabaCloud.SDK.Ocr20191230.Client(config);
}
public static void Main(string[] args)
{
// 4、创建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。运行示例前必须先配置环境变量。
// 这里只是以ocr为例,其他能力请使用相应类目的包下面的Client类
AlibabaCloud.SDK.Ocr20191230.Client client = CreateClient(Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"), Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // 5、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,具体入参设置需要参考具体能力的文档
AlibabaCloud.SDK.Ocr20191230.Models.RecognizeBankCardAdvanceRequest recognizeBankCardAdvanceRequest = new AlibabaCloud.SDK.Ocr20191230.Models.RecognizeBankCardAdvanceRequest();
/* 场景一,使用本地文件
System.IO.StreamReader file = new System.IO.StreamReader(@"/Users/zhuxun.lx/Downloads/yhk1.jpg");
recognizeBankCardAdvanceRequest.ImageURLObject = file.BaseStream;
*/
// 场景二,使用任意可访问的url
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg");
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
recognizeBankCardAdvanceRequest.ImageURLObject = stream;
AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
try
{
// 6、这里只是以ocr下的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意,RecognizeBankCardAdvance方法名也需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的,如能力名称为SegmentCommonImage,对应方法名应该为SegmentCommonImageAdvance。
AlibabaCloud.SDK.Ocr20191230.Models.RecognizeBankCardResponse recognizeBankCardResponse = client.RecognizeBankCardAdvance(recognizeBankCardAdvanceRequest, runtime);
// 获取整体结果
Console.WriteLine(AlibabaCloud.TeaUtil.Common.ToJSONString(recognizeBankCardResponse.Body));
// 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
Console.WriteLine(recognizeBankCardResponse.Body.Data.CardNumber);
}
catch (TeaException error)
{
// 如有需要,请打印 error
Console.WriteLine(error.Message);
}
catch (Exception _error)
{
TeaException error = new TeaException(new Dictionary<string, object>
{
{ "message", _error.Message }
});
// 如有需要,请打印 error
Console.WriteLine(error.Message);
}
}
}
}
需要修改的地方均在上述代码注释中标明,总结如下:
引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。
例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错
InvalidAction.NotFound
。关于域名详情,请参见访问域名。Client类需要使用相应类目的包下面的Client类。
Request和Response需要使用相应类目的包和类。
调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成。例如,能力名称为SegmentCommonImage,对应方法名应该为SegmentCommonImageAdvance。
常见问题
调用报错如何处理?
如果您的调用出现报错,请先尝试升级SDK包到最新版本,最新版本请参考各类目SDK链接。如果您的程序中同时引入了多个类目的包,也可以先尝试将这些包都升级到最新版本,避免版本之间的包冲突问题。
OpenAPI界面显示的最新包在nuget仓库中找不到如何处理?
如果您发现OpenAPI界面显示的最新版本的包,在nuget仓库中找不到,这是因为新版本的包刚刚发布,仓库同步可能会有延迟,如果遇到版本不存在的情况,请稍后再试或使用nuget仓库中的最新版本。
技术支持
如果以上方法未能解决您的问题,请通过搜索钉钉群号(23109592)加入阿里云视觉智能开放平台咨询群联系我们。届时会有专业的技术人员与您对接解决问题。