使用VNRecognizeTextRequest识别日文竖排文本失败问题求助
Apple Vision Framework竖排中日韩文OCR返回nil问题
使用Apple Vision Framework的OCR能力识别图像文本时,横排日文、韩文、中文识别效果正常,但竖排文本始终返回nil。
已尝试操作:
- 横排文本:日文、韩文、中文识别均正常
- 竖排文本:上述语言下均返回nil
- 旋转图像:尝试将图像旋转至不同方向,仍返回nil
示例图片:

原代码片段:
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可能与实际图像方向不匹配,导致识别失败。
修复步骤
显式设置竖排文本阅读方向
在创建VNRecognizeTextRequest后添加:recognizeRequest.textReadingDirection = .topToBottom引导框架识别从上到下的竖排文本布局。
传递正确的图像方向
将UIImage的原始方向转换为VNImageOrientation,替代固定的.right:let vnOrientation = VNImageOrientation(image.imageOrientation) let handler = VNImageRequestHandler(cgImage: cgImage, orientation: vnOrientation, options: [:])优化语言配置
同时指定多种东亚语言,提升框架识别精度: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
相关产品推荐
相关产品推荐

