2010-12-05 6 views
0

Ich ergreife den YUV-Kanal vom IPhone im Format kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange (YUV, Bi-Planar).IPhone YUV Kanalausrichtung

Ich beabsichtige, die y-Kanal zu verarbeiten, so dass ich schnappen sie unter Verwendung von

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

int bufferHeight = CVPixelBufferGetHeight(pixelBuffer); 
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer); 

uint8_t *y_channel = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); 

Das Problem ist, dass die y_channel Pixel gedreht erscheint, und gespiegelt (I sie auf einer Overlay-Schicht zeichnen, was das Aussehen zu sehen, wie :

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
    CGContextRef bitmapContext = CGBitmapContextCreate(rotated, 
                 imageSize->x, 
                 imageSize->y, 
                 8, // bitsPerComponent 
                 1*imageSize->x, // bytesPerRow 
                 colorSpace, 
                 kCGImageAlphaNone); 

    CFRelease(colorSpace); 

    CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext); 

    CGContextDrawImage(context, CGRectMake(0, 0, imageSize->x/2, imageSize->y/2), cgImage); 

    CFRelease(cgImage); 
    CFRelease(bitmapContext); 
} 

ich durch die Pixel Looping betrachtet habe und eine feste Version des Bildes erstellt, aber ich frage mich, ob eine Methode gibt es die y_channel in der richtigen Orientierung (IE: nicht gedreht in 90 Grad) zu erhalten direkt von der Kamera

Antwort

2

Ich glaube nicht, dass es eine Möglichkeit gibt, die Ausrichtung der Y - Ebene, die von der Kamera kommt, zu ändern, aber das sollte in Ihrer Verarbeitung nicht so viel ausmachen, denn Sie sollten damit gut arbeiten können native Ausrichtung. Wenn Sie wissen, dass es um 90 Grad gedreht ist, optimieren Sie einfach Ihre Verarbeitung, um mit dieser Drehung zu arbeiten.

Auch glaube ich, dass die Spiegelung, die Sie sehen, aufgrund Ihrer Zeichnung in den Core Graphics Koordinatenraum ist, wo der Ursprung in der unteren linken Ecke ist. Auf dem iPhone werden CALayers, die die UIViews zurückspringen, umgedreht, so dass sich der Ursprung oben links befindet, was dazu führen kann, dass mit Quartz in diesen Layern gezeichnete Bilder invertiert werden.

Für die Anzeige würde ich empfehlen, keine Quartz-Zeichnung wie hier gezeigt zu erstellen, sondern stattdessen das Y-Kanal-Bild als OpenGL ES-Textur zu verwenden. Dies wird viel leistungsfähiger sein. Außerdem können Sie einfach die richtigen Texturkoordinaten angeben, um automatisch mit jeder gewünschten Bildrotation hardwarebeschleunigt umzugehen.

ich beschreiben, wie hardwarebeschleunigte Bildverarbeitung auf iOS-Geräten mit OpenGL ES 2.0 here und ich biete eine sample application zu tun, dass diese Verarbeitung unter Verwendung von Shadern tut und zeichnet das Ergebnis auf dem Bildschirm in einer Textur. Ich arbeite mit dem BGRA-Farbraum in diesem Beispiel, aber Sie sollten in der Lage sein, den Y-Kanal herauszuziehen und ihn auf dieselbe Weise als Luminanztextur zu verwenden.