Xamarin.iOS 中的视觉框架
视觉框架向 iOS 11 添加了许多新的图像处理功能,包括:
下文更详细地讨论了矩形检测和人脸检测。
矩形检测
该示例演示如何处理图像并在其上绘制检测到的矩形。
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
数据。