You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用VNRecognizeTextRequest识别日文竖排文本失败问题求助

Apple Vision Framework竖排中日韩文OCR返回nil问题

使用Apple Vision Framework的OCR能力识别图像文本时,横排日文、韩文、中文识别效果正常,但竖排文本始终返回nil。

已尝试操作:

  • 横排文本:日文、韩文、中文识别均正常
  • 竖排文本:上述语言下均返回nil
  • 旋转图像:尝试将图像旋转至不同方向,仍返回nil

示例图片:
竖排日文示例1
竖排日文示例2

原代码片段:

func ocr() {
    
    guard let image = UIImage(named: imageName) else {
        print("Failed to load image")
        return
    }
    
    guard let cgImage = image.cgImage else {
        print("Failed to get CGImage from UIImage")
        return
    }
    
    // Request handler
    let handler = VNImageRequestHandler(cgImage: cgImage, orientation: .right, options: [:])
    
    let recognizeRequest = VNRecognizeTextRequest { (request, error) in
                    
        if let error = error {
            print("Failed to recognize text: \(error.localizedDescription)")
            return
        }
        
        // Parse the results as text
        guard let result = request.results as? [VNRecognizedTextObservation] else {
            print("No text found")
            return
        }
        
        let stringArray = result.compactMap { result in
            result.topCandidates(1).first?.string
        }
        
        
        let recognizedString = stringArray.joined(separator: "\n")
        
        
        let singleLineText = recognizedString
            .components(separatedBy: .newlines)
            .joined(separator: " ")

        
        DispatchQueue.main.async {
            self.recognizeText = singleLineText
        }
    }
    recognizeRequest.recognitionLanguages = ["ja"]

    recognizeRequest.revision = VNRecognizeTextRequestRevision3

    recognizeRequest.automaticallyDetectsLanguage = true
    
    recognizeRequest.recognitionLevel = .accurate
    recognizeRequest.usesLanguageCorrection = false
    
    
    do {
        try handler.perform([recognizeRequest])
    } catch {
        print("Failed to perform text recognition: \(error.localizedDescription)")
    }

}

问题原因与解决方案

关键问题点

Vision Framework默认优先检测横排文本,未显式指定竖排文本阅读方向时,无法正确识别竖排东亚文字;同时固定设置图像方向为.right可能与实际图像方向不匹配,导致识别失败。

修复步骤

  1. 显式设置竖排文本阅读方向
    在创建VNRecognizeTextRequest后添加:

    recognizeRequest.textReadingDirection = .topToBottom
    

    引导框架识别从上到下的竖排文本布局。

  2. 传递正确的图像方向
    将UIImage的原始方向转换为VNImageOrientation,替代固定的.right:

    let vnOrientation = VNImageOrientation(image.imageOrientation)
    let handler = VNImageRequestHandler(cgImage: cgImage, orientation: vnOrientation, options: [:])
    
  3. 优化语言配置
    同时指定多种东亚语言,提升框架识别精度:

    recognizeRequest.recognitionLanguages = ["ja", "ko", "zh-Hans"]
    

修改后的完整代码

func ocr() {
    guard let image = UIImage(named: imageName) else {
        print("Failed to load image")
        return
    }
    
    guard let cgImage = image.cgImage else {
        print("Failed to get CGImage from UIImage")
        return
    }
    
    // 转换UIImage方向为VNImageOrientation
    let vnOrientation = VNImageOrientation(image.imageOrientation)
    let handler = VNImageRequestHandler(cgImage: cgImage, orientation: vnOrientation, options: [:])
    
    let recognizeRequest = VNRecognizeTextRequest { (request, error) in
        if let error = error {
            print("Failed to recognize text: \(error.localizedDescription)")
            return
        }
        
        guard let result = request.results as? [VNRecognizedTextObservation] else {
            print("No text found")
            return
        }
        
        let stringArray = result.compactMap { result in
            result.topCandidates(1).first?.string
        }
        
        let recognizedString = stringArray.joined(separator: "\n")
        let singleLineText = recognizedString.components(separatedBy: .newlines).joined(separator: " ")

        DispatchQueue.main.async {
            self.recognizeText = singleLineText
        }
    }
    
    // 指定支持的东亚语言
    recognizeRequest.recognitionLanguages = ["ja", "ko", "zh-Hans"]
    recognizeRequest.revision = VNRecognizeTextRequestRevision3
    recognizeRequest.automaticallyDetectsLanguage = true
    recognizeRequest.recognitionLevel = .accurate
    recognizeRequest.usesLanguageCorrection = false
    // 设置文本阅读方向为竖排(从上到下)
    recognizeRequest.textReadingDirection = .topToBottom
    
    do {
        try handler.perform([recognizeRequest])
    } catch {
        print("Failed to perform text recognition: \(error.localizedDescription)")
    }
}

补充说明

  • 确保运行环境为iOS 14及以上版本,VNRecognizeTextRequestRevision3才支持东亚竖排文本识别。
  • 若仍存在识别问题,可尝试调整recognitionLevel为.fast快速验证,再切换回.accurate获取高精度结果。

内容的提问来源于stack exchange,提问作者Basel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:49:54