【问题标题】:vImage on the Mac: unable to convert from Core VideoMac 上的 vImage:无法从 Core Video 转换
【发布时间】:2018-08-22 11:56:05
【问题描述】:

编辑:已修复。工作样本位于https://github.com/halmueller/vImage-mac-sample

我正在尝试读取 MacBook Pro 的 Facetime 摄像头的提要,以使用 vImage 框架对其进行处理。我正在关注 Apple 的 VideoCaptureSample 中的示例,该示例是为 iOS 编写的。

我正忙于创建 vImageConverter,它创建了一个 vImage 可以使用的图像缓冲区。我对vImageConverter_CreateForCVToCGImageFormat() 的调用失败,控制台错误“srcCVFormat 中的信息不足,无法解码图像。vImageCVImageFormatError = -21601”。

同样的调用也适用于 iOS。但是 iOS 和 macOS 上的图像格式不同。在 iOS 上,vImageConverter 构造函数能够推断出格式信息,但在 macOS 上却不能。

这是我的设置代码:

func displayEqualizedPixelBuffer(pixelBuffer: CVPixelBuffer) {
    var error = kvImageNoError

    if converter == nil {
        let cvImageFormat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer).takeRetainedValue()
        let deviceRGBSpace = CGColorSpaceCreateDeviceRGB()
        let dcip3SolorSpace = CGColorSpace(name: CGColorSpace.dcip3)
        vImageCVImageFormat_SetColorSpace(cvImageFormat,
                                          deviceRGBSpace)
        print(cvImageFormat)

        if let unmanagedConverter = vImageConverter_CreateForCVToCGImageFormat(
            cvImageFormat,
            &cgImageFormat,
            nil,
            vImage_Flags(kvImagePrintDiagnosticsToConsole),
            &error) {

            guard error == kvImageNoError else {
                return
            }

            converter = unmanagedConverter.takeRetainedValue()
        } else {
            return
        }
    }

当我在 iOS 上运行时,我在控制台中看到:

vImageCVFormatRef 0x101e12210:
type: '420f'
matrix: 
    0.29899999499321 0.58700001239777 0.11400000005960
    -0.16873589158058 -0.33126410841942 0.50000000000000
    0.50000000000000 -0.41868758201599 -0.08131241053343
chroma location: <RGB Base colorspace missing>
RGB base colorspace: =Bo

不过,在 macOS 上,对 vImageConverter_CreateForCVToCGImageFormat 的调用返回 nil,我看到了:

vImageCVFormatRef 0x10133a270:
type: '2vuy'
matrix: 
    0.29899999499321 0.58700001239777 0.11400000005960
    -0.16873589158058 -0.33126410841942 0.50000000000000
    0.50000000000000 -0.41868758201599 -0.08131241053343
chroma location: <RGB Base colorspace missing>
RGB base colorspace: Рü

2018-03-13... kvImagePrintDiagnosticsToConsole: vImageConverter_CreateForCVToCGImageFormat error: 
insufficient information in srcCVFormat to decode image. vImageCVImageFormatError = -21601

请注意,图像类型(4 个字母代码)不同,RGB 基础色彩空间也不同。我在 Mac 上试过用 dcip3ColorSpace 代替 deviceRGB,结果是一样的。

创建这个 vImageConverter 我缺少什么?

【问题讨论】:

    标签: macos avfoundation accelerate-framework core-video vimage


    【解决方案1】:

    -21601 错误代码表示源 CV 格式缺少色度选址信息(请参阅http://dougkerr.net/Pumpkin/articles/Subsampling.pdf 以获得良好的色度选址背景)。您可以通过使用vImageCVImageFormat_SetChromaSiting 显式设置它来解决此问题。因此,在设置格式的色彩空间之后,在创建转换器之前(即你有 print(cvImageFormat) 的地方),添加以下内容:

            vImageCVImageFormat_SetChromaSiting(cvImageFormat,
                                                kCVImageBufferChromaLocation_Center)
    

    干杯!

    西蒙

    【讨论】:

    • 做到了!色度选址文章是一些严重的书呆子狙击:)
    【解决方案2】:

    因此,虽然关于调用在 vImage 格式上设置 chorma 属性的答案确实有效,但还有更好的方法可以做到这一点。只需在核心视频像素缓冲区上设置属性,然后当您调用 vImageCVImageFormat_CreateWithCVPixelBuffer() 时,它就会正常工作,如下所示:

    NSDictionary *pbAttachments = @{
      (__bridge NSString*)kCVImageBufferChromaLocationTopFieldKey:(__bridge NSString*)kCVImageBufferChromaLocation_Center,
      (__bridge NSString*)kCVImageBufferAlphaChannelIsOpaque: (id)kCFBooleanTrue,
    };
    
    CVBufferRef pixelBuffer = cvPixelBuffer;
    CVBufferSetAttachments(pixelBuffer, (__bridge CFDictionaryRef)pbAttachments, kCVAttachmentMode_ShouldPropagate);
    

    对于加分项,您还可以使用 kCVImageBufferICCProfileKey 和 CGColorSpaceCopyICCData() API 设置颜色空间参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2019-01-26
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2013-03-29
      相关资源
      最近更新 更多