Xamarin.iOS 中的視覺架構
視覺架構會將許多新的圖像處理功能新增至 iOS 11,包括:
以下將更詳細地討論矩形偵測和臉部偵測。
矩形偵測
此範例示範如何處理影像,並在其上繪製偵測到的矩形。
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 為每個矩形新增文字標籤。
5. 進一步處理
矩形偵測通常是作業鏈結中的第一個步驟,例如使用此 CoreMLVision 範例,其中矩形會傳遞至 CoreML 模型來剖析手寫數位。
臉部偵測
此範例的運作方式與使用不同視覺要求類別的 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 為每個臉部新增文字標籤。
5. 進一步處理
視覺架構包含偵測臉部特徵的其他功能,例如眼睛和嘴。 VNDetectFaceLandmarksRequest
使用 類型,其會傳回VNFaceObservation
如上述步驟 3 中的結果,但具有其他VNFaceLandmark
數據。