0

编辑:固定。一个工作示例位于https://github.com/halmueller/vImage-mac-sample

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

我正忙于创建 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 我缺少什么?

4

2 回答 2

3

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

        vImageCVImageFormat_SetChromaSiting(cvImageFormat,
                                            kCVImageBufferChromaLocation_Center)

干杯!

西蒙

于 2018-03-14T10:36:21.203 回答
0

因此,虽然关于调用在 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 设置颜色空间参考。

于 2018-12-11T21:43:59.167 回答