11
Nowy framework CoreML firmy Apple ma funkcję przewidywania, która ma CVPixelBuffer
. Aby dokonać klasyfikacji UIImage
, należy dokonać konwersji między tymi dwoma.Jak przekonwertować UIImage do CVPixelBuffer
kod konwersji dostałem od inżyniera Apple:
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))
To rozwiązanie jest w szybki i jest na skali szarości. Zmiany, które należy wprowadzić w zależności od typu obrazu, to:
- Linia 5 |
kCVPixelFormatType_OneComponent8
do innegoOSType
(dla RGB) - Linia 8 |
colorSpace
do innegoCGColorSpace
(CGColorSpaceCreateDeviceRGB
dla RGB) - Linia 9 |
bitsPerComponent
do liczby bitów na piksel pamięci (32 dla RGB) - Linia 9 |
bitmapInfo
do niezerowąCGBitmapInfo
własności (kCGBitmapByteOrderDefault
jest domyślnym)
myślę 'CVPixelBuffer' to tylko konwencja dla obrazów z kamery, są też 'ciImage',' cgImage' dostępny – WeiJay
Dlaczego nie używać Vision Framework? Możesz (1) zainicjować obiekt 'VNCoreMLModel', a następnie (2)' VNCoreMLRequest' za pomocą procedury obsługi zakończenia, a następnie użyć (3) 'VNImageRequestHandler' - który może przyjąć adres URL' CIImage' lub plik. Wyniki są zbiorem obiektów 'VNClassificationObservation'. Teraz oczywiście, jeśli chcesz przekonwertować 'UIImage' na' CVPixelBuffer' - którego tak naprawdę ** nigdzie nie powiedziałeś ** wewnątrz ** twojego pytania, które nie zawierało pytania :-) - ty można po prostu wyszukać w Internecie i znaleźć to: https://gist.github.com/cieslak/743f9321834c5a40597afa1634a48343 – dfd
@dfd Tak, chciałem przekonwertować 'UIImage' na' CVPixelBuffer' na potrzeby używania CoreML model, ale łaskawie udało mi się rozwiązać ten problem przez inżyniera Apple w WWDC z powyższym kodem. Biorąc pod uwagę, że kilka osób na konferencji miało ten sam problem, doszedłem do wniosku, że podzielę się rozwiązaniem, które osiąga cel znacznie prostszy niż rozwiązanie Github. Dzięki za sugestie! – Ryan