Xamarin.iOS'ta Vision Framework
Görüntü İşleme çerçevesi, iOS 11'e aşağıdakiler de dahil olmak üzere bir dizi yeni görüntü işleme özelliği ekler:
- Dikdörtgen Algılama
- Yüz Algılama
- Makine Öğrenmesi Görüntü Analizi (CoreML'de ele alınmalıdır)
- Barkod Algılama
- Görüntü Hizalama Analizi
- Metin Algılama
- Ufuk Algılama
- Nesne Algılama ve İzleme
Dikdörtgen Algılama ve Yüz Algılama aşağıda daha ayrıntılı olarak açıklandı.
Dikdörtgen Algılama
Örnek, bir görüntünün nasıl işlendiği ve algılanan dikdörtgenlerin üzerine nasıl çizilip çizilip çizileyişini gösterir.
1. Görüntü İşleme isteğini başlatma
içindeViewDidLoad
, her isteğin HandleRectangles
sonunda çağrılacak yöntemine başvuran bir VNDetectRectanglesRequest
oluşturun:
MaximumObservations
Özelliği de ayarlanmalıdır, aksi takdirde varsayılan olarak 1 olur ve yalnızca tek bir sonuç döndürülür.
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;
2. Görüntü İşleme'yi başlatın
Aşağıdaki kod isteği işlemeye başlar. VisionRects örneğinde bu kod, kullanıcı bir görüntü seçtikten sonra çalışır:
// 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);
});
Bu işleyici, 1. adımda oluşturulan Görüntü İşleme çerçevesine VNDetectRectanglesRequest
iletirciImage
.
3. Görüntü işlemenin sonuçlarını işleme
Dikdörtgen algılama tamamlandıktan sonra çerçeve yöntemini yürütür HandleRectangles
ve bunun özeti aşağıda gösterilmiştir:
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. Sonuçları görüntüleme
OverlayRectangles
VisionRectangles örneğindeki yöntemin üç işlevi vardır:
- Kaynak görüntüyü işleme,
- Her birinin nerede algılandığını belirtmek için bir dikdörtgen çizme ve
- CoreGraphics kullanarak her dikdörtgen için bir metin etiketi ekleme.
5. Daha fazla işlem
Dikdörtgen algılama, genellikle bu CoreMLVision örneğinde olduğu gibi, el yazısı basamakları ayrıştırmak için dikdörtgenlerin CoreML modeline geçirildiği bir işlem zincirinin yalnızca ilk adımıdır.
Yüz Algılama
Bu örnek, farklı bir Vision istek sınıfı kullanarak VisionRectangles örneğine benzer şekilde çalışır.
1. Görüntü İşleme isteğini başlatma
içindeViewDidLoad
, her isteğin HandleRectangles
sonunda çağrılacak yöntemine başvuran bir VNDetectFaceRectanglesRequest
oluşturun.
FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);
2. Görüntü İşleme'yi başlatın
Aşağıdaki kod isteği işlemeye başlar. VisionFaces örneğinde bu kod, kullanıcı bir görüntü seçtikten sonra çalışır:
// 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);
});
Bu işleyici, 1. adımda oluşturulan Görüntü İşleme çerçevesine VNDetectFaceRectanglesRequest
iletirciImage
.
3. Görüntü işlemenin sonuçlarını işleme
Yüz algılama tamamlandıktan sonra işleyici, hata işleme gerçekleştiren yöntemini yürütür HandleRectangles
ve algılanan yüzlerin sınırlarını görüntüler ve özgün resme sınırlayıcı dikdörtgenler çizmek için öğesini çağırır 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. Sonuçları görüntüleme
OverlayRectangles
VisionFaces örneğindeki yöntemin üç işlevi vardır:
- Kaynak görüntüyü işleme,
- Algılanan her yüz için bir dikdörtgen çizme ve
- CoreGraphics kullanarak her yüz için bir metin etiketi ekleme.
5. Daha fazla işlem
Görüntü İşleme çerçevesi, gözler ve ağız gibi yüz özelliklerini algılamak için ek özellikler içerir. VNDetectFaceLandmarksRequest
Yukarıdaki 3. adımda olduğu gibi ancak ek VNFaceLandmark
verilerle sonuç döndürecek VNFaceObservation
türü kullanın.