编辑:固定。一个工作示例位于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 我缺少什么?