-
-
Save icebeam7/b9bb2b2822d944fb1ca9dde029612e94 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Se requiere un paquete Nuget adicional | |
#r "Newtonsoft.Json" | |
#r "Microsoft.WindowsAzure.Storage" | |
// Espacios de nombre requeridos | |
using System; | |
using System.IO; | |
using System.Net; | |
using System.Linq; | |
using System.Net.Http; | |
using System.Threading.Tasks; | |
using System.Net.Http.Headers; | |
using Microsoft.WindowsAzure.Storage.Table; | |
using Newtonsoft.Json; | |
// Caption, Description y ResultadoVision modelan el resultado obtenido | |
// al analizar la imagen por el Servicio Cognitivo | |
public class Caption | |
{ | |
public string Text { get; set; } | |
public double Confidence { get; set; } | |
} | |
public class Description | |
{ | |
public List<string> Tags { get; set; } | |
public List<Caption> Captions { get; set; } | |
} | |
public class ResultadoVision | |
{ | |
public Description Description { get; set; } | |
} | |
// La clase Analisis es la tabla que almacena los resultados del análisis | |
public class Analisis : TableEntity | |
{ | |
public string Nombre { get; set; } | |
public string Descripcion { get; set; } | |
public string Tags { get; set; } | |
} | |
// myBlob es la imagen que llega al contenedor imagenes en la cuenta de almacenamiento | |
// name es el nombre de la imagen (archivo) | |
// outputTable es la tabla analisis de la cuenta de almacenamiento para guardar la info | |
public static async Task Run(Stream myBlob, string name, CloudTable outputTable, ILogger log) | |
{ | |
// Datos del recurso de Servicio Cognitivo | |
string llave = "REEMPLAZA-TU-LLAVE-AQUI"; | |
string endpoint = "https://REEMPLAZA-TU-ENDPOINT-AQUI.cognitiveservices.azure.com/"; | |
string url = endpoint + "vision/v3.1/describe"; | |
// Datos de la cuenta de almacenamiento (blobs) | |
string rutaBlobStorage = "https://ictalkstoragelb01.blob.core.windows.net/imagenes/"; | |
// El resultado del analisis por el Servicio Cognitivo | |
ResultadoVision vision = new ResultadoVision(); | |
bool visionExitosa = false; | |
// La imagen a analizar se copia a un MemoryStream | |
using (MemoryStream ms = new MemoryStream()) | |
{ | |
myBlob.Position = 0; | |
myBlob.CopyTo(ms); | |
ms.Position = 0; | |
// Se prepara una petición Http al endpoint del Servicio Cognitivo | |
using (HttpClient cliente = new HttpClient()) | |
{ | |
// La llave (permiso) para comunicarse con el servicio | |
cliente.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", llave); | |
// Se prepara un StreamContent con la imagen a analizar | |
StreamContent contenido = new StreamContent(ms); | |
contenido.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); | |
// Se envía la petición Post para analizar la imagen | |
HttpResponseMessage respuesta = await cliente.PostAsync(url, contenido); | |
// Se revisa si hay respuesta exitosa por parte del servicio | |
if (respuesta.IsSuccessStatusCode) | |
{ | |
// Se crea un objeto ResultadoVision a partir de la respuesta JSON del servicio | |
string json = await respuesta.Content.ReadAsStringAsync(); | |
vision = JsonConvert.DeserializeObject<ResultadoVision>(json); | |
visionExitosa = true; | |
} | |
} | |
} | |
// Si hay resultado | |
if (visionExitosa) | |
{ | |
// Obtenemos la primer descripción y los tags devueltos por el servicio cognitivo | |
Caption caption = vision.Description.Captions.FirstOrDefault(); | |
List<string> tags = vision.Description.Tags; | |
// Creamos una instancia de Analisis | |
Analisis analisis = new Analisis() | |
{ | |
PartitionKey = name, | |
RowKey = "1", | |
Nombre = rutaBlobStorage + name, | |
Descripcion = (caption != null) ? caption.Text : string.Empty, | |
Tags = (tags.Count > 0) ? string.Join(",", tags) : string.Empty | |
}; | |
// Insertamos la instancia en la tabla | |
TableOperation operacion = TableOperation.Insert(analisis); | |
await outputTable.ExecuteAsync(operacion); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment