iPhone bei Image Processing braucht extrem lange

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

  • iPhone bei Image Processing braucht extrem lange

    Hay,
    Ich versuche mich gerade an ein bisschen Image Manipulation. Aktuell ein kleines Beispiel:

    Quellcode

    1. @implementation ViewController{
    2. CIContext *context;
    3. CIFilter *filter;
    4. CIImage *image;
    5. }
    6. @synthesize imgView;
    7. - (void)viewDidLoad
    8. {
    9. [super viewDidLoad];
    10. NSString *filePath =
    11. [[NSBundle mainBundle] pathForResource:@"img" ofType:@"jpeg"];
    12. NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath];
    13. CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
    14. context = [CIContext contextWithOptions:nil];
    15. image = [CIImage imageWithContentsOfURL:fileNameAndPath];
    16. filter = [CIFilter filterWithName:@"CISepiaTone"];
    17. [filter setValue:image forKey:kCIInputImageKey];
    18. [filter setValue:@0.8f forKey:kCIInputIntensityKey];
    19. CIImage *result = [filter valueForKey:kCIOutputImageKey];
    20. imgView.image = [UIImage imageWithCIImage:result];
    21. CFAbsoluteTime interval = CFAbsoluteTimeGetCurrent() - start;
    22. NSLog(@"%.3fs", interval);
    23. }
    24. - (void)didReceiveMemoryWarning
    25. {
    26. [super didReceiveMemoryWarning];
    27. // Dispose of any resources that can be recreated.
    28. }
    29. - (IBAction)sliderChanged:(UISlider *)slider {
    30. CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
    31. float slideValue = slider.value;
    32. [filter setValue:@(slideValue)
    33. forKey:@"inputIntensity"];
    34. CIImage *outputImage = [filter outputImage];
    35. CGImageRef cgimg = [context createCGImage:outputImage
    36. fromRect:[outputImage extent]];
    37. UIImage *newImage = [UIImage imageWithCGImage:cgimg];
    38. self.imgView.image = newImage;
    39. CGImageRelease(cgimg);
    40. CFAbsoluteTime interval = CFAbsoluteTimeGetCurrent() - start;
    41. NSLog(@"%.3fs", interval);
    42. }
    Alles anzeigen


    Einfach ein ImageView welches das Bild ein bissl verärendert, jenachdem wie weit der Slider ist das Bild ein bisschen mehr sepia.

    img.jpeg hat 2448 × 3264 pixel

    Überraschen tut mich hier die Rechenzeit. Der kleine Benchmark sagt, dass es zwischen 2 und 6 Sekunden dauert.
    Wie kann ich die Rechenzeit optimieren? Bekomm ich die Manipulation überhaupt live hin? Warum können die "anderen" das alle Live?
  • Warum verwendest Du ein Bild mit 2448 × 3264 Pixel wenn ein iPhone max. 640 x 1136 bzw. 1136 x 640 Pixel hat?

    Ich würde für die "Preview" nur ein Bild verwenden, welche so groß ist wie der ImageView in dem es angezeigt wird.

    Teste dies mal und schreibe dann wie die Unterschiede in der Performance ausfallen.
  • Nach der Bearbeitung wird noch OCR drüberlaufen, das Bild an sich brauch ich garnicht, nur der Text, der darin steht. Das Bild soll mal vom iPhone geschossen werden und dann für OCR mit Tesseract präpariert werden (schwarz weiß, kontrast hoch, farben glätten). Daher die hohe Auflösung.

    Und ja die Performanceprobleme sind mit einem kleinen Bild nicht zu spüren. Wie würde man das Bild zurechtmachen, ohne es zu verkleinern? Gibt es externer und vllt performantere Librarys ?
  • Bei 32 Bit pro Pixel benötigt dein Bild etwas 31 MB physikalischen Speicher. Du musst im "Worst Case" ca. 8 Millionen Pixel ändern. Um einen "Echtzeiteffekt" zu erhalten sollte man mindestens 15 FPS haben. Da bist du schon bei 120 Millionen Pixel.

    MCDan hat oben den richtigen Hinweis für dich.

    @flashspys_coder
    Du solltest für ausreichend Kontrast zwischen Buchstaben und dem Rest des Bildes sorgen. Ach kannst Du Farben, die nicht im Text enthalten sind entfernen.
    goto fail;
  • Ich kann mir aber iwie nicht vorstellen, dass mein A7 mit 64Bit und 2x 1,3 GHz mir keine 120 Milliönchen Pixel/s rechnen kann, wenn er muss.. Aber dann schaft mein iPad 3 schafft 96.030.720 ( = Auflösung mal 30fps) Pixel die sekunde in feinster 3d Grafik ohne probleme ? sehr komisch :/

    Außerdem dauert aktuell ein einziges Bild bis zu 6 Sekunden.. also gerade mal 8 mio pixel..

    Das Bild an einen Server zu schicken und vice versa könnte hier vermutlich schneller sein..
  • Die 3D Grafik wird hauptsächlich vom Grafikchip abgefackelt. Der hat eine wesentlich höhere Rechenleistung als die CPU. Ich kann es jetzt nicht mit Sicherheit sagen, aber Core Graphics nutzt die GPU nicht.

    Auf dem Desktop kann man mit OpenGL die GPU Leistung nutzen. Bildverarbeitung geht mit OpenGL hervorragend. Das sollte auf dem iPhone auch mit OpenGL ES gehen.
    goto fail;
  • Schau dir mal GPUImage auf Github an.
    das bietet dir OpenGL ohne etwas von OpenGL verstehen zu müssen.

    Praktisch ein UIImage das von der GPU statt CPU berechnet wird.
    Sind auch eine Menge Filter mir dabei neben Standardoperarionen wie vergrößern/verkleinern etc.

    Ich verwende das schon länger überall wo ich mit großen Bilddaten hantieren muss.
  • Tobse001 schrieb:

    Schau dir mal GPUImage auf Github an.
    das bietet dir OpenGL ohne etwas von OpenGL verstehen zu müssen.

    Praktisch ein UIImage das von der GPU statt CPU berechnet wird.
    Sind auch eine Menge Filter mir dabei neben Standardoperarionen wie vergrößern/verkleinern etc.

    Ich verwende das schon länger überall wo ich mit großen Bilddaten hantieren muss.


    Grandios.. Schafft das filtering des großen Bildes in unter 200ms. Genau das, was ich suchte!
  • Tobse001 schrieb:

    Schau dir mal GPUImage auf Github an.
    das bietet dir OpenGL ohne etwas von OpenGL verstehen zu müssen.

    Praktisch ein UIImage das von der GPU statt CPU berechnet wird.
    Sind auch eine Menge Filter mir dabei neben Standardoperarionen wie vergrößern/verkleinern etc.

    Ich verwende das schon länger überall wo ich mit großen Bilddaten hantieren muss.

    Was ist der Vorteil gegenüber Core Image? Apple hat Core Image ja extra entwickelt, um Echtzeit-Effekte über die GPU zu realisieren.
  • [quote='MCDan','http://osxentwicklerforum.de/index.php/Thread/28385-iPhone-bei-Image-Processing-braucht-extrem-lange/?postID=248674#post248674'
    Was ist der Vorteil gegenüber Core Image? Apple hat Core Image ja extra entwickelt, um Echtzeit-Effekte über die GPU zu realisieren.[/quote]

    Also zumindest zu Beginn von Core Image auf iOS war GPUImage bei vielen Filtern weit schneller.
    Ob das immer noch so ist wäre nach ein paar Jahren sicher mal einen Test wert.