2017-06-28 1 views
1

Ich steckte mit einem Problem. Wie kann ich den Lichtfleck auf dem binarisierten Bild definieren? Ich benutze jetzt ios11 und Vision.iOS Vision erkennen Licht auf binarisierten Bild

Ich benutze Binarisierungsfilter CIColorControls (auch versucht, dies mit CIColorInvert zu kombinieren).
Für die Lichterkennung verwende ich VNImageRequestHandler mit VNDetectRectanglesRequest. In VNDetectRectanglesRequest Ich überprüfe für VNDetectedObjectObservation Aber kann nicht die 100% -Rahmenerkennung (manchmal App kann nicht erkennen, Lichtfleck auf Rahmen). Was mache ich falsch? Jede mögliche Hilfe schätzt

Hier ist mein Code

lazy var rectanglesRequest: VNDetectRectanglesRequest = { 
     return VNDetectRectanglesRequest(completionHandler: self.handleRectangles) 
    }() 

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { 
      connection.videoOrientation = AVCaptureVideoOrientation.portrait 
      guard let uiImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) else { return } 

      let correctedImage = uiImage 
       .applyingFilter("CIColorControls", withInputParameters: [ 
        kCIInputSaturationKey: 0, 
        kCIInputContrastKey: 4.5, 
        kCIInputBrightnessKey: -1.54 
        ]) 
       //.applyingFilter("CIColorInvert", withInputParameters: nil) 
       self.searchLightSpot(ciImage: correctedImage) 

      DispatchQueue.main.async { [unowned self] in //unowned 
       self.frameImageView.image = UIImage(ciImage: correctedImage) 
      } 
     } 

func searchLightSpot(ciImage: CIImage) { 
     var requestOptions: [VNImageOption: Any] = [:] 
     let handler = VNImageRequestHandler(ciImage: ciImage, options: requestOptions) 
     DispatchQueue.global(qos: .userInteractive).async { 
      do { 
       try handler.perform([self.rectanglesRequest]) 
      } catch { 
       print(error) 
      } 
     } 
    } 

func handleRectangles(request: VNRequest, error: Error?) { 
     guard let observations = request.results as? [VNDetectedObjectObservation] 
      else { 
       print("unexpected result type from VNDetectedObjectObservation") 
       return 
     } 
     guard let detectedObject = observations.first else { 
       print("not detected object") 
      return 
     } 

     print("detected object: ", detectedObject) 
    } 

enter image description here

Antwort

0

Nach weiterer Forschung zu machen verstand ich, dass es wie Apple macht zusätzliche Optimierungen mit Frames

Zum Beispiel sieht, wenn wir Licht bekommen in der erste Rahmen und die nächsten 5 Rahmen wären gleich Es wird uns den gleichen Rahmen zeigen, stattdessen 5 Rahmen - wir haben nur 1 Es bedeutet, dass wir nicht können Relais auf statische Anzahl der Frames in der zweiten mit 100% sicher

So kann ich nicht die Signaldauer erfassen und so weiter ....

eine der möglichen Lösung sein kann:

1 Wir können unseren Timer starten, der den aktuellen Frame von der Kamera bekommt (zum Beispiel alle 100ms)

2. Dann prüfen wir ob der Rahmen einen weißen Punkt hat. Basierend auf diesen Ergebnissen von histogramm enter image description here

y - Farbe (0/1 angezeigt, wenn weiße Farbe vorhanden auf dem Rahmen)

x - Timeline (ms)

3. So ist der Ausgang dieses Diagramm könnte

[01111100001111…] 

4. Dann können wir erkennen und analysieren Signal

können Sie EasyImagy verwenden und deine eigene Erweiterung schreiben weißen Flecke

extension Image where Pixel == RGBA { 

     fileprivate func getPixelCount() -> Int { 
      return Int(10 * width/100) 
     } 

     func binarize() -> (isWhite: Bool, binarizedImage: Image<RGBA>) { 

      var kWidth = 0 
      var img = self 
      let pixelCount = getPixelCount() 
      for x in 0..<width{ 
       var kHeight = 0 
       for y in 0..<height { 

        if let _pixel = pixel(x, y) { 
         if _pixel.gray < 245 { 
          img[x, y] = .black 
          kHeight = 0 
         } else { 
          img[x, y] = .white 
          kHeight += 1 
         } 

         if kHeight > pixelCount { 
          kWidth += 1 
          break 
         } 
        } 
       } 
       print("Hwhite: \(kHeight) Wwhite: \(kWidth)") 
       if kHeight >= pixelCount && kWidth >= pixelCount { 
        return (true, img) 
       } 
      } 
      return (false, img) 
     } 
    } 
zu digitalisieren, und erkennen
Verwandte Themen