代码之家  ›  专栏  ›  技术社区  ›  Hal Mueller

Mac上的vImage:无法从核心视频转换

  •  0
  • Hal Mueller  · 技术社区  · 7 年前

    编辑: 固定的工作样本位于 https://github.com/halmueller/vImage-mac-sample

    我正在阅读MacBook Pro Facetime摄像头的提要,以使用vImage框架进行处理。我在苹果的 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需要什么?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Flex Monkey    7 年前

    这个 -21601 错误代码表示源CV格式缺少色度定位信息(请参阅 http://dougkerr.net/Pumpkin/articles/Subsampling.pdf 对于色度定位的良好背景)。可以通过将其显式设置为 vImageCVImageFormat_SetChromaSiting 。因此,在设置格式的颜色空间之后,在创建转换器之前(即 print(cvImageFormat) ),添加以下内容:

            vImageCVImageFormat_SetChromaSiting(cvImageFormat,
                                                kCVImageBufferChromaLocation_Center)
    

    干杯

    西蒙

        2
  •  0
  •   MoDJ    6 年前

    因此,虽然关于在vImage格式上调用设置chorma属性的答案确实有效,但有更好的方法可以做到这一点。只需在核心视频像素缓冲区上设置属性,然后在调用vImageCVImageFormat\u 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设置colorspace ref。

    推荐文章