Я использую приведенный ниже код, чтобы создать красную маску из Cipersemanse и затем изменить код/код/код> и затем изменить код/код/код и затем изменить код/код/код/код. /> Предупреждение: Cipersonsementation требует физического устройства. Он использует Vision API, который, я считаю, не поддерживается на симуляторе.
Код: Выделить всё
if let image = UIImage(named: "demo9"), let editted = applyPersonFilter(to: image) {
imageView.image = editted
}
func applyPersonFilter(to image: UIImage) -> UIImage? {
guard let ciImage = CIImage(image: image) else { return nil }
print("ciImage: \(ciImage.extent)") // prints (0.0, 0.0, 2882.0, 1300.0)
let context = CIContext(options: nil)
let personMaskFilter = CIFilter(name: "CIPersonSegmentation", parameters: [
kCIInputImageKey: ciImage,
"inputQualityLevel": 0
])
let maskImage = personMaskFilter?.outputImage?.cropped(to: ciImage.extent) as? CIImage
print("maskImage: \(maskImage?.extent)") // prints (0.0, 0.0, 2016.0, 1300.0)
let solidColorFilter = CIFilter(name: "CIConstantColorGenerator")
solidColorFilter?.setValue(CIColor.cyan, forKey: kCIInputColorKey)
let blendFilter = CIFilter(name: "CIBlendWithRedMask", parameters: [kCIInputImageKey: ciImage, kCIInputBackgroundImageKey: solidColorFilter?.outputImage?.cropped(to: ciImage.extent) as Any, kCIInputMaskImageKey: maskImage as Any])
guard let outputImage = blendFilter?.outputImage else {
return nil
}
print("blendFilter: \(outputImage.extent)") // prints (0.0, 0.0, 2882.0, 1300.0)
guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return nil }
return UIImage(cgImage: cgImage)
}
Как вы видите, позиция Mask не является правильной. Это связано с тем, что красная маска, созданная Cipersonsementation , имеет иной степени , чем исходное изображение.>
Подробнее здесь: https://stackoverflow.com/questions/794 ... -different
Мобильная версия