我正在尝试实现一种条形码扫描器,该条形码扫描器可以处理脏的或稍微模糊的条形码。我们已经成功地在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付款时)?
谢谢!
答案 0 :(得分:2)
VisionImage
中的某些代码似乎想使用CGImage
图像数据,但是cgImage
属性的文档指出:
如果UIImage对象是使用CIImage对象初始化的,则该属性的值为NULL。
就您而言,这就是发生的事情,因为您的UIImage
是根据Core Image过滤器结果创建的。
您可以使用this question中建议的技术来创建所需的CGImage