Vision Framework in Xamarin.iOS
Il framework Vision aggiunge una serie di nuove funzionalità di elaborazione delle immagini a iOS 11, tra cui:
- Rilevamento rettangolo
- Rilevamento viso
- Analisi delle immagini di Machine Learning (descritta in CoreML)
- Rilevamento codice a barre
- Analisi dell'allineamento delle immagini
- Rilevamento testo
- Rilevamento dell'orizzonte
- Rilevamento oggetti e rilevamento
Il rilevamento dei rettangoli e il rilevamento dei volti sono descritti in modo più dettagliato di seguito.
Rilevamento rettangolo
L'esempio mostra come elaborare un'immagine e disegnare i rettangoli rilevati.
1. Inizializzare la richiesta di visione
In ViewDidLoad
creare un oggetto VNDetectRectanglesRequest
che fa riferimento al HandleRectangles
metodo che verrà chiamato alla fine di ogni richiesta:
La proprietà deve essere impostata anche. In MaximumObservations
caso contrario, per impostazione predefinita verrà restituito 1 e verrà restituito un solo risultato.
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;
2. Avviare l'elaborazione della visione
Il codice seguente avvia l'elaborazione della richiesta. Nell'esempio VisionRects questo codice viene eseguito dopo che l'utente ha selezionato un'immagine:
// 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);
});
Questo gestore passa l'oggetto ciImage
al framework VNDetectRectanglesRequest
vision creato nel passaggio 1.
3. Gestire i risultati dell'elaborazione della visione
Al termine del rilevamento del rettangolo, il framework esegue il HandleRectangles
metodo , un riepilogo del quale è illustrato di seguito:
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. Visualizzare i risultati
Il OverlayRectangles
metodo nell'esempio VisionRectangles ha tre funzioni:
- Rendering dell'immagine di origine,
- Disegno di un rettangolo per indicare dove è stato rilevato ogni rettangolo e
- Aggiunta di un'etichetta di testo per ogni rettangolo tramite CoreGraphics.
5. Ulteriore elaborazione
Il rilevamento del rettangolo è spesso solo il primo passaggio di una catena di operazioni, ad esempio con questo esempio CoreMLVision, in cui i rettangoli vengono passati a un modello CoreML per analizzare le cifre scritte a mano.
Rilevamento viso
Questo esempio funziona in modo simile all'esempio VisionRectangles , usando una classe di richiesta Visione diversa.
1. Inizializzare la richiesta di visione
In ViewDidLoad
creare un oggetto VNDetectFaceRectanglesRequest
che fa riferimento al HandleRectangles
metodo che verrà chiamato alla fine di ogni richiesta.
FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);
2. Avviare l'elaborazione della visione
Il codice seguente avvia l'elaborazione della richiesta. Nell'esempio VisionFaces questo codice viene eseguito dopo che l'utente ha selezionato un'immagine:
// 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);
});
Questo gestore passa l'oggetto ciImage
al framework VNDetectFaceRectanglesRequest
vision creato nel passaggio 1.
3. Gestire i risultati dell'elaborazione della visione
Al termine del rilevamento del viso, il gestore esegue il metodo che esegue la HandleRectangles
gestione degli errori e visualizza i limiti dei visi rilevati e chiama per OverlayRectangles
disegnare rettangoli di delimitazione sull'immagine originale:
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. Visualizzare i risultati
Il OverlayRectangles
metodo nell'esempio VisionFaces ha tre funzioni:
- Rendering dell'immagine di origine,
- Disegno di un rettangolo per ogni viso rilevato e
- Aggiunta di un'etichetta di testo per ogni viso tramite CoreGraphics.
5. Ulteriore elaborazione
Il framework vision include funzionalità aggiuntive per rilevare le caratteristiche del viso, ad esempio gli occhi e la bocca. Usare il VNDetectFaceLandmarksRequest
tipo , che restituirà VNFaceObservation
i risultati come nel passaggio 3 precedente, ma con dati aggiuntivi VNFaceLandmark
.