应用滤镜后无法将图像识别为UIImage

时间:2019-11-19 03:46:38

标签: ios swift firebase barcode-scanner

我正在尝试实现一种条形码扫描器,该条形码扫描器可以处理脏的或稍微模糊的条形码。我们已经成功地在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.'

奇怪的是,仅当图像已经由锐化滤镜处理后,才会发生此错误。如果我在运行SharpenFilter之前将图像传递给detectBarcodes函数,则VisionImage构造函数会成功,但是图像太模糊而无法进行扫描。

任何人都可以分享发生这种情况的任何信息吗?还是有人对扫描模糊的条形码有更好的建议(当客户不会为可靠的第三方lib付款时)?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  

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

就您而言,这就是发生的事情,因为您的UIImage是根据Core Image过滤器结果创建的。

您可以使用this question中建议的技术来创建所需的CGImage