Udostępnij za pośrednictwem


Struktura przetwarzania obrazów na platformie Xamarin.iOS

Struktura przetwarzania obrazów dodaje szereg nowych funkcji przetwarzania obrazów do systemu iOS 11, w tym:

Zdjęcie z wykrytymi trzema prostokątami. Zdjęcie z wykrytymi dwiema twarzami.

Wykrywanie prostokątów i wykrywanie twarzy zostały omówione bardziej szczegółowo poniżej.

Wykrywanie prostokąta

W przykładzie pokazano, jak przetworzyć obraz i narysować wykryte prostokąty.

1. Inicjowanie żądania przetwarzania obrazów

W ViewDidLoadpliku utwórz element VNDetectRectanglesRequest odwołujący się do HandleRectangles metody, która zostanie wywołana na końcu każdego żądania:

Właściwość powinna być również ustawiona MaximumObservations , w przeciwnym razie wartość domyślna to 1 i zostanie zwrócony tylko jeden wynik.

RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;

2. Rozpoczęcie przetwarzania obrazów

Poniższy kod rozpoczyna przetwarzanie żądania. W przykładzie visionRects ten kod jest uruchamiany po wybraniu obrazu przez użytkownika:

// 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);
});

Ta procedura obsługi przekazuje ciImage element do struktury VNDetectRectanglesRequest Vision utworzonej w kroku 1.

3. Obsługa wyników przetwarzania obrazów

Po zakończeniu wykrywania prostokąta platforma wykonuje metodę HandleRectangles , a podsumowanie pokazane poniżej:

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. Wyświetlanie wyników

Metoda OverlayRectangles w przykładzie VisionRectangles ma trzy funkcje:

  • Renderowanie obrazu źródłowego,
  • Rysowanie prostokąta wskazującego, gdzie wykryto każdą z nich, i
  • Dodawanie etykiety tekstowej dla każdego prostokąta przy użyciu biblioteki CoreGraphics.

Fotografia z trzema prostokątami wykrytymi na urządzeniu przenośnym.

5. Dalsze przetwarzanie

Wykrywanie prostokąta jest często tylko pierwszym krokiem w łańcuchu operacji, na przykład w tym przykładzie CoreMLVision, gdzie prostokąty są przekazywane do modelu CoreML w celu analizowania cyfr odręcznych.

Wykrywanie twarzy

Ten przykład działa w podobny sposób do przykładu VisionRectangles przy użyciu innej klasy żądania przetwarzania obrazów.

1. Inicjowanie żądania przetwarzania obrazów

W ViewDidLoadpliku utwórz element VNDetectFaceRectanglesRequest odwołujący HandleRectangles się do metody, która zostanie wywołana na końcu każdego żądania.

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2. Rozpoczęcie przetwarzania obrazów

Poniższy kod rozpoczyna przetwarzanie żądania. W przykładzie visionFaces ten kod jest uruchamiany po wybraniu obrazu przez użytkownika:

// 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);
});

Ta procedura obsługi przekazuje ciImage element do struktury VNDetectFaceRectanglesRequest Vision utworzonej w kroku 1.

3. Obsługa wyników przetwarzania obrazów

Po zakończeniu wykrywania twarzy program obsługi wykonuje metodę, która wykonuje HandleRectangles obsługę błędów i wyświetla granice wykrytych twarzy, a następnie wywołuje OverlayRectangles metodę , aby narysować prostokąty ograniczenia na oryginalnym obrazie:

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. Wyświetlanie wyników

Metoda OverlayRectangles w przykładzie VisionFaces ma trzy funkcje:

  • Renderowanie obrazu źródłowego,
  • Rysowanie prostokąta dla każdej wykrytej twarzy i
  • Dodawanie etykiety tekstowej dla każdej twarzy przy użyciu biblioteki CoreGraphics.

Fotografia z dwoma twarzami wykrytymi na urządzeniu przenośnym.

5. Dalsze przetwarzanie

Struktura vision zawiera dodatkowe możliwości wykrywania cech twarzy, takich jak oczy i usta. VNDetectFaceLandmarksRequest Użyj typu , który zwróci VNFaceObservation wyniki w kroku 3 powyżej, ale z dodatkowymi VNFaceLandmark danymi.