Новая платформа CoreML Apple имеет функцию прогнозирования, которая принимает CVPixelBuffer
. Чтобы классифицировать a UIImage
, должно быть сделано преобразование между ними.
Код конверсии, который я получил от Apple Engineer:
1 // image has been defined earlier
2
3 var pixelbuffer: CVPixelBuffer? = nil
4
5 CVPixelBufferCreate(kCFAllocatorDefault, Int(image.size.width), Int(image.size.height), kCVPixelFormatType_OneComponent8, nil, &pixelbuffer)
6 CVPixelBufferLockBaseAddress(pixelbuffer!, CVPixelBufferLockFlags(rawValue:0))
7
8 let colorspace = CGColorSpaceCreateDeviceGray()
9 let bitmapContext = CGContext(data: CVPixelBufferGetBaseAddress(pixelbuffer!), width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelbuffer!), space: colorspace, bitmapInfo: 0)!
10
11 bitmapContext.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
Это решение быстро и для изображения в градациях серого. Изменения, которые должны выполняться в зависимости от типа изображения, следующие:
- Строка 5 |
kCVPixelFormatType_OneComponent8
в другойOSType
(kCVPixelFormatType_32ARGB
для RGB) - Линия 8 |
colorSpace
в другойCGColorSpace
(CGColorSpaceCreateDeviceRGB
для RGB) - Линия 9 |
bitsPerComponent
к числу бит на пиксель памяти (32 для RGB) - Линия 9 |
bitmapInfo
к ненулевомуCGBitmapInfo
свойству (kCGBitmapByteOrderDefault
по умолчанию)