2010-12-05 7 views
0

kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange 형식 (YUV, 양면성)의 IPhone에서 YUV 채널을 가져옵니다. 문제는 y_channel 화소 회전 및 미러링 나타 (I 무엇 모양 등을 표시 오버레이 층들을 무승부아이폰 YUV 채널 방향

는 I은 Y 채널을 처리하고자하므로 I는

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도 회전 한 것을 알고 있다면 해당 회전에서 처리 할 수 ​​있도록 처리를 조정하십시오.

또한 미러링은 원점이 왼쪽 하단에있는 코어 그래픽 좌표 공간으로 그리기 때문에 발생한다고 생각합니다. iPhone에서 CALayers는 UIView가 반전되어 원점이 왼쪽 상단에있게되어 이러한 레이어의 Quartz를 사용하여 그린 이미지가 반전 될 수 있습니다.

디스플레이하려면 Quartz 드로잉을하지 말고 여기에 표시하는 대신 Y 채널 이미지를 OpenGL ES 텍스처로 사용하는 것이 좋습니다. 이것은 훨씬 더 성취 할 것입니다. 또한 하드웨어 가속 방식으로 원하는 이미지 회전을 자동으로 처리 할 수 ​​있도록 올바른 텍스처 좌표를 지정하기 만하면됩니다.

OpenGL ES 2.0 here을 사용하여 iOS 장치에서 하드웨어 가속 이미지 처리를 수행하는 방법을 설명하고이 처리를 셰이더를 사용하여 sample application으로 제공하고 결과를 텍스처의 화면에 그립니다. 이 예제에서 BGRA 색상 공간을 사용하고 있지만 Y 채널을 꺼내서 같은 방식으로 휘도 텍스처로 사용할 수 있어야합니다.