Xamarin.iOS 中的视觉框架

视觉框架向 iOS 11 添加了许多新的图像处理功能,包括:

  • 矩形检测
  • 人脸检测
  • 机器学习图像分析(在 CoreML 中讨论)
  • 条形码检测
  • 图像对齐分析
  • 文本检测
  • 地平线检测
  • 对象检测和跟踪

检测到三个矩形的照片。 检测到两张人脸的照片。

下文更详细地讨论了矩形检测和人脸检测。

矩形检测

该示例演示如何处理图像并在其上绘制检测到的矩形。

1.初始化视觉请求

ViewDidLoad 中,创建一个引用 HandleRectangles 方法的 VNDetectRectanglesRequest,该方法将在每个请求结束时调用:

还应设置 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.显示结果

VisionRectangles 示例中的 OverlayRectangles 方法具有三个函数

  • 呈现源图像,
  • 绘制一个矩形以指示检测到每个图像的位置,并
  • 使用 CoreGraphics 为每个矩形添加文本标签。

移动设备上的检测到三个矩形的照片。

5.进一步处理

矩形检测通常只是一系列操作中的第一步,例如此 CoreMLVision 示例,其中矩形将传递到 CoreML 模型以分析手写数字。

人脸检测

此示例的工作方式与 VisionRectangles 示例类似,但使用了不同的视觉请求类

1.初始化视觉请求

ViewDidLoad 中,创建一个引用 HandleRectangles 方法的 VNDetectFaceRectanglesRequest,该方法将在每个请求结束时调用。

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.显示结果

VisionFaces 示例中的 OverlayRectangles 方法具有三个函数

  • 呈现源图像,
  • 为检测到的每个人脸绘制矩形,并
  • 使用 CoreGraphics 为每个人脸添加文本标签。

移动设备上的检测到两张人脸的照片。

5.进一步处理

视觉框架包括检测面部特征(例如眼睛和嘴巴)的附加功能。 使用 VNDetectFaceLandmarksRequest 类型,将返回 VNFaceObservation 结果(如上面的步骤 3 所示),但带有附加的 VNFaceLandmark 数据。