Apple的新CoreML框架具有预测功能,需要一个CVPixelBuffer.为了分类,UIImage必须在两者之间进行转换.
我从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))
Run Code Online (Sandbox Code Playgroud)
这个解决方案很快,适用于灰度图像.必须根据图像类型进行的更改包括:
kCVPixelFormatType_OneComponent8到另一个OSType(kCVPixelFormatType_32ARGB对于RGB)colorSpace到另一个CGColorSpace( …我们曾经如下初始化CVPixelBufferRef.
CVPixelBufferRef pxbuffer = NULL;
Run Code Online (Sandbox Code Playgroud)
但是在Swift中我们不能使用NULL,所以我们尝试了以下但当然XCODE希望我们将它用于初始化以使用它
let pxbuffer: CVPixelBufferRef
Run Code Online (Sandbox Code Playgroud)
但怎么样?
在Obj_C中,我们正在创建这样的缓冲区,但正如我在转换为Swift时尝试解释的那样,我已经在第一行停止了.
CVPixelBufferRef pxbuffer = NULL;
CVPixelBufferCreate(kCFAllocatorDefault, picGenislik,
frameHeight, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
&pxbuffer);
Run Code Online (Sandbox Code Playgroud) 所以,我必须扫描各种颜色的不同条码。例如,黑底黄条码或白底黄条码。
我对它们被传统的线性和 CCD 条码扫描仪识别没有任何问题。我曾尝试使用 Apple Vision 框架,但对它们不起作用。它们在白色背景的黑色条码上工作得非常好。
我的条形码都是 Code 128 所以我用这个代码:
var barcodeObservations: [String : VNBarcodeObservation] = [:]
for barcode in barcodes {
if let detectedBarcode = barcode as? VNBarcodeObservation {
if detectedBarcode.symbology == .code128 {
barcodeObservations[detectedBarcode.payloadStringValue!] = detectedBarcode
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 AVCaptureVideoDataOutputSampleBufferDelegate 下的“captureOutput”函数中,我使用它来过滤我的实时供稿为黑白,这有助于识别银色背景上的金色条码(第一张图片):
let context = CIContext(options: nil)
let currentFilter = CIFilter(name: "CIPhotoEffectMono")
currentFilter!.setValue(CIImage(cvImageBuffer: pixelBuffer), forKey: kCIInputImageKey)
let output = currentFilter!.outputImage!
context.render(output, to: pixelBuffer)
Run Code Online (Sandbox Code Playgroud)
如何让 Vision Framework 检测带有反转颜色的条形码?
“CIColorInvert”过滤器不起作用。
编辑:这些是条形码:
artificial-intelligence machine-learning swift apple-vision coreml
我能够将其转换UIImage为ARGB CVPixelBuffer,但现在我正在尝试将其转换UIImage为灰度级缓冲区.我认为自从代码通过以来我已经拥有它,但coreML模型抱怨说:
"Error Domain = com.apple.CoreML Code = 1"图像不是预期的类型8-Gray,而是Unsupported(40)"
这是CGContext我到目前为止的灰度:
public func pixelBufferGray(width: Int, height: Int) -> CVPixelBuffer? {
var pixelBuffer : CVPixelBuffer?
let attributes = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue, kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue]
let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(width), Int(height), kCVPixelFormatType_8IndexedGray_WhiteIsZero, attributes as CFDictionary, &pixelBuffer)
guard status == kCVReturnSuccess, let imageBuffer = pixelBuffer else {
return nil
}
CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
let imageData = CVPixelBufferGetBaseAddress(imageBuffer)
guard let context = CGContext(data: imageData, width: Int(width), height:Int(height),
bitsPerComponent: 8, bytesPerRow: …Run Code Online (Sandbox Code Playgroud) 在Python中,我使用keras训练了一个图像分类模型,以接收作为[224,224,3]数组的输入并输出预测(1或0).当我加载保存模型并将其加载到xcode时,它声明输入必须是MLMultiArray格式.
有没有办法让我将UIImage转换为MLMultiArray格式?或者有没有办法让我改变我的keras模型接受CVPixelBuffer类型对象作为输入.
我明白我的问题与编程本身没有直接关系,看起来更像是研究.但可能有人可以在这里提出建议.
我对app有一个想法,当用户拍照并且应用程序将分析它并剪切除了所需对象(例如一块布料)之外的每一个并且将其保存在单独的图像中.昨天这是一项非常艰巨的任务,因为开发人员应该创建相当好的神经网络并对其进行教育.但在苹果发布具有真正深度相机的iPhone X之后,一半的问题都可以解决.根据我的理解,开发人员可以更轻松地删除背景,因为iPhone将知道背景的位置.
所以只留下几个问题:
I.带有真正深度相机的iPhone X拍摄的照片格式是什么?是否有可能创建能够使用图片深度信息的神经网络?
II.我已经阅读了有关CoreML的内容,尝试了一些示例,但对我来说仍然不清楚 - 如何在导入CoreML的外部神经网络方面实现以下行为:
神经网络将图像作为输入数据.
NN分析它,在图像上找到所需的对象.
NN不仅返回确定的对象类型,还返回裁剪对象本身或应裁剪区域的坐标/像素数组.
应用程序从NN获取所有必需的信息,并执行必要的操作以裁剪图像并将其保存到另一个文件或其他任何文件.
任何建议将被认真考虑.