2010-12-05 17 views
0

kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange形式(YUV、バイプレーナー)のIPhoneからYUVチャンネルを取得しています。IPhone YUVチャンネル方向

私はYチャネルを処理しようとするので、私は問題はy_channel画素が回転し、ミラー(私が何を見てのように見るためにオーバーレイ層の上にそれらを描く表示されていることである

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

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

uint8_t *y_channel = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); 

を使用してそれをつかみます:

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

Iは画素をループとみなされ、イメージの固定バージョンを作成したが、正しい向きでy_channelを取得する方法があるかどうかは疑問に思っています(IE:90度に回転していません)カメラからまっすぐ。

答えて

2

私は、カメラから来るY平面の方向を変える方法はないと信じていますが、あなたの処理でそれほど重要ではないはずです。ネイティブ方向。 90度回転していることがわかっている場合は、その回転で処理するために処理を調整するだけです。

また、ミラーリングは、原点が左下にあるCore Graphics座標空間への描画に起因すると考えています。 iPhone上でUIViewsが反転して原点が左上にくるようにすると、これらのレイヤーでQuartzを使用して描画された画像が反転する可能性があります。

ここではQuartzの描画をしないで、代わりにYチャネルイメージをOpenGL ESテクスチャとして使用することをお勧めします。これははるかにパフォーマンスが向上します。また、適切なテクスチャ座標を指定するだけで、ハードウェアアクセラレーションのようにイメージの回転を自動的に処理することもできます。

Iは、OpenGL ES 2.0 hereを使用してIOSデバイスでハードウェアアクセラレーションの画像処理を行う方法について説明し、私はシェーダを使用して、この処理を行い、テクスチャの画面に結果を描画sample applicationを提供します。私はその例でBGRA色空間で作業していますが、Yチャンネルを引き出して同様の方法で輝度テクスチャとして使用できるはずです。

関連する問題