Estrutura de visão no Xamarin.iOS
A estrutura Vision adiciona uma série de novos recursos de processamento de imagem ao iOS 11, incluindo:
- Detecção de retângulos
- Detecção de Rosto
- Análise de Imagem de Aprendizado de Máquina (discutida em CoreML)
- Detecção de código de barras
- Análise de alinhamento de imagem
- Detecção de Texto
- Detecção de Horizonte
- Detecção de objetos e rastreamento
A Detecção de Retângulos e a Detecção de Rosto são discutidas em mais detalhes abaixo.
Detecção de retângulos
O exemplo mostra como processar uma imagem e desenhar os retângulos detectados nela.
1. Inicialize a solicitação de Visão
No ViewDidLoad
, crie um VNDetectRectanglesRequest
que faça referência ao HandleRectangles
método que será chamado no final de cada solicitação:
A MaximumObservations
propriedade também deve ser definida, caso contrário, o padrão será 1 e apenas um único resultado será retornado.
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;
2. Inicie o processamento da Visão
O código a seguir inicia o processamento da solicitação. No exemplo VisionRects, esse código é executado depois que o usuário seleciona uma imagem:
// Run the rectangle detector
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
handler.Perform(new VNRequest[] {RectangleRequest}, out NSError error);
});
Esse manipulador passa o ciImage
para a estrutura VNDetectRectanglesRequest
Vision que foi criada na etapa 1.
3. Lidar com os resultados do processamento da visão
Uma vez que a detecção do retângulo esteja completa, a estrutura executa o HandleRectangles
método, cujo resumo é mostrado abaixo:
private void HandleRectangles(VNRequest request, NSError error){
var observations = request.GetResults<VNRectangleObservation>();
// ... omitted error handling ...
bool atLeastOneValid = false;
foreach (var o in observations){
if (InputImage.Extent.Contains(boundingBox)) {
atLeastOneValid |= true;
}
}
if (!atLeastOneValid) return;
// Show the pre-processed image
DispatchQueue.MainQueue.DispatchAsync(() =>
{
ClassificationLabel.Text = summary;
ImageView.Image = OverlayRectangles(RawImage, imageSize, observations);
});
}
4. Exibir os resultados
O OverlayRectangles
método no exemplo VisionRectangles tem três funções:
- Renderizando a imagem de origem,
- Desenhar um retângulo para indicar onde cada um foi detectado, e
- Adicionando um rótulo de texto para cada retângulo usando CoreGraphics.
5. Processamento posterior
A detecção de retângulos geralmente é apenas a primeira etapa de uma cadeia de operações, como neste exemplo de CoreMLVision, em que os retângulos são passados para um modelo CoreML para analisar dígitos manuscritos.
Detecção Facial
Este exemplo funciona de maneira semelhante ao exemplo VisionRectangles , usando uma classe de solicitação Vision diferente.
1. Inicialize a solicitação de Visão
No ViewDidLoad
, crie um VNDetectFaceRectanglesRequest
que faça referência ao HandleRectangles
método que será chamado no final de cada solicitação.
FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);
2. Inicie o processamento da Visão
O código a seguir inicia o processamento da solicitação. No exemplo do VisionFaces, esse código é executado depois que o usuário seleciona uma imagem:
// Run the face detector
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
handler.Perform(new VNRequest[] {FaceRectangleRequest}, out NSError error);
});
Esse manipulador passa o ciImage
para a estrutura VNDetectFaceRectanglesRequest
Vision que foi criada na etapa 1.
3. Lidar com os resultados do processamento da visão
Quando a detecção de faces estiver concluída, o manipulador executa o método que executa o HandleRectangles
tratamento de erros e exibe os limites das faces detectadas, e chama o OverlayRectangles
para desenhar retângulos delimitadores na imagem original:
private void HandleRectangles(VNRequest request, NSError error){
var observations = request.GetResults<VNFaceObservation>();
// ... omitted error handling...
var summary = "";
var imageSize = InputImage.Extent.Size;
bool atLeastOneValid = false;
Console.WriteLine("Faces:");
summary += "Faces:";
foreach (var o in observations) {
// Verify detected rectangle is valid. omitted
var boundingBox = o.BoundingBox.Scaled(imageSize);
if (InputImage.Extent.Contains(boundingBox)) {
atLeastOneValid |= true;
}
}
// Show the pre-processed image (on UI thread)
DispatchQueue.MainQueue.DispatchAsync(() =>
{
ClassificationLabel.Text = summary;
ImageView.Image = OverlayRectangles(RawImage, imageSize, observations);
});
}
4. Exibir os resultados
O OverlayRectangles
método no exemplo VisionFaces tem três funções:
- Renderizando a imagem de origem,
- Desenhar um retângulo para cada face detectada, e
- Adicionar um rótulo de texto para cada face usando CoreGraphics.
5. Processamento posterior
A estrutura Vision inclui recursos adicionais para detectar características faciais, como olhos e boca. Use o VNDetectFaceLandmarksRequest
tipo, que retornará VNFaceObservation
resultados como na etapa 3 acima, mas com dados adicionais VNFaceLandmark
.