如何处理 Tesseract OCR 4.0 中的致命错误 iOS Swift

How to handle Fatal Error in Tesseract OCR 4.0 iOS Swift

我在我的应用程序中使用 Tesseract OCR。对于图库图片,如果我使用非常清晰的图片(例如这张图片),效果很好 5 text image

但对于某些图像,它会给我一个错误,并且应用程序在我的 iPhone 中崩溃。当我也使用相机图像时,应用程序几乎总是崩溃。现在我想知道如何处理 Swift 2.2 中的致命错误。我怎样才能显示图像不可读的警报而不是让我的应用程序崩溃。我试过 do {} catch {} 但它不起作用。

 func checkWithOCR() throws{

    let ocrSample = myImageView.image //image picker from gallery

    //FATAL ERROR ON THIS LINE.  
    tesseract.image = ocrSample!.fixOrientation().g8_blackAndWhite() 
        if(tesseract.recognize()){
            let recognizedText = tesseract.recognizedText
            if recognizedText != nil{
                print("recognizedText: \(recognizedText)")

                let trimmedText = String(recognizedText.characters.filter { !" \n\t\r,".characters.contains([=12=]) })
                myImageView.image = tesseract.image
                convertCurrency(Float(trimmedText)!) //convert the tesseract text
            }
        }

    SwiftSpinner.hide()
}

这是错误: 识别文本: 致命错误:在展开可选值

时意外发现 nil

我知道为什么会出现这个错误,因为我上面提到的行没有值。如果发生此错误而不是崩溃,我如何显示警告框。

P.S: I tried if ( ocrSample!.fixOrientation().g8_blackAndWhite() != nil ) {} 

没用

UIImageView 上的 image 是一个 UIImage 可选的,这意味着它可以有一个值(包含图像),也可以是 nil

所以,当你说:

let ocrSample = myImageView.image

你的 ocrSample 现在是一个 UIImage 可选的,你必须在使用前打开它。

当你说:

tesseract.image = ocrSample!.fixOrientation().g8_blackAndWhite()

你是通过使用 ! 强制解包你的 ocrSample,这意味着你告诉编译器只解包并使用可选的,不管它是否是 nil。当您尝试使用包含 nil.

的解包可选时,这会导致崩溃

您可以使用 if let 解包 ocrSample,如下所示:

func checkWithOCR() throws{

    if let ocrSample = myImageView.image {
        tesseract.image = ocrSample.fixOrientation().g8_blackAndWhite() 
        if(tesseract.recognize()){
            let recognizedText = tesseract.recognizedText
            if recognizedText != nil{
                print("recognizedText: \(recognizedText)")

                let trimmedText = String(recognizedText.characters.filter { !" \n\t\r,".characters.contains([=12=]) })
                myImageView.image = tesseract.image
                convertCurrency(Float(trimmedText)!) //convert the tesseract text
            }
        }
        SwiftSpinner.hide()
    } else {
        //No value could be found, do your error handling here
    }
}

这里:

if let ocrSample = myImageView.image

你正在尝试将 myImageView.image 的值解包到 ocrSample,如果成功,那么你肯定知道 ocrSample 不是 nil 并且可以使用它开始。如果失败,那么您可以进行错误处理、显示警报视图以及您需要做的任何其他事情。

希望对你有所帮助。