Ich benutze die iPhone-Kamera, um Live-Video aufzunehmen und den Pixelpuffer in ein Netzwerk zu leiten, das eine Objekterkennung durchführt. Hier ist der relevante Code: (Ich werde nicht nach dem Code für den Aufbau der AVCaptureSession
usw., da dies ziemlich normal ist.)Ersetze einen Teil des Pixelpuffers durch weiße Pixel in iOS
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
OSType sourcePixelFormat = CVPixelBufferGetPixelFormatType(pixelBuffer);
int doReverseChannels;
if (kCVPixelFormatType_32ARGB == sourcePixelFormat) {
doReverseChannels = 1;
} else if (kCVPixelFormatType_32BGRA == sourcePixelFormat) {
doReverseChannels = 0;
} else {
assert(false);
}
const int sourceRowBytes = (int)CVPixelBufferGetBytesPerRow(pixelBuffer);
const int width = (int)CVPixelBufferGetWidth(pixelBuffer);
const int fullHeight = (int)CVPixelBufferGetHeight(pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
unsigned char* sourceBaseAddr = CVPixelBufferGetBaseAddress(pixelBuffer);
int height;
unsigned char* sourceStartAddr;
if (fullHeight <= width) {
height = fullHeight;
sourceStartAddr = sourceBaseAddr;
} else {
height = width;
const int marginY = ((fullHeight - width)/2);
sourceStartAddr = (sourceBaseAddr + (marginY * sourceRowBytes));
}
}
Das Netzwerk nimmt dann sourceStartAddr
, width
, height
, sourceRowBytes
& doReverseChannels
als Eingaben.
Meine Frage ist die folgende: Was wäre die einfachste und/oder effizienteste Möglichkeit, einen Teil der Bilddaten mit allen weißen 'Pixel' zu ersetzen oder zu löschen? Ist es möglich, einen Teil der Pixelpufferdaten direkt zu überschreiben und wenn ja wie?
Ich habe nur ein sehr rudimentäres Verständnis davon, wie dieser Pixelpuffer funktioniert, also entschuldige ich mich, wenn ich hier etwas sehr Grundlegendes verpasse. Die Frage, die am ehesten mit der von mir auf Stackoverflow gefundenen Frage zusammenhing, war this one, wo ein EAGLContext
verwendet wird, um Text zu einem Videoframe hinzuzufügen. Während dies für mein Ziel funktionieren würde, das nur diesen Ersatz für einzelne Bilder benötigt, gehe ich davon aus, dass dieser Schritt die Leistung bei jedem Video-Frame beeinträchtigen würde, und ich würde gerne herausfinden, ob es eine andere Methode gibt. Jede Hilfe hier würde geschätzt werden.