Vision Framework v Xamarin.iOS
Architektura Vision přidává do iOS 11 řadu nových funkcí pro zpracování obrázků, mezi které patří:
- Detekce obdélníků
- Detekce tváří
- Analýza obrázků ve službě Machine Learning (probíraná v CoreML)
- Detekce čárových kódů
- Analýza zarovnání obrázku
- Detekce textu
- Detekce horizontů
- Detekce a sledování objektů
Detekce obdélníků a detekce tváří jsou podrobněji popsány níže.
Detekce obdélníků
Ukázka ukazuje, jak zpracovat obrázek a nakreslit zjištěné obdélníky.
1. Inicializace žádosti o zpracování obrazu
V ViewDidLoad
aplikaci vytvořte odkaz na VNDetectRectanglesRequest
metodu HandleRectangles
, která bude volána na konci každého požadavku:
Vlastnost MaximumObservations
by také měla být nastavena, jinak bude nastavena na hodnotu 1 a vrátí se pouze jeden výsledek.
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;
2. Zahájení zpracování obrazu
Následující kód zahájí zpracování požadavku. V ukázce VisionRects se tento kód spustí po výběru obrázku uživatelem:
// 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);
});
Tato obslužná rutina předá ciImage
architekturu VNDetectRectanglesRequest
Vision vytvořenou v kroku 1.
3. Zpracování výsledků zpracování obrazu
Jakmile je detekce obdélníku dokončena, architektura spustí metodu HandleRectangles
, což je souhrn, který je znázorněn níže:
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. Zobrazení výsledků
Metoda OverlayRectangles
v ukázce VisionRectangles má tři funkce:
- Vykreslení zdrojového obrázku
- Nakreslení obdélníku, který označuje, kde byly zjištěny jednotlivé
- Přidání textového popisku pro každý obdélník pomocí CoreGraphics
5. Další zpracování
Detekce obdélníků je často jen prvním krokem v řetězu operací, například v tomto příkladu CoreMLVision, kde se obdélníky předávají modelu CoreML za účelem analýzy ručně psaných číslic.
Detekce obličeje
Tato ukázka funguje podobně jako ukázka VisionRectangles s použitím jiné třídy žádosti Vision.
1. Inicializace žádosti o zpracování obrazu
V ViewDidLoad
aplikaci vytvořte odkaz VNDetectFaceRectanglesRequest
na metodu HandleRectangles
, která bude volána na konci každého požadavku.
FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);
2. Zahájení zpracování obrazu
Následující kód zahájí zpracování požadavku. V ukázce VisionFaces se tento kód spustí po výběru obrázku uživatelem:
// 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);
});
Tato obslužná rutina předá ciImage
architekturu VNDetectFaceRectanglesRequest
Vision vytvořenou v kroku 1.
3. Zpracování výsledků zpracování obrazu
Po dokončení detekce tváře obslužná rutina spustí metodu HandleRectangles
, která provádí zpracování chyb a zobrazuje hranice rozpoznaných tváří a volá OverlayRectangles
k vykreslení ohraničující obdélníky na původním obrázku:
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. Zobrazení výsledků
Metoda OverlayRectangles
v ukázce VisionFaces má tři funkce:
- Vykreslení zdrojového obrázku
- Nakreslení obdélníku pro každou rozpoznanou tvář a
- Přidání textového popisku pro každou tvář pomocí CoreGraphics
5. Další zpracování
Architektura vision obsahuje další funkce pro detekci obličejových funkcí, jako jsou oči a ústa. VNDetectFaceLandmarksRequest
Použijte typ, který vrátí VNFaceObservation
výsledky jako v kroku 3 výše, ale s dalšími VNFaceLandmark
daty.