iOS平台如何利用semanticSegmentationSkyMatteImage生成天空遮罩?
解决iPhone图片天空语义遮罩的问题
首先明确几个关键前提:
- 天空语义分割的
AVSemanticSegmentationMatteType.sky是iOS 15.0及以上才引入的,WWDC2019的225号视频只覆盖了人物相关的分割类型(头发、皮肤等),这就是你看不到Sky类型的核心原因。 - 硬件上需要搭载A12仿生及以上芯片的设备(比如iPhone XS/XR及以后机型)才支持实时捕获天空遮罩。
正确的捕获流程
如果你的设备和系统版本符合要求,修改捕获代码如下:
// 先判断是否支持天空分割类型 if #available(iOS 15.0, *), self.photoOutput.availableSemanticSegmentationMatteTypes.contains(.sky) { photoSettings.enabledSemanticSegmentationMatteTypes = [.sky] // 也可添加其他需要的分割类型 photoSettings.embedsSemanticSegmentationMattesInPhoto = true }
建议不要直接赋值availableSemanticSegmentationMatteTypes,单独指定.sky能减少不必要的资源占用。
加载天空遮罩
拍摄并保存为HEIC格式后,加载遮罩的代码是正确的,但要确保图片确实嵌入了天空遮罩:
if #available(iOS 15.0, *) { let skyMatte = CIImage(contentsOf: imageURL, options: [.auxiliarySemanticSegmentationSkyMatte: true]) // 可将skyMatte转为UIImage或用于后续图像合成 }
简便替代方案(无需捕获时嵌入遮罩)
如果你的场景不需要实时捕获遮罩,或者设备/系统版本不满足捕获要求,可以用iOS 16.0及以上的CISegmentSky滤镜直接生成天空遮罩:
if #available(iOS 16.0, *) { let inputImage = CIImage(contentsOf: imageURL)! let skySegmentFilter = CIFilter(name: "CISegmentSky")! skySegmentFilter.setValue(inputImage, forKey: kCIInputImageKey) // 提取天空遮罩(输出图像的alpha通道即为遮罩) let skyMatte = skySegmentFilter.outputImage?.applyingFilter("CIMaskToAlpha") }
这个滤镜会直接分析图片内容生成天空区域的遮罩,无需依赖拍摄时的额外设置,适配场景更灵活。
内容的提问来源于stack exchange,提问作者Damien Jardon
相关产品推荐
相关产品推荐

