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áří
  • Machine Učení Image Analysis (probíraná v CoreML)
  • Detekce čárových kódů
  • Analýza zarovnání obrázku
  • Detekce textu
  • Detekce horizontů
  • Detekce a sledování objektů

Fotografie se třemi zjištěnými obdélníkyFotografie se dvěma rozpoznanými tvářemi

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 ViewDidLoadaplikaci 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

Fotografie se třemi obdélníky zjištěnými na mobilním zařízení

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 ViewDidLoadaplikaci 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

Fotografie se dvěma tvářemi zjištěnými na mobilním zařízení

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.