Erkennen schwarze pixel im Bild iOS
Ab jetzt Suche ich für jeden pixel 1 von 1 überprüfen Sie die Farbe und sehen, wenn es schwarz ist... wenn es nicht weiter geht zum nächsten pixel. Das dauert ewig, da kann ich nur prüfen, ca. 100 Pixel pro Sekunde (Beschleunigung meiner NSTimer friert die app, weil es nicht check schnell genug.) So ist es trotzdem kann ich nur Xcode wieder alle Pixel, die schwarz und ignorieren alles andere, so dass ich nur noch prüfen, die Pixel und nicht die einzelnen pixel. Ich versuche zu erkennen, ein schwarzer pixel am weitesten Links auf mein Bild.
Hier ist mein Derzeitiger code.
- (void)viewDidLoad {
timer = [NSTimer scheduledTimerWithTimeInterval: 0.01
target: self
selector:@selector(onTick:)
userInfo: nil repeats:YES];
y1 = 0;
x1 = 0;
initialImage = 0;
height1 = 0;
width1 = 0;
}
-(void)onTick:(NSTimer *)timer {
if (initialImage != 1) {
/*
IMAGE INITIALLY GETS SET HERE... "image2.image = [blah blah blah];" took this out for non disclosure reasons
*/
initialImage = 1;
}
//image2 is the image I'm checking the pixels of.
width1 = (int)image2.size.width;
height1 = (int)image2.size.height;
CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(image2.CGImage));
const UInt32 *pixels = (const UInt32*)CFDataGetBytePtr(imageData);
if ( (pixels[(x1+(y1*width1))]) == 0x000000) { //0x000000 is black right?
NSLog(@"black!");
NSLog(@"x = %i", x1);
NSLog(@"y = %i", y1);
}else {
NSLog(@"val: %lu", (pixels[(x1+(y1*width1))]));
NSLog(@"x = %i", x1);
NSLog(@"y = %i", y1);
x1 ++;
if (x1 >= width1) {
y1 ++;
x1 = 0;
}
}
if (y1 > height1) {
/*
MY UPDATE IMAGE CODE GOES HERE (IMAGE CHANGES EVERY TIME ALL PIXELS HAVE BEEN CHECKED
*/
y1 = 0;
x1 = 0;
}
Auch was, wenn ein pixel ist wirklich nahe an schwarz, aber nicht ganz schwarz ist... Kann ich einen Spielraum für Fehler dort irgendwo, so wird es noch erkennen, Pixel, die, wie 95% schwarz? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum verwenden Sie ein timer überhaupt? Warum nicht einfach eine doppelte for-Schleife in Ihrer Funktion, die Schleifen über alle möglichen x - und y-Koordinaten im Bild? Sicherlich, das wäre viiiiel schneller als nur die Prüfung auf maximal 100 Pixel pro Sekunde. Würden Sie wollen, um die x - (Breite) - Koordinaten in die äußere Schleife und y (Höhe) - Koordinaten in der inneren Schleife, so dass Sie effektiv Scannen einer Spalte von Pixeln in einer Zeit von Links nach rechts, da Sie versuchen zu finden, die am weitesten Links stehende schwarze pixel.
Auch, sind Sie sicher, dass jedes pixel im Bild hat ein 4-byte (Uint32) Darstellung? Eine standard-bitmap müsste 3 bytes pro pixel. Um zu überprüfen, ob ein pixel ist nah an schwarz sind, würden Sie genau prüfen, jedes byte in den pixel separat und stellen Sie sicher, Sie sind alle weniger als eine Schwelle.
EDIT: OK, da man sich mit UIGetScreenImage, gehe ich davon aus, dass es 4 bytes pro pixel.
Wenn es sich herausstellt, dass bytesPerPixel 3 ist, dann ändern Sie den Wert entsprechend, entfernen Sie die alphaVal aus der for-Schleife, und subtrahieren Sie 1 von der indices der rot -, grün-und blau-Werte.
Auch mein derzeitiges Verständnis ist, dass UIGetScreenImage ist als eine private Funktion, die Apple kann oder kann nicht ablehnen, Sie für die Verwendung.
CGImageRef UIGetScreenImage();
Auch ich bin ganz offen, nicht über den timer, ich bin nicht vertraut mit der while-Endlosschleifen, ich weiß wie Sie gesetzt werden bis ich nur selten verwenden Sie, damit ich denke, ich habe vergessen, haha. Auch ist es eine Methode zu finden, um alle Pixel in dem array und nur return die x-und y-Koordinaten von denen, die sind schwarz anstatt zu checken einzeln (auch wenn ich mit einem loop?)CGImageCreateWithImageInRect
aber ich glaube nicht, dass es zu skalieren, nur zuschneiden..Ich bin kein Experte auf pixel-level-Bildverarbeitung, aber mein Erster Gedanke ist: warum verwenden Sie einen timer, um dies zu tun? Das verursacht viel Aufwand und macht den code weniger klar zu Lesen. (Ich denke, es macht auch Sie thread-unsicher.) Der overhead ist nicht nur von der Zeitschaltuhr selbst, sondern weil Sie dabei sind, alle Daten, die Konfiguration jedes mal durch.
Wie etwa die Verwendung einer Schleife, anstatt zu iterieren über die Pixel?
Zudem sind Sie undicht Bilddaten (da Sie es schaffen, einen "Kopieren" - Methode und nie wieder loslassen). Derzeit tun Sie das einmal pro timer-Feuer (und Ihre Bilddaten ist wohl ziemlich groß, wenn Sie arbeiten, auf alle, aber die kleinsten Bilder), so sind Sie vermutlich undicht Tonnen Speicher.
Dort ist keine Weise, die Sie tun sollten, diese mit einem timer (oder keinen Grund, warum ich denken kann, sowieso!).
Wie groß sind deine Bilder? Es sollte tragfähig sein, um das ganze Bild in einer einzigen Schleife relativ schnell.