Xamarin.iOS の Vision Framework
Vision フレームワークでは、次のような多数の新しい画像処理機能が iOS 11 に追加されます。
四角形の検出と顔検出については、以下で詳しく説明します。
四角形の検出
VisionRects サンプルは、画像を処理し、検出された四角形を描画する方法を示しています。
1. Vision 要求を初期化する
でViewDidLoad
、各要求の最後にHandleRectangles
呼び出されるメソッドを参照するメソッドを作成VNDetectRectanglesRequest
します。
プロパティも MaximumObservations
設定する必要があります。それ以外の場合、既定値は 1 になり、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 で作成した Vision フレームワーク 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 サンプルのメソッドには、次の 3 つの関数があります。
- ソース イメージのレンダリング、
- それぞれが検出された場所を示す四角形を描画し、
- CoreGraphics を使用して四角形ごとにテキスト ラベルを追加する。
正確な CoreGraphics メソッドのサンプルのソースを表示します。
5. その他の処理
四角形の検出は、多くの場合、この CoreMLVision の例のように 、一連の操作の最初のステップにすぎません。この例では、四角形が CoreML モデルに渡され、手書きの数字が解析されます。
顔検出
VisionFaces サンプルは、VisionRectangles サンプルと同様の方法で動作し、別の Vision 要求クラスを使用します。
1. Vision 要求を初期化する
で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 で作成した Vision フレームワーク 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 サンプルのメソッドには、次の 3 つの関数があります。
- ソース イメージのレンダリング、
- 検出された顔ごとに四角形を描画し、
- CoreGraphics を使用して顔ごとにテキスト ラベルを追加する。
正確な CoreGraphics メソッドのサンプルのソースを表示します。
5. その他の処理
Vision フレームワークには、目や口などの顔の特徴を検出するための追加の機能が含まれています。 この型をVNDetectFaceLandmarksRequest
使用すると、上記の手順 3 のように結果が返されますが、追加VNFaceLandmark
のデータが返VNFaceObservation
されます。