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

Macos Mac上的vImage:无法从核心视频转换,macos,avfoundation,accelerate-framework,core-video,vimage,Macos,Avfoundation,Accelerate Framework,Core Video,Vimage,编辑:已修复。一个工作样本在 我正在尝试阅读MacBookPro Facetime摄像头的提要,以便使用vImage框架对其进行处理。我遵循苹果的例子,它是为iOS编写的 我对创建vImageConverter很感兴趣,它创建了一个vImage可以使用的图像缓冲区。调用vImageConverter\u CreateForCVToCGImageFormat()失败,控制台错误为“srcCVFormat中的信息不足,无法解码图像。vImageCVImageFormatError=-21601” 同

编辑:已修复。一个工作样本在

我正在尝试阅读MacBookPro Facetime摄像头的提要,以便使用vImage框架对其进行处理。我遵循苹果的例子,它是为iOS编写的

我对创建vImageConverter很感兴趣,它创建了一个vImage可以使用的图像缓冲区。调用
vImageConverter\u 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
请注意,图像类型(4字母代码)不同,RGB基本颜色空间也不同。我在Mac上尝试过使用dcip3ColorSpace而不是deviceRGB,结果是一样的


创建此vImageConverter时,我缺少了什么?

-21601错误代码表示源CV格式缺少色度定位信息(有关色度定位的详细背景信息,请参阅)。您可以通过使用
vImageCVImageFormat\u SetChromaSiting
显式设置来解决此问题。因此,在设置格式的颜色空间之后,在创建转换器之前(即,在您有
打印(cvImageFormat)
的位置),立即添加以下内容:

        vImageCVImageFormat_SetChromaSiting(cvImageFormat,
                                            kCVImageBufferChromaLocation_Center)
干杯


simon

错误代码
-21601
表示源CV格式缺少色度定位信息(有关色度定位的详细背景信息,请参阅)。您可以通过使用
vImageCVImageFormat\u SetChromaSiting
显式设置来解决此问题。因此,在设置格式的颜色空间之后,在创建转换器之前(即,在您有
打印(cvImageFormat)
的位置),立即添加以下内容:

        vImageCVImageFormat_SetChromaSiting(cvImageFormat,
                                            kCVImageBufferChromaLocation_Center)
干杯


simon

因此,虽然关于调用vImage格式上的设置chorma属性的答案确实有效,但有更好的方法可以做到这一点。只需在core video pixel buffer上设置属性,然后在调用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设置colorspace ref。

因此,虽然关于在vImage格式上调用设置chorma属性的答案确实有效,但有更好的方法可以做到这一点。只需在core video pixel buffer上设置属性,然后在调用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设置colorspace ref。

就是这样!而色度定位的文章是一些严重的书呆子狙击:)就是这样!而《色度定位》这篇文章则是一些严重的书呆子狙击:)