应用筛选器后无法将图像识别为UIImage



我正在尝试实现一种可以处理脏的或稍微模糊的条形码的条形码扫描仪。我们已经在我们的Android应用程序中成功地实现了这一点,方法是对相机输入图像应用过滤器进行锐化,然后使用GoogleML扫描生成的图像。不幸的是,在iOS中,我们遇到了许多问题。

在通过设备摄像头获得图像后,我正试图在上面运行一个锐化过滤器,如下所示:

if let inputImage = CIImage(image: image) {
let sharpFilter = CIFilter(name: "CIUnsharpMask")!
sharpFilter.setValue(inputImage, forKey: kCIInputImageKey)
sharpFilter.setValue(2.0, forKey: "inputIntensity")
sharpFilter.setValue(1.0, forKey: "inputRadius")
let outputImage = sharpFilter.outputImage!
let outputUIImage = UIImage(ciImage: outputImage)
self.detectBarcodes(image: outputUIImage)
}

我的detectBarcodes函数将锐化后的UIImage作为参数。在这个方法中,我正在创建VisionImage的一个实例。VisionImage构造函数如下:

VisionImage(image: UIImage)

在我的detectBarcodes函数中,我正在创建一个VisionImage的实例,如下所示:

func detectBarcodes(image: UIImage?) {
guard let image = image else { return }
let format = VisionBarcodeFormat.all
let barcodeOptions = VisionBarcodeDetectorOptions(formats: format)
let barcodeDetector = vision.barcodeDetector(options: barcodeOptions)
let imageMetadata = VisionImageMetadata()
imageMetadata.orientation = UIUtilities.visionImageOrientation(from: image.imageOrientation)
let visionImage = VisionImage(image: image) // crashes here
visionImage.metadata = imageMetadata
//...
}

我已经验证了传递到构造函数的图像是有效的UIImage,但是,对VisionImage构造函数的调用失败,并显示以下日志:

Terminating app due to uncaught exception 'FIRInvalidImage', reason: 'Invalid image. UIImage.CGImage must not be NULL.'

奇怪的是,只有当图像经过锐化滤波器处理时,才会出现这种错误。如果我在运行锐化过滤器之前将图像传递给detectBarcodes函数,那么VisionImage构造函数会成功,但图像太模糊,无法进行扫描。

有人能分享为什么会发生这种情况的信息吗?或者,有人对扫描模糊的条形码有什么更好的建议吗(当客户不会为可靠的第三方库付费时(?

谢谢!

似乎VisionImage内部的某些代码想要使用CGImage图像数据,但是cgImage属性的文档中指出:

如果UIImage对象是使用CIImage对象初始化的,则属性的值为NULL。

在您的情况下,这正是发生的事情,因为您的UIImage是根据Core Image筛选器结果创建的。

您可以使用本问题中建议的技术来创建所需的CGImage