{"id":1662,"date":"2015-07-22T11:00:50","date_gmt":"2015-07-22T10:00:50","guid":{"rendered":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?p=1662"},"modified":"2015-07-28T08:42:57","modified_gmt":"2015-07-28T07:42:57","slug":"proyecto-oxford-api-vision","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/","title":{"rendered":"Proyecto Oxford: desglosando las API Visi\u00f3n"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/cine.batanga.com\/sites\/cine.batanga.com\/files\/imagecache\/completa\/the-vision-marvel_0.jpg\" alt=\"\" width=\"630\" height=\"420\" \/>Continuando con el post de la semana pasada, vamos a\u00a0seguir\u00a0comentando todas las posibilidades que tiene el proyecto Oxford para hacer m\u00e1s inteligente nuestras aplicaciones. Vamos a ver las<strong> caracter\u00edsticas de la API de Visi\u00f3n.<\/strong><\/p>\n<h2>\u00bfQu\u00e9 caracter\u00edsticas\u00a0tiene la API Visi\u00f3n?<\/h2>\n<p><span class=\"notranslate\">API Visi\u00f3n est\u00e1 <strong>formada por m\u00faltiples algoritmos<\/strong> para procesar im\u00e1genes y devolver la informaci\u00f3n de la misma. Por ejemplo, si la imagen contiene contenido no propio para menores y no debe de publicarse en nuestra aplicaci\u00f3n. Hay <strong>otras caracter\u00edsticas<\/strong> como el color dominante y la categor\u00eda de la imagen. Por ejemplo cuando nos suban en nuestro sistema una foto de cualquier tipo de comida categorizar esta foto como gastronom\u00eda. Otra de las posibilidades que trae esta API es la de <strong>actuar como OCR.<\/strong>\u00a0Es decir, lee el texto que hay en una imagen. Otra caracter\u00edstica que tiene es <strong>generar la imagen de miniatura<\/strong> (thumbmail) adecuada para la interfaz de pantalla donde se esta representando.\u00a0<\/span><!--more--><\/p>\n<h2>\u00bfC\u00f3mo empezar?<\/h2>\n<p>Igual que en\u00a0el anterior post (para la detecci\u00f3n de caras ten\u00edamos que instalar el servicio FACE API), ahora tendremos que <strong>instalarnos el servicio de Visi\u00f3n.<\/strong> Para ello Nuevo-&gt; Tienda y buscamos Visi\u00f3n nocturna<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/Captura.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-1667 size-full alignleft\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/Captura-e1437209043178.png\" alt=\"Captura\" width=\"600\" height=\"393\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Una vez tenemos el servicio incluido dentro de nuestra suscripci\u00f3n de Azure (el uso de esta API es de momento totalmente gratuito e ilimitado), <strong>obtenemos los Keys<\/strong> que necesitaremos para que funcione esta API dentro de nuestro desarrollo.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/keys.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-1669 alignleft\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/keys.png\" alt=\"keys\" width=\"600\" height=\"195\" \/><\/a><\/p>\n<h2>Analizando la imagen<\/h2>\n<p>En primer lugar nos vamos a crear una clase para que nos facilite el desarrollo y en la que encapsulemos los m\u00e9todos a la API Visi\u00f3n. En primer lugar, implementaremos un constructor donde se le pasar\u00e1 la Primera Key (valor que es necesario para poder utilizar la API).<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n public class VisionHelper\r\n    {\r\n        \/\/\/ &lt;summary&gt;\r\n        \/\/\/ The vision service client.\r\n        \/\/\/ &lt;\/summary&gt;\r\n        private readonly IVisionServiceClient visionClient;\r\n\r\n        \/\/\/ &lt;summary&gt;\r\n        \/\/\/ Initializes a new instance of the &lt;see cref=&quot;VisionHelper&quot;\/&gt; class.\r\n        \/\/\/ &lt;\/summary&gt;\r\n        \/\/\/ &lt;param name=&quot;subscriptionKey&quot;&gt;The subscription key.&lt;\/param&gt;\r\n        public VisionHelper(string subscriptionKey)\r\n        {\r\n            this.visionClient = new VisionServiceClient(subscriptionKey);\r\n        }\r\n}\r\n<\/pre>\n<p>El siguiente paso es dar una <strong>direcci\u00f3n<\/strong> (ya sea local o una direcci\u00f3n de internet) que se analice en la foto en cuesti\u00f3n. Para ello implementamos el siguiente m\u00e9todo:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n  \/\/\/ &lt;summary&gt;\r\n        \/\/\/ Analyze the given image.\r\n        \/\/\/ &lt;\/summary&gt;\r\n        \/\/\/ &lt;param name=&quot;imagePathOrUrl&quot;&gt;The image path or url.&lt;\/param&gt;\r\n        public void AnalyzeImage(string imagePathOrUrl)\r\n        {\r\n            this.ShowInfo(&quot;Analyzing&quot;);\r\n            AnalysisResult analysisResult = null;\r\n\r\n            string resultStr = string.Empty;\r\n            try\r\n            {\r\n                if (File.Exists(imagePathOrUrl))\r\n                {\r\n                    using (FileStream stream = File.Open(imagePathOrUrl, FileMode.Open))\r\n                    {\r\n                        analysisResult = this.visionClient.AnalyzeImageAsync(stream).Result;\r\n                    }\r\n                }\r\n                else if (Uri.IsWellFormedUriString(imagePathOrUrl, UriKind.Absolute))\r\n                {\r\n                    analysisResult = this.visionClient.AnalyzeImageAsync(imagePathOrUrl).Result;\r\n                }\r\n                else\r\n                {\r\n                    this.ShowError(&quot;Invalid image path or Url&quot;);\r\n                }\r\n            }\r\n            catch (ClientException e)\r\n            {\r\n                if (e.Error != null)\r\n                {\r\n                    this.ShowError(e.Error.Message);\r\n                }\r\n                else\r\n                {\r\n                    this.ShowError(e.Message);\r\n                }\r\n\r\n                return;\r\n            }\r\n            catch (Exception)\r\n            {\r\n                this.ShowError(&quot;Some error happened.&quot;);\r\n                return;\r\n            }\r\n            this.ShowAnalysisResult(analysisResult);\r\n        }\r\n<\/pre>\n<p>El siguiente paso es <strong>crear una aplicaci\u00f3n<\/strong> que instancie al objeto VisionHelper (con la key de nuestra API) y analicemos una imagen. Un ejemplo :<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n            string subscriptionKey = ConfigurationManager.AppSettings&#x5B;&quot;subscriptionKey&quot;];\r\n            if (string.IsNullOrWhiteSpace(subscriptionKey))\r\n            {\r\n                Console.ForegroundColor = ConsoleColor.DarkGreen;\r\n                Console.WriteLine(&quot;To play this sample, you should firstly get a subscription key and put it into the App.Config file.&quot;);\r\n                Console.WriteLine(&quot;If you don't have one, please access&quot;);\r\n                Console.WriteLine(&quot;http:\/\/www.projectoxford.ai\/doc\/general\/subscription-key-mgmt&quot;);\r\n                Console.ResetColor();\r\n                Console.WriteLine();\r\n                Console.WriteLine(&quot;Please enter any key......&quot;);\r\n                Console.ReadLine();\r\n                return;\r\n            }\r\n            var vision = new VisionHelper(subscriptionKey);\r\n           var  imagePathorUrl = GetValidImagePathorUrl();\r\n            vision.AnalyzeImage(imagePathorUrl);\r\n            Console.ReadLine();\r\n<\/pre>\n<p>Si introducimos la siguiente imagen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"http:\/\/a2.assets.nationalgeographic.es\/soc_photo\/10970.600x450.jpg\" alt=\"\" width=\"600\" height=\"450\" \/><\/p>\n<p>Los <strong>resultados<\/strong> son los siguientes:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/Resultados.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1690\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/Resultados.png\" alt=\"Resultados\" width=\"453\" height=\"384\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/Resultados.png 453w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/Resultados-300x254.png 300w\" sizes=\"auto, (max-width: 453px) 100vw, 453px\" \/><\/a><\/p>\n<p>Espectacular los resultados y toda la <strong>inteligencia<\/strong> que podemos hacer en nuestros desarrollos. Sin pensar mucho se me ocurre que cada vez que subamos una imagen a nuestro Gestor Documental preferido (SharePoint) se introduzca un metadato sobre a que categor\u00eda pertenece, de tal forma que posteriormente podamos <strong>buscar las im\u00e1genes seg\u00fan su categor\u00eda<\/strong>. Otro uso que se le podr\u00eda dar es, por ejemplo, para evitar subir contenido para adultos. En caso de que se intente subir una de estas im\u00e1genes, el sistema no lo suba.<\/p>\n<h2>Reconocer Texto (OCR)<\/h2>\n<p>Otra de las utilidades que hemos comentado que tiene la API es reconocer el texto que hay en una foto. La API <strong>detecta m\u00faltiples idiomas<\/strong> como: chino, alem\u00e1n, espa\u00f1ol, portugu\u00e9s, ruso, franc\u00e9s, etc. Para a\u00f1adir la funcionalidad de reconocer texto, agregaremos el siguiente m\u00e9todo a nuestro helper:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n    public void RecognizeText(string imagePathOrUrl, bool detectOrientation = true, string languageCode = LanguageCodes.AutoDetect)\r\n        {\r\n            this.ShowInfo(&quot;Recognizing&quot;);\r\n            OcrResults ocrResult = null;\r\n            string resultStr = string.Empty;\r\n\r\n            try\r\n            {\r\n                if (File.Exists(imagePathOrUrl))\r\n                {\r\n                    using (FileStream stream = File.Open(imagePathOrUrl, FileMode.Open))\r\n                    {\r\n                        ocrResult = this.visionClient.RecognizeTextAsync(stream, languageCode, detectOrientation).Result;\r\n                    }\r\n                }\r\n                else if (Uri.IsWellFormedUriString(imagePathOrUrl, UriKind.Absolute))\r\n                {\r\n                    ocrResult = this.visionClient.RecognizeTextAsync(imagePathOrUrl, languageCode, detectOrientation).Result;\r\n                }\r\n                else\r\n                {\r\n                    this.ShowError(&quot;Invalid image path or Url&quot;);\r\n                }\r\n            }\r\n            catch (ClientException e)\r\n            {\r\n                if (e.Error != null)\r\n                {\r\n                    this.ShowError(e.Error.Message);\r\n                }\r\n                else\r\n                {\r\n                    this.ShowError(e.Message);\r\n                }\r\n\r\n                return;\r\n            }\r\n            catch (Exception)\r\n            {\r\n                this.ShowError(&quot;Some error happened.&quot;);\r\n                return;\r\n            }\r\n            this.ShowRetrieveText(ocrResult);\r\n        }\r\n<\/pre>\n<p>A continuaci\u00f3n, creamos una nueva aplicaci\u00f3n e introducimos la misma aplicaci\u00f3n que en el anterior caso, pero modificamos el m\u00e9todo. En este caso, le vamos a llamar la Funci\u00f3n <strong>RecognizeText<\/strong>. Si a la aplicaci\u00f3n le introducimos una im\u00e1gen como la siguiente:<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.colins-it.co.uk\/blog\/wp-content\/uploads\/2012\/08\/keep-calm.jpg\" alt=\"\" width=\"208\" height=\"263\" \/><\/p>\n<p>El resultado que se obtiene es el siguiente:\u00a0<a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/RecognizeText.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1697\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/07\/RecognizeText.png\" alt=\"RecognizeText\" width=\"287\" height=\"235\" \/><\/a><\/p>\n<p>En este caso, no ha reconocido la totalidad del texto, pero es una de las ocasiones\u00a0en la que no funciona al 100\u20ac. Seg\u00fan las especificaciones, variar\u00e1. Por ejemplo si el tama\u00f1o es menor de 50&#215;50, es posible que no detecte el texto.<\/p>\n<h2>Creando im\u00e1genes en miniatura<\/h2>\n<p>Para finalizar con todas las posibilidades que tiene la API Visi\u00f3n vamos a ver lo <strong>simple que es poder generar im\u00e1genes m\u00e1s peque\u00f1as<\/strong>. \u00c9sta es una utilidad que en m\u00e1s de una ocasi\u00f3n hemos tenido que implementar. En muchas ocasiones dejamos que determinadas im\u00e1genes se publiquen en la Web sin darle importancia a\u00a0las medidas y dejando al usuario final la responsabilidad de que ponga una imagen que cumpla con los requisitos especificados. Adem\u00e1s, ahora hay multitud de dispositivos y resoluciones en los que se tiene que visualizar nuestra web. Lo m\u00e1s normal es que se vea bien en escritorio y no en un m\u00f3vil (y en el smartphone que se ve bien es porque tiene una resoluci\u00f3n enorme y tarda mucho en cargarla con 3\/4G). Para poder utilizarla, igual que en los anteriores ejemplos extendemos el Helper con el siguiente c\u00f3digo:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n public void GetThumbnail(string imagePathOrUrl, int width, int height, bool smartCropping, string resultFolder)\r\n        {\r\n            this.ShowInfo(&quot;Get Thumbnail&quot;);\r\n            byte&#x5B;] thumbnailResult = null;\r\n            string resultStr = string.Empty;\r\n            try\r\n            {\r\n                if (File.Exists(imagePathOrUrl))\r\n                {\r\n                    using (FileStream stream = File.Open(imagePathOrUrl, FileMode.Open))\r\n                    {\r\n                        thumbnailResult = this.visionClient.GetThumbnailAsync(stream, width, height, smartCropping).Result;\r\n                    }\r\n                }\r\n                else if (Uri.IsWellFormedUriString(imagePathOrUrl, UriKind.Absolute))\r\n                {\r\n                    thumbnailResult = this.visionClient.GetThumbnailAsync(imagePathOrUrl, width, height, smartCropping).Result;\r\n                }\r\n                else\r\n                {\r\n                    this.ShowError(&quot;Invalid image path or Url&quot;);\r\n                }\r\n            }\r\n            catch (ClientException e)\r\n            {\r\n                if (e.Error != null)\r\n                {\r\n                    this.ShowError(e.Error.Message);\r\n                }\r\n                else\r\n                {\r\n                    this.ShowError(e.Message);\r\n                }\r\n\r\n                return;\r\n            }\r\n            catch (Exception)\r\n            {\r\n                this.ShowError(&quot;Some error happened.&quot;);\r\n                return;\r\n            }\r\n            \/\/ Write the result to local file\r\n            string filePath = string.Format(&quot;{0}\\\\thumbnailResult_{1}.jpg&quot;, resultFolder, DateTime.UtcNow.Ticks.ToString());\r\n            using (BinaryWriter binaryWrite = new BinaryWriter(new FileStream(filePath, FileMode.Create, FileAccess.Write)))\r\n            {\r\n                binaryWrite.Write(thumbnailResult);\r\n            }\r\n            this.ShowResult(string.Format(&quot;The result file has been saved to {0}&quot;, Path.GetFullPath(filePath)));\r\n        }\r\n<\/pre>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Uno de los grandes beneficios que tiene el Cloud es poder utilizarlo en entornos que anteriormente eran muy costosos (tanto de implementar como econ\u00f3micamente). Esto hace posible que surjan herramientas como Machine Learning para tener herramientas que doten de inteligencia nuestros desarrollos. El proyecto Oxford es un claro ejemplo de ello.<\/p>\n<p>El c\u00f3digo de ejemplo lo pod\u00e9is descargar desde el siguiente repositorio de <a href=\"https:\/\/github.com\/AdrianDiaz81\/DemosBlog\" target=\"_blank\">GitHub<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>Continuando con el post de la semana pasada, vamos a\u00a0seguir\u00a0comentando todas las posibilidades que tiene el proyecto Oxford para hacer m\u00e1s inteligente nuestras aplicaciones. Vamos a ver las caracter\u00edsticas de la API de Visi\u00f3n. \u00bfQu\u00e9 caracter\u00edsticas\u00a0tiene la API Visi\u00f3n? API &hellip; <a href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[119],"tags":[],"class_list":["post-1662","post","type-post","status-publish","format-standard","hentry","category-azure-2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Proyecto Oxford: desglosando las API Visi\u00f3n - Desarrollando sobre SharePoint<\/title>\n<meta name=\"description\" content=\"En este post continuamos analizando todas las posibilidades que tiene el proyecto Oxford desgranando la API Vision y como podemos utilizarlo.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Proyecto Oxford: desglosando las API Visi\u00f3n - Desarrollando sobre SharePoint\" \/>\n<meta name=\"twitter:description\" content=\"En este post continuamos analizando todas las posibilidades que tiene el proyecto Oxford desgranando la API Vision y como podemos utilizarlo.\" \/>\n<meta name=\"twitter:image\" content=\"http:\/\/cine.batanga.com\/sites\/cine.batanga.com\/files\/imagecache\/completa\/the-vision-marvel_0.jpg\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adri\u00e1n D\u00edaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/#article\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/\"},\"author\":{\"name\":\"Adri\u00e1n D\u00edaz\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"headline\":\"Proyecto Oxford: desglosando las API Visi\u00f3n\",\"datePublished\":\"2015-07-22T10:00:50+00:00\",\"dateModified\":\"2015-07-28T07:42:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/\"},\"wordCount\":1392,\"commentCount\":0,\"image\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/cine.batanga.com\\\/sites\\\/cine.batanga.com\\\/files\\\/imagecache\\\/completa\\\/the-vision-marvel_0.jpg\",\"articleSection\":[\"Azure\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/\",\"url\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/\",\"name\":\"Proyecto Oxford: desglosando las API Visi\u00f3n - Desarrollando sobre SharePoint\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/cine.batanga.com\\\/sites\\\/cine.batanga.com\\\/files\\\/imagecache\\\/completa\\\/the-vision-marvel_0.jpg\",\"datePublished\":\"2015-07-22T10:00:50+00:00\",\"dateModified\":\"2015-07-28T07:42:57+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"description\":\"En este post continuamos analizando todas las posibilidades que tiene el proyecto Oxford desgranando la API Vision y como podemos utilizarlo.\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/proyecto-oxford-api-vision\\\/#primaryimage\",\"url\":\"http:\\\/\\\/cine.batanga.com\\\/sites\\\/cine.batanga.com\\\/files\\\/imagecache\\\/completa\\\/the-vision-marvel_0.jpg\",\"contentUrl\":\"http:\\\/\\\/cine.batanga.com\\\/sites\\\/cine.batanga.com\\\/files\\\/imagecache\\\/completa\\\/the-vision-marvel_0.jpg\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/\",\"name\":\"Desarrollando sobre SharePoint\",\"description\":\"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\",\"name\":\"Adri\u00e1n D\u00edaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"caption\":\"Adri\u00e1n D\u00edaz\"},\"description\":\"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/author\\\/desarrollandosobresharepoint\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Proyecto Oxford: desglosando las API Visi\u00f3n - Desarrollando sobre SharePoint","description":"En este post continuamos analizando todas las posibilidades que tiene el proyecto Oxford desgranando la API Vision y como podemos utilizarlo.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/","twitter_card":"summary_large_image","twitter_title":"Proyecto Oxford: desglosando las API Visi\u00f3n - Desarrollando sobre SharePoint","twitter_description":"En este post continuamos analizando todas las posibilidades que tiene el proyecto Oxford desgranando la API Vision y como podemos utilizarlo.","twitter_image":"http:\/\/cine.batanga.com\/sites\/cine.batanga.com\/files\/imagecache\/completa\/the-vision-marvel_0.jpg","twitter_misc":{"Escrito por":"Adri\u00e1n D\u00edaz","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/#article","isPartOf":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/"},"author":{"name":"Adri\u00e1n D\u00edaz","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"headline":"Proyecto Oxford: desglosando las API Visi\u00f3n","datePublished":"2015-07-22T10:00:50+00:00","dateModified":"2015-07-28T07:42:57+00:00","mainEntityOfPage":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/"},"wordCount":1392,"commentCount":0,"image":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/#primaryimage"},"thumbnailUrl":"http:\/\/cine.batanga.com\/sites\/cine.batanga.com\/files\/imagecache\/completa\/the-vision-marvel_0.jpg","articleSection":["Azure"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/#respond"]}]},{"@type":"WebPage","@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/","url":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/","name":"Proyecto Oxford: desglosando las API Visi\u00f3n - Desarrollando sobre SharePoint","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website"},"primaryImageOfPage":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/#primaryimage"},"image":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/#primaryimage"},"thumbnailUrl":"http:\/\/cine.batanga.com\/sites\/cine.batanga.com\/files\/imagecache\/completa\/the-vision-marvel_0.jpg","datePublished":"2015-07-22T10:00:50+00:00","dateModified":"2015-07-28T07:42:57+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"description":"En este post continuamos analizando todas las posibilidades que tiene el proyecto Oxford desgranando la API Vision y como podemos utilizarlo.","inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/proyecto-oxford-api-vision\/#primaryimage","url":"http:\/\/cine.batanga.com\/sites\/cine.batanga.com\/files\/imagecache\/completa\/the-vision-marvel_0.jpg","contentUrl":"http:\/\/cine.batanga.com\/sites\/cine.batanga.com\/files\/imagecache\/completa\/the-vision-marvel_0.jpg"},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/","name":"Desarrollando sobre SharePoint","description":"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb","name":"Adri\u00e1n D\u00edaz","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","caption":"Adri\u00e1n D\u00edaz"},"description":"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/author\/desarrollandosobresharepoint\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/1662","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/comments?post=1662"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/1662\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/media?parent=1662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/categories?post=1662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/tags?post=1662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}