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 VisionRects 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.
Exiba a origem do exemplo para o método CoreGraphics exato.
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
O exemplo VisionFaces 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 tratamento de erros e exibe os limites das faces detectadas, e chama o HandleRectangles
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.
Exiba a origem do exemplo para o método CoreGraphics exato.
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
.