// 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