ios - TesseractOCR BAD_ACCESS

标签 ios tesseract arkit

我正在从 ARKit 捕获一帧并从中获取 CVPixelBuffer

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    if self.detectionFrame != nil {
        return
    }
    self.detectionFrame = frame
    // Retain the image buffer for Vision processing.
    let pixelBuffer = frame.capturedImage
    DispatchQueue.global().async {
        self.recognizeText(from: pixelBuffer)
    }
}

recognizeText 中,我继续初始化 Tesseract 并在将图像转换为 UIImage 后传递图像。

func recognizeText(from image:CVPixelBuffer){
    // 1
    if let tesseract = MGTesseract(language: "jpn+jpn_vert") {
        // 2
        tesseract.engineMode = .tesseractCubeCombined
        // 3
        tesseract.pageSegmentationMode = .auto
        // 4
        let ciImage = CIImage(cvPixelBuffer: image)
        tesseract.image = UIImage(ciImage: ciImage)
        // 5
        tesseract.recognize()
        // 6
        let text = tesseract.recognizedText
        print(text ?? "")
    }
}

这个结果总是在

Thread 15: EXC_BAD_ACCESS (code=1, address=0x0)

- (Pix *)pixForImage:(UIImage *)image
{
    int width = image.size.width;
    int height = image.size.height;

    CGImage *cgImage = image.CGImage;
    CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
    const UInt8 *pixels = CFDataGetBytePtr(imageData); <<< EXC_BAD_ACCESS

    size_t bitsPerPixel = CGImageGetBitsPerPixel(cgImage);
    size_t bytesPerPixel = bitsPerPixel / 8;
    size_t bytesPerRow = CGImageGetBytesPerRow(cgImage);

我做错了什么?

最佳答案

找到缺失的部分,要将缓冲区转换为 UIImage,您需要提供 CIContext 和缓冲区大小

        let ciImage = CIImage(cvPixelBuffer: pixBuffer)
        let ciContext = CIContext(options: nil)
        if let videoImage = ciContext.createCGImage(ciImage, from: CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(pixBuffer), height: CVPixelBufferGetHeight(pixBuffer))) {

            self.prcessedImage = UIImage(cgImage: videoImage )
            tesseract.image = self.prcessedImage
            // 5
            tesseract.recognize()
            // 6
            let text = tesseract.recognizedText
            print(text ?? "")
        }

关于ios - TesseractOCR BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56246799/

相关文章:

Xcode 中的 iPhone 存储和检索

ios - Phone-gap 应用程序 (ios-7) 是否可以在 ios-8 上运行?

android - 将位图中特定颜色以外的所有颜色转换为白色

ios - 使用arkit以3D方式显示实时信息,可能使用scntext

iphone - 如何对不支持外观的元素进行全局样式化

ios - iOS SDK 5.0 可以安全地安装在 4.3 旁边吗?

tesseract - 如何使用命令行获得对 tesseract 的字符明智的信心?

java - 使用 tesseract 检测明亮背景上的白色文本

swift - CAKeyframeAnimation 之后的 SCNNode 位置值不正确

swift - 按钮旋转 3D 对象 ARKit 2