Ориентация канала iPhone YUV - PullRequest
0 голосов
/ 05 декабря 2010

Я получаю канал YUV с IPhone в формате kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange (YUV, двухплоскостной).

Я намереваюсь обработать канал y, поэтому я получаю его, используя

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );

CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

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

uint8_t *y_channel = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);

Проблема в том, что пиксели y_channel выглядят повернутыми и зеркальными (я рисую их на наложенном слое, чтобы посмотреть, как выглядит:

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

Я рассмотрел цикл по пикселям и создал фиксированную версиюизображения, но мне интересно, есть ли способ получить y_channel в правильной ориентации (т.е. не поворачивать на 90 градусов) прямо из камеры.

1 Ответ

2 голосов
/ 08 декабря 2010

Я не верю, что есть способ изменить ориентацию плоскости Y, исходящей из камеры, но это не должно иметь большого значения в вашей обработке, потому что вы должны быть в состоянии работать с ним очень хорошо в егородная ориентация.Если вы знаете, что он повернут на 90 градусов, просто настройте свою обработку для работы с ним при этом повороте.

Кроме того, я считаю, что зеркальное отражение, которое вы видите, происходит из-за вашего рисунка в координатное пространство Core Graphics, где источникнаходится в левом нижнем углу.На iPhone CALayers, которые поддерживают UIViews, переворачиваются так, что источник находится в верхнем левом углу, что может привести к инвертированию изображений, нарисованных с помощью Quartz в этих слоях.как вы показываете здесь, но вместо этого используйте изображение канала Y в качестве текстуры OpenGL ES.Это будет гораздо более производительным.Кроме того, вы можете просто указать правильные координаты текстуры, чтобы автоматически обрабатывать любое вращение изображения с аппаратным ускорением.

Я описываю, как выполнять аппаратную обработку изображений на устройствах iOS с использованием OpenGL ES 2.0 здесь , и я предоставляю пример приложения , которое выполняет эту обработку с использованием шейдеров и выводит результат на экран в текстуре.В этом примере я работаю с цветовым пространством BGRA, но вы должны быть в состоянии извлечь канал Y и использовать его в качестве текстуры яркости таким же образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...