Преобразование образца CVPixelBufferRef из 4:3 в 16:9

Я пытаюсь преобразовать кадр 4:3 в кадр 16:9 в конвейере захвата видео. А преобразованный кадр потребует дальнейшей обработки. Поэтому мне нужно сохранить закрытый кадр как CVImageBufferRef. Я просмотрел этот поток переполнения стека и позаимствовал из него некоторые идеи /CVImageBufferRef

вот что я сделал:

int cropX0 = 0, cropY0 = 60, cropHeight = 360, cropWidth = 640, outWidth = 640, outHeight = 360;
//get CVPixel buffer from CMSampleBuffer
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(cmSampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

size_t startpos = cropY0 * bytesPerRow;
void* cropStartAddr = ((char*)baseAddress) + startpos;

CVPixelBufferRef cropPixelBuffer = NULL;
int status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                          outWidth,
                                          outHeight,
                                          CVPixelBufferGetPixelFormatType(imageBuffer),
                                          cropStartAddr,
                                          bytesPerRow,
                                          NULL, 
                                          0,
                                          NULL, 
                                          &cropPixelBuffer);
if(status == 0){
    OSStatus result = 0;
}

Но после этого метода. если мы проверим cropPixelBuffer из Xcode. это похоже на поврежденный образ.

введите здесь описание изображения Исходное изображение выглядит так

введите здесь описание изображения

Я думаю, это может быть из-за того, что цветовой формат - формат пикселей NV12 yuv. Спасибо за вашу помощь.


person user454083    schedule 26.03.2017    source источник


Ответы (1)


Если ваши данные изображения - yuv, то вы можете иметь дело с данными нескольких плоскостей (например, несколько rowbytes, несколько baseAddrs и несколько width, height и несколько культур), и в этом случае вам придется использовать

CVPixelBufferCreateWithPlanarBytes()

так что же возвращает CVPixelBufferGetPixelFormatType(imageBuffer)?

person Rhythmic Fistman    schedule 26.03.2017
comment
формат — kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange. Я думаю, что мне нужно передать УФ отдельно - person user454083; 11.04.2017
comment
Да, это означает, что у вас есть две битовые карты для обрезки. - person Rhythmic Fistman; 11.04.2017