Что у меня есть:
Ссылаясь на код Chroma Key от Apple, говорится, что мы можем создать куб фильтра Chroma Key с помощью
func chromaKeyFilter(fromHue: CGFloat, toHue: CGFloat) -> CIFilter?
{
// 1
let size = 64
var cubeRGB = [Float]()
// 2
for z in 0 ..< size {
let blue = CGFloat(z) / CGFloat(size-1)
for y in 0 ..< size {
let green = CGFloat(y) / CGFloat(size-1)
for x in 0 ..< size {
let red = CGFloat(x) / CGFloat(size-1)
// 3
let hue = getHue(red: red, green: green, blue: blue)
let alpha: CGFloat = (hue >= fromHue && hue <= toHue) ? 0: 1
// 4
cubeRGB.append(Float(red * alpha))
cubeRGB.append(Float(green * alpha))
cubeRGB.append(Float(blue * alpha))
cubeRGB.append(Float(alpha))
}
}
}
let data = Data(buffer: UnsafeBufferPointer(start: &cubeRGB, count: cubeRGB.count))
// 5
let colorCubeFilter = CIFilter(name: "CIColorCube", withInputParameters: ["inputCubeDimension": size, "inputCubeData": data])
return colorCubeFilter
}
Затем я создал функцию, позволяющую вставлять любое изображение в этот фильтр и возвращать отфильтрованное изображение.
public func filteredImage(ciimage: CIImage) -> CIImage? {
let filter = chromaKeyFilter(fromHue: 110/360, toHue: 130/360)! //green screen effect colors
filter.setValue(ciimage, forKey: kCIInputImageKey)
return RealtimeDepthMaskViewController.filter.outputImage
}
Затем я могу выполнить эту функцию для любого изображения и получить изображение с цветным ключом.
if let maskedImage = filteredImage(ciimage: ciimage) {
//Do something
}
else {
print("Not filtered image")
}
Проблемы с обновлением:
let data = Data(buffer: UnsafeBufferPointer(start: &cubeRGB, count: cubeRGB.count))
Однако, как только я обновил Xcode до версии 11.6, я получаю предупреждение Initialization of 'UnsafeBufferPointer<Float>' results in a dangling buffer pointer
, а также ошибку времени выполнения Thread 1: EXC_BAD_ACCESS (code=1, address=0x13c600020)
в строке кода выше.
Я попытался решить эту проблему с помощью этого ответа, чтобы исправить новое UnsafeBufferPointer
предупреждение Swift. Затем предупреждение исправляется, и у меня больше нет ошибки во время выполнения.
Проблема
Теперь, хотя предупреждение не появляется и у меня не возникает ошибки во время выполнения, я все равно получаю оператор печати Not filtered image
. Я предполагаю, что проблема связана с тем, как данные обрабатываются или удаляются, не совсем уверен, как правильно обрабатывать UnsafeBufferPointers
вместе с Data
.
Как правильно получить Data
для хроматического ключа?