2017-06-15 6 views
0

Ich verwende Vision Framework, um Bilder zu verarbeiten. Die Funktion, die ich dafür verwende, läuft gut und gibt keinen Fehler im Completion-Handler zurück, aber das Ergebnis ist leer.VNDetectFaceRectanglesRequest Erkennung des Gesichts

Dies ist meine Funktion:

func recognizeImage() { 
     let request = VNDetectFaceRectanglesRequest { (res: VNRequest, error: Error?) in 
      print("Reuslt : \(res.accessibilityActivationPoint)") 
     } 

     if let cgContet = image.image.cgImage { 
      let handler = VNImageRequestHandler(cgImage: cgContet) 
      try? handler.perform([request]) 
     } 
    } 

Ergebnis der Funktion ist:

Reuslt : (0.0, 0.0) 
+0

, was genau hier gefragt wird? – rambossa

+0

@Rambossa Warum Funktion, die verwendet wird, leeres Ergebnis ohne Fehler zurückgeben –

Antwort

3

Es gibt nicht genug Informationen hier sicher sein, aber wahrscheinlich ...

Gesichtserkennung erfordert, dass die Bildorientierung bekannt ist. (Weil genau herauszufinden, welche Blobs von Pixeln sind und keine Gesichter sind, ist eine Menge einfacher, wenn Sie nur nach rechts-up-Seiten suchen.)

CGImage weiß nicht, es ist eine eigene Ausrichtung, also müssen Sie diese Informationen separat erhalten und an einen der VNImageRequestHandler Initialisierer that takes an orientation übergeben.

Diese Initialisierer haben einen EXIF-Orientierungswert (aka CGImagePropertyOrientation). Wenn Sie mit UIImage beginnen, stimmen die numerischen Werte, die dieser Enumeration zugrunde liegen, nicht mit denen von UIImageOrientation überein, daher müssen Sie sie konvertieren. Es gibt eine praktische Methode, um das in der sample code attached to the Vision session from WWDC17 zu tun.

3

Wenn Sie möchten, Gesichter erkennen und ein Rechteck auf jeder Ziehung, versuchen Sie dies:

let request=VNDetectFaceRectanglesRequest{request, error in 
    var final_image=UIImage(named: image_to_process) 

    if let results=request.results as? [VNFaceObservation]{ 
     print(results.count, "faces found") 
     for face_obs in results{ 
      //draw original image 
      UIGraphicsBeginImageContextWithOptions(final_image.size, false, 1.0) 
      final_image.draw(in: CGRect(x: 0, y: 0, width: final_image.size.width, height: final_image.size.height)) 

      //get face rect 
      var rect=face_obs.boundingBox 
      let tf=CGAffineTransform.init(scaleX: 1, y: -1).translatedBy(x: 0, y: -final_image.size.height) 
      let ts=CGAffineTransform.identity.scaledBy(x: final_image.size.width, y: final_image.size.height) 
      let converted_rect=rect.applying(ts).applying(tf)  

      //draw face rect on image 
      let c=UIGraphicsGetCurrentContext()! 
      c.setStrokeColor(UIColor.red.cgColor) 
      c.setLineWidth(0.01*final_image.size.width) 
      c.stroke(converted_rect) 

      //get result image 
      let result=UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 

      final_image=result! 
     } 
    } 

    //display final image 
    DispatchQueue.main.async{ 
     self.image_view.image=final_image 
    } 
} 


guard let ciimage=CIImage(image:image_to_process) else{ 
    fatalError("couldn't convert uiimage to ciimage") 
} 

let handler=VNImageRequestHandler(ciImage: ciimage) 
DispatchQueue.global(qos: .userInteractive).async{ 
    do{ 
     try handler.perform([request]) 
    }catch{ 
     print(error) 
    } 
} 
+1

Dies ist die einzige Antwort, die mir in allen Fällen hilfreich war, auch wenn mein * UIImageView * in ein * UIScrollView * eingebettet ist oder wenn sich die Ausrichtung ändert. Andere Reaktionen auf StackOverflow waren in einigen Szenarien hilfreich, insbesondere im Umgang mit Pixelpuffern und Live-Kamera-Feeds, aber dies war in fast allen Fällen * sehr * hilfreich für UIImagages. – ZbadhabitZ

+0

Froh, dass es @ZbadhabitZ helfen könnte! :) –

0

Dieses Problem hat mich zu verrückt sein. Es stellt sich heraus, dass das ursprüngliche Problem die Ausrichtung des Bildes ist, die sowohl cgiImage als auch ciiImage nicht korrekt behandeln können. Irgendein Code, den ich von irgendwoher kopiert habe, hat die falsche Ausrichtung von Bild zu CGI durch einfaches Casting (sie sind nicht die gleiche Reihenfolge) konvertiert.

Ich habe einen Orientierungs Konverter und der folgende Code funktioniert für mich erstellt:

let handler = VNImageRequestHandler(cgImage: image.cgImage!, orientation: self.convertImageOrientation(orientation: image.imageOrientation)) 

... 

func convertImageOrientation(orientation: UIImageOrientation) -> CGImagePropertyOrientation { 
    let cgiOrientations : [ CGImagePropertyOrientation ] = [ 
     .up, .down, .left, .right, .upMirrored, .downMirrored, .leftMirrored, .rightMirrored 
    ] 

    return cgiOrientations[orientation.rawValue] 
} 
Verwandte Themen