CIFilter auf Video macOS anwenden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CIFilter auf Video macOS anwenden

    Es gibt in Netz einige schöne Beispiele wie man ein CIFilter auf ein Video anwendet.
    Diese sind aber durchwegs für iOS geschrieben:
    flexmonkey.blogspot.co.at/2015…-to-live-camera-feed.html
    stackoverflow.com/questions/32…deo-real-time-using-swift

    Ich täte gerne zb. das Comic Filer auf Video von der eingebauten Cam der MacBooks/iMacs anwenden
    Ein ganz guter Ansatz für macOS Version ist:
    github.com/chrisroedig/swiftAndVision

    Ich scheitere aber am Übergang zum CIFilter und der Darstellung des Ergebnisses im NSView.

    Hat jemand schon damit herumgespielt?
  • Hallo!

    in der ursprünglichen Version github.com/chrisroedig/swiftAndVision wird in func configureCapture(){
    das Video via
    self.camView.wantsLayer = true
    self.camView.layer = AVCaptureVideoPreviewLayer(session: self.avCaptureSession)
    in einer NSView (CamView) ausgegeben.

    Anstelle des Videos möchte ich die gecaptured Bilder nach Anwendung des Filters ausgeben. Irgendwie fehlt mir der Plan
    wie Einzelbilder in func captureOutput( ... gelangen und filteredImage in der NSView (CamView) ausgegeben werden kann.

    Vielen Dank

    So einfach wie in stackoverflow.com/questions/32…deo-real-time-using-swift scheint es im macOS nicht zu funktionieren...
    Dateien
  • Leider immer noch nicht dort wo ich hin will ...
    ... aber ein Schrittchen weiter.

    Ich möchte von der Cam in meinem Macbook das Videobild in einer View ausgeben.
    Und vor der Ausgabe noch ein Filter darauf anwenden.

    Konkret scheitere ich an der Ausgabe. func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer ...) wird
    aufgerufen.

    Aber das Bild nach dem CIFilter landet noch nicht in der View.
    Dateien
    • cameratest.zip

      (90,01 kB, 437 mal heruntergeladen, zuletzt: )
  • Du hast das Ding im Git und hängst ein Zipfile an? Naja, ich guck trotzdem mal. ;)

    Punkt 1: Du definierst weit oben eine Queue und hängst diese als Queue an das Delegate. Dann solltest Du die UI Aktionen bitte auch auf dem Main Thread ausführen. Aber das ist nicht das Hauptproblem.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • In diesem Fall gibt es ein paar lustige Besonderheiten.

    1) Du setzt den Content eines Layers eines NSView auf ein CIImage. Woher soll ein NSView Layer wissen, was er mit einem CIImage anfangen soll?
    2) Auch der Layer eines NSImageView kann so gar nichts mit einem CIImage anfangen. Nicht mal mit einem NSImage.
    3) Laut StackOverflow[0] lässt sich aber auch setImage eines NSImageView nicht sinnvoll aufrufen, wenn das Ding im IB erstellt wurde.

    Die spontane Lösung Deines Problems:

    C-Quellcode: ViewController.swift

    1. override func viewDidLoad() {
    2. super.viewDidLoad()
    3. let imageView = NSImageView()
    4. imageView.frame = self.view.frame
    5. self.view.addSubview(imageView)
    6. self.camView = imageView
    7. setupCameraSession() // setup camera session
    8. }
    Alles anzeigen

    C-Quellcode: ViewController.swift

    1. let filteredImage = filter!.value(forKey: kCIOutputImageKey) as! CIImage
    2. // camView.wantsLayer = true
    3. // camView.addSubview(filteredImage)
    4. // das Funkt nicht
    5. let shownImage = self.fromCIImage(filteredImage)
    6. //print("filteredImage \(shownImage)")
    7. self.camView.image = shownImage
    8. DispatchQueue.main.async {
    9. self.camView.setNeedsDisplay()
    10. }
    Alles anzeigen

    C-Quellcode: ViewController.swift

    1. func fromCIImage(_ ciImage: CIImage) -> NSImage
    2. {
    3. let imageRep = NSCIImageRep(ciImage: ciImage)
    4. let result = NSImage(size: imageRep.size)
    5. result.addRepresentation(imageRep)
    6. return result;
    7. }

    Bei Quelltext gilt immer: Natürlich geht es auch besser. ;)

    0) stackoverflow.com/questions/48…ageview-fails-to-setimage
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Danke für deine Hilfe!

    Ich habe mal so weit ausgebessert, soweit ich das verstanden habe.

    Marco Feltmann schrieb:

    Punkt 1: Du definierst weit oben eine Queue und hängst diese als Queue an das Delegate. Dann solltest Du die UI Aktionen bitte auch auf dem Main Thread ausführen.
    Was sollte ich hier konkret machen?

    lg. Fritz
    Dateien
  • Nochmals eine kleine Nachfrage.

    Was mir auffällt, ist dass das Life-Video die Custom-View vollständig ausfüllt.
    Das gefilterte Video die Grenzen des NSImageViews leicht überschreitet und
    das gecapturete Bild im NSImageView perfekt platziert ist.

    Wie schafft man es, dass alle drei "Bilder" in gleichen korrekten Seitenverhältnis in den jeweiligen Views dargestellt werden ...
    Dateien