Xamarin.iOS 中的視覺架構

視覺架構會將許多新的圖像處理功能新增至 iOS 11,包括:

  • 矩形偵測
  • 臉部偵測
  • 機器學習 影像分析 (CoreML討論)
  • 條碼偵測
  • 影像對齊分析
  • 文字偵測
  • 地平線偵測
  • 物件偵測和追蹤

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

以下將更詳細地討論矩形偵測和臉部偵測。

矩形偵測

VisionRects 範例會示範如何處理影像,並繪製其上偵測到的矩形。

1.初始化視覺要求

在 中 ViewDidLoad,建立 VNDetectRectanglesRequest ,參考 HandleRectangles 將在每個要求結尾呼叫的方法:

MaximumObservations屬性也應該設定,否則它會預設為1,而且只會傳回單一結果。

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

2.啟動視覺處理

下列程式代碼會開始處理要求。 在 VisionRects 範例中,此程式代碼會在使用者選取影像之後執行:

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

此處理程式會將 傳遞 ciImage 至步驟 1 中建立的視覺架構 VNDetectRectanglesRequest

3.處理視覺處理的結果

矩形偵測完成後,架構會 HandleRectangles 執行 方法,其摘要如下所示:

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.顯示結果

OverlayRectangles VisionRectangles 範例中的 方法有三個函式:

  • 轉譯來源影像,
  • 繪製矩形以指出偵測到每個矩形的位置,以及
  • 使用 CoreGraphics 為每個矩形新增文字標籤。

檢視 確切 CoreGraphics 方法的範例來源

Photograph with three rectangles detected on a mobile device.

5. 進一步處理

矩形偵測通常是作業鏈結中的第一個步驟,例如使用此 CoreMLVision 範例,其中矩形會傳遞至 CoreML 模型來剖析手寫數位。

臉部偵測

VisionFaces 範例的運作方式與 VisionRectangles 範例類似,使用不同的視覺要求類別。

1.初始化視覺要求

在 中 ViewDidLoad,建立 VNDetectFaceRectanglesRequest ,參考 HandleRectangles 將在每個要求結尾呼叫的方法。

FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);

2.啟動視覺處理

下列程式代碼會開始處理要求。 在 VisionFaces 範例中,此程式代碼會在使用者選取影像之後執行:

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

此處理程式會將 傳遞 ciImage 至步驟 1 中建立的視覺架構 VNDetectFaceRectanglesRequest

3.處理視覺處理的結果

臉部偵測完成後,處理程式會 HandleRectangles 執行方法,以執行錯誤處理並顯示偵測到臉部的界限,並呼叫 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.顯示結果

OverlayRectangles VisionFaces 範例中的 方法有三個函式:

  • 轉譯來源影像,
  • 針對偵測到的每個臉部繪製矩形,以及
  • 使用 CoreGraphics 為每個臉部新增文字標籤。

檢視 確切 CoreGraphics 方法的範例來源

Photograph with two faces detected on a mobile device.

5. 進一步處理

視覺架構包含偵測臉部特徵的其他功能,例如眼睛和嘴。 VNDetectFaceLandmarksRequest使用 類型,其會傳回VNFaceObservation如上述步驟 3 中的結果,但具有其他VNFaceLandmark數據。