ios - 使用 Accelerate 缩放 Ycbcr (420f) 时的伪像

标签 ios accelerate-framework

我找不到任何关于如何调整 Ycbcr 双平面大小的文档或示例,根据 Apple 的说法,这应该是你应该在 iOS 上使用的主要格式。我试着像这样调整两个平面的大小:

    // resize luma
    vImage_Buffer originalYBuffer = { CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0), CVPixelBufferGetHeightOfPlane(pixelBuffer, 0), CVPixelBufferGetWidthOfPlane(pixelBuffer, 0), CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0) };
    vImage_Buffer resizedYBuffer;
    vImageBuffer_Init(&resizedYBuffer, IMAGE_HEIGHT, IMAGE_WIDTH, 8 * sizeof(Pixel_8), kvImageNoFlags);
    error = vImageScale_Planar8(&originalYBuffer, &resizedYBuffer, NULL, kvImageNoFlags);
    assert(!error);
    cv::Mat grey(IMAGE_HEIGHT, IMAGE_WIDTH, CV_8UC1, resizedYBuffer.data);

    // resize chroma
    vImage_Buffer originalUVBuffer = { CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1), CVPixelBufferGetHeightOfPlane(pixelBuffer, 1), CVPixelBufferGetWidthOfPlane(pixelBuffer, 1), CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1) };
    vImage_Buffer resizedUVBuffer;
    vImageBuffer_Init(&resizedUVBuffer, IMAGE_HEIGHT / 2, IMAGE_WIDTH / 2, 8 * sizeof(Pixel_16U), kvImageNoFlags);
    error = vImageScale_Planar8(&originalUVBuffer, &resizedUVBuffer, NULL, kvImageNoFlags);
    assert(!error);

但是颜色完全是无聊的。亮度 channel 自己工作,所以它是色度的问题。这种格式应该使用 2 个字节的色度,虽然不完全确定。如果我使用 vImageScale_Planar8,我会得到一半的屏幕绿色,否则如果我使用 vImageScale_Planar16U,我会在整个图像中得到蓝/黄噪声。

最佳答案

您可以将 vImageScale_CbCr8 用于 UV 缓冲区,但它仅适用于 iOS 10+:

// resize luma
vImage_Buffer originalYBuffer = { CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0), CVPixelBufferGetHeightOfPlane(pixelBuffer, 0), CVPixelBufferGetWidthOfPlane(pixelBuffer, 0), CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0) };
vImage_Buffer resizedYBuffer;
vImageBuffer_Init(&resizedYBuffer, IMAGE_HEIGHT, IMAGE_WIDTH, 8 * sizeof(Pixel_8), kvImageNoFlags);
error = vImageScale_Planar(&originalYBuffer, &resizedYBuffer, NULL, kvImageNoFlags);
assert(!error);
cv::Mat grey(IMAGE_HEIGHT, IMAGE_WIDTH, CV_8UC1, resizedYBuffer.data);

// resize chroma
vImage_Buffer originalUVBuffer = { CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1), CVPixelBufferGetHeightOfPlane(pixelBuffer, 1), CVPixelBufferGetWidthOfPlane(pixelBuffer, 1), CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1) };
vImage_Buffer resizedUVBuffer;
vImageBuffer_Init(&resizedUVBuffer, IMAGE_HEIGHT / 2, IMAGE_WIDTH / 2, 8 * sizeof(Pixel_16U), kvImageNoFlags);
error = vImageScale_CbCr8(&originalUVBuffer, &resizedUVBuffer, NULL, kvImageNoFlags);
assert(!error);

关于ios - 使用 Accelerate 缩放 Ycbcr (420f) 时的伪像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792203/

相关文章:

ios - UITableView 在每个部分返回相同的项目

objective-c - 使用 Accelerate Framework 的 iOS 的 FFT 音调检测?

objective-c - 是否可以将结果存储在 vDSP 框架中的输入向量之一中

iOS Accelerate Framework vImage - 性能改进?

swift - 将一个向量中的值分配给另一个向量中的索引?

ios - Xcode 8.3 为 Unity IOS Build 制作了非常大的 (.ipa) 文件?

ios - Objective c 中方法调配和类别之间的区别

ios - 使用下一个和上一个UIButton切换UITextView/UILabel中的不同文本

ios - SKError中的变量 "code"在哪里定义的?

linux - 如何在 Mac 之外使用 Accelerate 框架