微软Azure提供了大量的AI及机器学习功能,可以通过简单的RestAPI调用。

关于此文中提到的Azure计算机视觉,可查看此链接的详细介绍。

通过微软的服务,只需要几行代码即可使用计算机视觉中的 REST API 分析图像提取特征信息。

开发环境说明及初始准备。

开发工具:Visual Studio For Mac 2019 preview

创建Xamarin.Forms程序,PCL类库逐渐在过时,所以新项目的共享代码选择.NET Standard。

1.在共享项目中添加Xam.Plugin.Media的NuGet包引用,此包可以大大减少访问相册的代码量。

PS:Xamarin.Essentials还没有提供摄像头和相册的调用功能。

NuGet包安装完成后,会显示readme.txt,增加对应的访问权限设定,在此NuGet包的GitHub中同样有详细说明,

地址为:https://github.com/jamesmontemagno/MediaPlugin

2.添加对Microsoft.Azure.CognitiveServices.Vision.ComputerVision的Nuget包引用。

此包提供了Azure计算机视觉的API访问。

3.注册计算机视觉的API Key。

点击 链接

点击免费试用认知服务,登陆微软账号,

点击获取API Key,Azure会提供一个7天的免费试用Key

初始准备完成。

程序代码编写

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"           xmlns:local="clr-namespace:RevealTest" x:Class="RevealTest.MainPage"           xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"           ios:Page.UseSafeArea="true">
    <ContentPage.Content>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="2*" />
                <RowDefinition Height=".2*" />
                <RowDefinition Height="3*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Image Grid.Row="0" Grid.Column="0" x:Name="imgSelected" Aspect="AspectFit" />
            <Button x:Name="btnPick" Text="选择图片" Clicked="Handle_Clicked" Grid.Row="1" Grid.Column="0" />
            <TableView Grid.Row="2" Grid.Column="0" x:Name="TableView">
                <TableRoot>
                    <TableSection Title="图片信息" x:Name="TableSection">
                    </TableSection>
                </TableRoot>
            </TableView>
        </Grid>
    </ContentPage.Content>
</ContentPage>

PS:此行代码代表对刘海屏进行适配。

ios:Page.UseSafeArea="true"
public partial class MainPage : ContentPage
    {
        public string subscriptionKey = "申请的API Key";

        public MainPage()
        {
            InitializeComponent();

        }

        async void Handle_Clicked(object sender, System.EventArgs e)
        {
            TableView.Root.Clear();
            TableRoot root = new TableRoot();
            await CrossMedia.Current.Initialize();
            var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Photos);
            if (status != PermissionStatus.Granted)
            {
                if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Photos))
                {
                    await DisplayAlert("提示", "需要访问您的相册", "OK");
                }
                await DisplayAlert("提示", "需要访问您的相册", "OK");
                if (Device.RuntimePlatform == Device.iOS)
                {
                    Device.OpenUri(new Uri("app-settings:"));
                }

                return;
            }
            try
            {
                var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
                {
                    PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium
                });
                if (file == null) return;
                imgSelected.Source = ImageSource.FromStream(() =>
                {
                    var stream = file.GetStream();
                    return stream;
                });
                var result = await MakeAnalysisRequest(file.Path);

                if (result == null)
                {
                    TableSection.Add(CreateTextCell("空", "空"));
                }
                if (result.Metadata != null)
                {
                    TableSection.Add(CreateTextCell("图片格式", result.Metadata.Format + " " + result.Metadata.Width.ToString() + "*" + result.Metadata.Height));
                }
                if (result.Description != null)
                {
                    foreach (var item in result.Description.Captions)
                    {
                        TableSection.Add(CreateTextCell("图片内容推测:" + item.Text, "可能性" + item.Confidence));
                    }
                    string tagdesc = "";
                    foreach (var item in result.Description.Tags)
                    {
                        tagdesc += item + ", ";
                    }
                    TableSection.Add(CreateTextCell("图片标签", tagdesc));
                }
                if (result.Tags != null)
                {
                    foreach (var item in result.Tags)
                    {
                        TableSection.Add(CreateTextCell(item.Name, "可能性" + item.Confidence));
                    }
                }
                TableView.Root.Add(TableSection);
            }

            catch (Exception ex)
            {
                string test = ex.Message;
            }
        }

        private TextCell CreateTextCell(string text, string detail)
        {
            return new TextCell
            {
                Text = text,
                Detail = detail,
                DetailColor = Color.Gray
            };
        }

        public async Task<ImageAnalysis> MakeAnalysisRequest(string imageFilePath)
        {

            using (var fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read))
            {

                var apikey = new ApiKeyServiceClientCredentials(subscriptionKey);

                var visualFeatures = new List<VisualFeatureTypes>
                {
                    (VisualFeatureTypes)Enum.Parse(typeof(VisualFeatureTypes), "Categories"),
                    (VisualFeatureTypes)Enum.Parse(typeof(VisualFeatureTypes), "Tags"),
                    (VisualFeatureTypes)Enum.Parse(typeof(VisualFeatureTypes), "ImageType"),
                    (VisualFeatureTypes)Enum.Parse(typeof(VisualFeatureTypes), "Color"),
                    (VisualFeatureTypes)Enum.Parse(typeof(VisualFeatureTypes), "Faces"),
                    (VisualFeatureTypes)Enum.Parse(typeof(VisualFeatureTypes), "Adult"),
                    (VisualFeatureTypes)Enum.Parse(typeof(VisualFeatureTypes), "Description")
                };

                using (var client = new ComputerVisionClient(apikey) { Endpoint = "https://westcentralus.api.cognitive.microsoft.com" })
                {

                    ImageAnalysis analysisResult = await client.AnalyzeImageInStreamAsync(fileStream, visualFeatures.ToArray(), null, "zh");
                    return analysisResult;
                }
            }
        }
    }

