Struktura przetwarzania obrazów na platformie Xamarin.iOS
Struktura przetwarzania obrazów dodaje szereg nowych funkcji przetwarzania obrazów do systemu iOS 11, w tym:
- Wykrywanie prostokąta
- Wykrywanie twarzy
- Analiza obrazów usługi Machine Learning (omówiona w języku CoreML)
- Wykrywanie kodów kreskowych
- Analiza wyrównania obrazów
- Wykrywanie tekstu
- Wykrywanie horyzontów
- Wykrywanie i śledzenie obiektów
Wykrywanie prostokątów i wykrywanie twarzy zostały omówione bardziej szczegółowo poniżej.
Wykrywanie prostokąta
W przykładzie pokazano, jak przetworzyć obraz i narysować wykryte prostokąty.
1. Inicjowanie żądania przetwarzania obrazów
W ViewDidLoad
pliku utwórz element VNDetectRectanglesRequest
odwołujący się do HandleRectangles
metody, która zostanie wywołana na końcu każdego żądania:
Właściwość powinna być również ustawiona MaximumObservations
, w przeciwnym razie wartość domyślna to 1 i zostanie zwrócony tylko jeden wynik.
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
RectangleRequest.MaximumObservations = 10;
2. Rozpoczęcie przetwarzania obrazów
Poniższy kod rozpoczyna przetwarzanie żądania. W przykładzie visionRects ten kod jest uruchamiany po wybraniu obrazu przez użytkownika:
// 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);
});
Ta procedura obsługi przekazuje ciImage
element do struktury VNDetectRectanglesRequest
Vision utworzonej w kroku 1.
3. Obsługa wyników przetwarzania obrazów
Po zakończeniu wykrywania prostokąta platforma wykonuje metodę HandleRectangles
, a podsumowanie pokazane poniżej:
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. Wyświetlanie wyników
Metoda OverlayRectangles
w przykładzie VisionRectangles ma trzy funkcje:
- Renderowanie obrazu źródłowego,
- Rysowanie prostokąta wskazującego, gdzie wykryto każdą z nich, i
- Dodawanie etykiety tekstowej dla każdego prostokąta przy użyciu biblioteki CoreGraphics.
5. Dalsze przetwarzanie
Wykrywanie prostokąta jest często tylko pierwszym krokiem w łańcuchu operacji, na przykład w tym przykładzie CoreMLVision, gdzie prostokąty są przekazywane do modelu CoreML w celu analizowania cyfr odręcznych.
Wykrywanie twarzy
Ten przykład działa w podobny sposób do przykładu VisionRectangles przy użyciu innej klasy żądania przetwarzania obrazów.
1. Inicjowanie żądania przetwarzania obrazów
W ViewDidLoad
pliku utwórz element VNDetectFaceRectanglesRequest
odwołujący HandleRectangles
się do metody, która zostanie wywołana na końcu każdego żądania.
FaceRectangleRequest = new VNDetectFaceRectanglesRequest(HandleRectangles);
2. Rozpoczęcie przetwarzania obrazów
Poniższy kod rozpoczyna przetwarzanie żądania. W przykładzie visionFaces ten kod jest uruchamiany po wybraniu obrazu przez użytkownika:
// 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);
});
Ta procedura obsługi przekazuje ciImage
element do struktury VNDetectFaceRectanglesRequest
Vision utworzonej w kroku 1.
3. Obsługa wyników przetwarzania obrazów
Po zakończeniu wykrywania twarzy program obsługi wykonuje metodę, która wykonuje HandleRectangles
obsługę błędów i wyświetla granice wykrytych twarzy, a następnie wywołuje OverlayRectangles
metodę , aby narysować prostokąty ograniczenia na oryginalnym obrazie:
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. Wyświetlanie wyników
Metoda OverlayRectangles
w przykładzie VisionFaces ma trzy funkcje:
- Renderowanie obrazu źródłowego,
- Rysowanie prostokąta dla każdej wykrytej twarzy i
- Dodawanie etykiety tekstowej dla każdej twarzy przy użyciu biblioteki CoreGraphics.
5. Dalsze przetwarzanie
Struktura vision zawiera dodatkowe możliwości wykrywania cech twarzy, takich jak oczy i usta. VNDetectFaceLandmarksRequest
Użyj typu , który zwróci VNFaceObservation
wyniki w kroku 3 powyżej, ale z dodatkowymi VNFaceLandmark
danymi.