Skip to content

Instantly share code, notes, and snippets.

@icebeam7
Last active December 14, 2020 11:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save icebeam7/b9bb2b2822d944fb1ca9dde029612e94 to your computer and use it in GitHub Desktop.
Save icebeam7/b9bb2b2822d944fb1ca9dde029612e94 to your computer and use it in GitHub Desktop.
// 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