由于只是体验性质,就没有使用MVVM模式,并且结果展示也没有使用特别恰当的方式。

执行效果

将Azure计算机视觉添加到Xamarin应用程序简单体验的更多相关文章

  1. 在 Windows Azure 上设计多租户应用程序

    作者:Suren Machiraju 和 Ralph Squillace 审校:Christian Martinez.James Podgorski.Valery Mizonov 和 Michael ...

  2. 使用Azure DevOps Pipeline实现.Net Core程序的CD

    上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI.这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD. 实现本次目标我们除了A ...

  3. Linux systemd 打开调试终端、添加开机自运行程序

    /************************************************************************* * Linux systemd 打开调试终端.添加 ...

  4. 【Xamarin挖墙脚系列:如何从一个Apk程序转化为Xamarin的程序】

    原文:[Xamarin挖墙脚系列:如何从一个Apk程序转化为Xamarin的程序] 工欲善其事必先利其器:工具下载:http://pan.baidu.com/s/1skxjwgH 接下来,我用个小的应 ...

  5. 从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库)

    原文:从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库)  1.安装对应dll     Update-Package Xama ...

  6. 故障排除:无法启动、访问或连接到 Azure 虚拟机上运行的应用程序

    有多种原因可导致无法启用或连接到在 Azure 虚拟机 (VM) 上运行的应用程序.原因包括应用程序未在预期端口上运行或侦听.侦听端口受到阻止,或网络规则未将流量正确传递到应用程序.本文说明有条理地找 ...

  7. wxWidgets初学者导引(3)——wxWidgets应用程序初体验

    wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith ...

  8. 微信小程序简单封装图片上传组件

    微信小程序简单封装图片上传组件 希望自己 "day day up" -----小陶 我从哪里来 在写小程序的时候需要上传图片,个人觉得官方提供的 Uploader 组件不是太好用, ...

  9. C#基础--.net平台的重要组成部分以及.net程序简单的编译原理

    .net平台的组成只要有两部分   FCL:框架类库    CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...

随机推荐

  1. jsp页面错误的全局处理

    网上搜索spring mvc项目全局异常处理: 大致可以找到两种方案 : 方案1: ExceptionHandlerResolver . spring 提供了两种默认实现,当然你也可以自己实现.. 方 ...

  2. maven下载的jar相应pom文件下载不完整问题。

    今天遇到一个奇葩问题: 同样的项目,我启动报错 : 某个class文件找不到.. 查找maven 依赖也的确没有找到 对应的jar 包. 查找同事项目,可以看到该class对应的 jar 包 是 lo ...

  3. TCP与UDP传输协议

    目录结构: contents structure [-] 1 TCP协议和UDP协议的比较 1.1 TCP协议 TCP的全称是Transmission Control Protocol (传输控制协议 ...

  4. tms web core 通过URL 传递参数

    一般我们都会通过URL 给服务器传递很多参数,通过参数来决定对应的处理,今天就大概讲一下 如果通过URL 参数实现一些功能. 1.通过参数跳入不同的界面 首先我们先建立一个tms web core 工 ...

  5. socketserver模块实现并发和连接合法性验证

    一.socketserver模块 1.sockeserver的源码流程 2.简单的使用 socketserver服务端 import socketserver class MyServer(socke ...

  6. presentation skills

    下面是从一个网站摘录下来的关于presentation skill需要回答的14个问题:网站的地址为:http://www.mindtools.com/pages/article/newCS_96.h ...

  7. 2018.10.30 uoj#273. 【清华集训2016】你的生命已如风中残烛(组合数学)

    传送门 组合数学妙题. 我们把这mmm个数都减去111. 然后出牌的地方就变成了−1-1−1. 然后发现求出每个位置的前缀和之后全部都是非负数. 考虑在最后加入一个−1-1−1构成一个m+1m+1m+ ...

  8. Interrouter Signals

    summary of traditional NoC interrouter signals summary of SMART interrouter signals flit_valid and f ...

  9. springboot aop+@interface实现日志记录

    一.基本概念 1.自定义注解 自定义注解我们必须了解四个元注解,什么是元注解?元注解指作用于注解之上的元数据或者元信息,简单通俗的讲,元注解就是注解的注解 . Documented与Inherited ...

  10. s4-3 CSMA

    载波侦听多路访问协议  CSMA:Carrier Sense Multiple Access 特点:"先听后发" 改进ALOHA协议的侦听/发送策略  分类 非持续式 持 ...