2010-12-05 4 views
0

Je saisis le canal YUV depuis l'iPhone au format kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange (YUV, bi-planaire).Orientation du canal Yhone IPhone

Je l'intention de traiter le canal y, donc je le saisir à l'aide

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

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

uint8_t *y_channel = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); 

Le problème est que les pixels y_channel apparaît en rotation et en miroir (je les dessiner sur une couche de recouvrement pour voir ce que l'apparence comme :

- (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); 
} 

J'ai examiné en boucle à travers les pixels et créé une version fixe de l'image, mais je me demande s'il y a une méthode pour obtenir la y_channel dans l'orientation correcte (IE: non tourné en 90 degrés) directement à partir de l'appareil photo

Répondre

2

Je ne crois pas qu'il existe un moyen de modifier l'orientation du plan Y provenant de la caméra, mais cela ne devrait pas avoir autant d'importance dans votre traitement, car vous devriez pouvoir travailler avec elle très bien dans son orientation native. Si vous savez qu'il est pivoté de 90 degrés, modifiez simplement votre traitement pour qu'il fonctionne avec cette rotation.

Aussi, je crois que la mise en miroir que vous voyez est due à votre dessin dans l'espace de coordonnées Core Graphics, où l'origine est en bas à gauche. Sur l'iPhone, les CALayers qui retournent les UIViews sont retournés de sorte que l'origine soit en haut à gauche, ce qui peut entraîner l'inversion des images dessinées en utilisant Quartz dans ces couches.

Pour l'affichage, je recommande de ne pas faire de dessin au quartz comme vous le montrez ici, mais d'utiliser plutôt l'image du canal Y comme une texture OpenGL ES. Ce sera beaucoup plus performant. En outre, vous pouvez simplement spécifier les coordonnées de texture correctes pour traiter automatiquement toute rotation d'image que vous voulez d'une manière accélérée par le matériel.

Je décris comment effectuer le traitement d'image accéléré par le matériel sur les appareils iOS utilisant OpenGL ES 2.0 here, et je fournis un sample application qui effectue ce traitement en utilisant des shaders et dessine le résultat à l'écran dans une texture. Je travaille avec l'espace colorimétrique BGRA dans cet exemple, mais vous devriez pouvoir extraire le canal Y et l'utiliser comme une texture de luminance de la même manière.