Xamarin.iOS'ta Vision Framework

Görüntü İşleme çerçevesi, iOS 11'e aşağıdakiler de dahil olmak üzere bir dizi yeni görüntü işleme özelliği ekler:

  • Dikdörtgen Algılama
  • Yüz Algılama
  • Makine Öğrenmesi Görüntü Analizi (CoreML'de ele alınmalıdır)
  • Barkod Algılama
  • Görüntü Hizalama Analizi
  • Metin Algılama
  • Ufuk Algılama
  • Nesne Algılama ve İzleme

Photograph with three rectangles detected.Photograph with two faces detected.

Dikdörtgen Algılama ve Yüz Algılama aşağıda daha ayrıntılı olarak açıklandı.

Dikdörtgen Algılama

VisionRects örneği, bir görüntünün nasıl işlenip algılanan dikdörtgenlerin üzerine çizilmeyi gösterir.

1. Görüntü İşleme isteğini başlatma

içindeViewDidLoad, her isteğin HandleRectangles sonunda çağrılacak yöntemine başvuran bir VNDetectRectanglesRequest oluşturun:

MaximumObservations Özelliği de ayarlanmalıdır, aksi takdirde varsayılan olarak 1 olur ve yalnızca tek bir sonuç döndürülür.

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

2. Görüntü İşleme'yi başlatın

Aşağıdaki kod isteği işlemeye başlar. VisionRects örneğinde bu kod, kullanıcı bir görüntü seçtikten sonra çalışır:

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

Bu işleyici, 1. adımda oluşturulan Görüntü İşleme çerçevesine VNDetectRectanglesRequest iletirciImage.

3. Görüntü işlemenin sonuçlarını işleme

Dikdörtgen algılama tamamlandıktan sonra çerçeve yöntemini yürütür HandleRectangles ve bunun özeti aşağıda gösterilmiştir:

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. Sonuçları görüntüleme

OverlayRectangles VisionRectangles örneğindeki yöntemin üç işlevi vardır:

  • Kaynak görüntüyü işleme,
  • Her birinin nerede algılandığını belirtmek için bir dikdörtgen çizme ve
  • CoreGraphics kullanarak her dikdörtgen için bir metin etiketi ekleme.

Tam CoreGraphics yöntemi için örneğin kaynağını görüntüleyin.

Photograph with three rectangles detected on a mobile device.

5. Daha fazla işlem

Dikdörtgen algılama, genellikle bu CoreMLVision örneğinde olduğu gibi, el yazısı basamakları ayrıştırmak için dikdörtgenlerin CoreML modeline geçirildiği bir işlem zincirinin yalnızca ilk adımıdır.

Yüz Algılama

VisionFaces örneği, farklı bir Vision istek sınıfı kullanarak VisionRectangles örneğine benzer şekilde çalışır.

1. Görüntü İşleme isteğini başlatma

içindeViewDidLoad, her isteğin HandleRectangles sonunda çağrılacak yöntemine başvuran bir VNDetectFaceRectanglesRequest oluşturun.

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2. Görüntü İşleme'yi başlatın

Aşağıdaki kod isteği işlemeye başlar. VisionFaces örneğinde bu kod, kullanıcı bir görüntü seçtikten sonra çalışır:

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

Bu işleyici, 1. adımda oluşturulan Görüntü İşleme çerçevesine VNDetectFaceRectanglesRequest iletirciImage.

3. Görüntü işlemenin sonuçlarını işleme

Yüz algılama tamamlandıktan sonra işleyici, hata işleme gerçekleştiren yöntemini yürütür HandleRectangles ve algılanan yüzlerin sınırlarını görüntüler ve özgün resme sınırlayıcı dikdörtgenler çizmek için öğesini çağırır OverlayRectangles :

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. Sonuçları görüntüleme

OverlayRectangles VisionFaces örneğindeki yöntemin üç işlevi vardır:

  • Kaynak görüntüyü işleme,
  • Algılanan her yüz için bir dikdörtgen çizme ve
  • CoreGraphics kullanarak her yüz için bir metin etiketi ekleme.

Tam CoreGraphics yöntemi için örneğin kaynağını görüntüleyin.

Photograph with two faces detected on a mobile device.

5. Daha fazla işlem

Görüntü İşleme çerçevesi, gözler ve ağız gibi yüz özelliklerini algılamak için ek özellikler içerir. VNDetectFaceLandmarksRequest Yukarıdaki 3. adımda olduğu gibi ancak ek VNFaceLandmark verilerle sonuç döndürecek VNFaceObservation türü kullanın.