白木耳 2024-11-15 14:32 采纳率: 76.5%
浏览 6

Xamarin Tesseract-OCR

using System;
using System.Threading.Tasks;
using XLabs.Ioc;
using Xamarin.Forms;
using Tesseract;
using Xamarin.Essentials;
using System.IO;
using Plugin.ImageEdit;
 
   public partial class MainPage : ContentPage
    {

        private readonly ITesseractApi _tesseract;

 
        public MainPage()
        {
            InitializeComponent();
            
            _tesseract = Resolver.Resolve<ITesseractApi>();

        }



        private byte[] GetImageBytes(Stream stream)
        {
           byte[] imageBytes;
            using (var memoryStream = new System.IO.MemoryStream())
            {
                stream.CopyTo(memoryStream);
                imageBytes = memoryStream.ToArray();
            }
            return imageBytes;
        }




        private async void LoadImageButton_OnClicked(object sender, EventArgs e)
        {

            var resultado = await MediaPicker.PickPhotoAsync(new MediaPickerOptions
            {
                Title = "Escolha uma foto"
            });

            if (resultado != null)
            {
                var stream = await resultado.OpenReadAsync();
                byte[] imageArray = GetImageBytes(stream);

                using (var image = await CrossImageEdit.Current.CreateImageAsync(imageArray))
                {
                    byte[] croped = await Task.Run(() =>
                            image.Crop(10, 10, 150, 150)
                                 .Resize(100, 0)
                                 .ToPng()
                    );

                    if (!_tesseract.Initialized) await _tesseract.Init("eng");
                    var tessResult = await _tesseract.SetImage(croped);
                    TextLabel.Text = _tesseract.Text;

                    minhaImagem.Source = ImageSource.FromStream(() => new MemoryStream(croped));
                }

            }

        }

    }
}

我_tesseract.Text 結果都是空值

  • 写回答

1条回答 默认 最新

  • 趣享先生 优质创作者: 编程框架技术领域 2024-11-15 15:02
    关注

    该回答参考ChatGPT,由吾为汝整理提供如若有用,还请题主采纳!

    在使用 Tesseract-OCR 进行图像识别时,如果 _tesseract.Text 的结果为空,可能有几个原因。我们可以逐步检查和解决这个问题。以下是一些可能的原因和解决方案:

    1. 图像质量

      • 确保所选图像的质量足够高,文字清晰可见。模糊或低对比度的图像可能导致识别失败。
    2. 图像预处理

      • 在进行 OCR 之前,确保图像经过适当的预处理。可以尝试调整图像的对比度、亮度或使用二值化处理来提高识别率。
    3. Tesseract 初始化

      • 确保 Tesseract 初始化成功。可以在初始化后检查 _tesseract.Initialized 的状态,确保它为 true
    4. 语言包

      • 确保你已经正确加载了所需的语言包。在你的代码中,使用 await _tesseract.Init("eng"); 初始化英语语言包,确保该语言包文件存在于应用程序的可访问路径中。
    5. 图像格式

      • 确保传递给 Tesseract 的图像格式是支持的。你可以尝试将图像转换为其他格式(如 BMP 或 JPEG)进行测试。
    6. 错误处理

      • 添加错误处理代码,检查在设置图像和获取文本时是否有异常发生。例如,使用 try-catch 块来捕获可能的异常并输出错误信息。
    7. 调试信息

      • 在设置图像后,检查 Tesseract 的状态和返回值。可以使用 _tesseract.GetHOCRText()_tesseract.GetUTF8Text() 来获取更多调试信息。

    以下是修改后的代码示例,增加了一些调试信息和错误处理:

    private async void LoadImageButton_OnClicked(object sender, EventArgs e)
    {
        var resultado = await MediaPicker.PickPhotoAsync(new MediaPickerOptions
        {
            Title = "Escolha uma foto"
        });
    
        if (resultado != null)
        {
            var stream = await resultado.OpenReadAsync();
            byte[] imageArray = GetImageBytes(stream);
    
            using (var image = await CrossImageEdit.Current.CreateImageAsync(imageArray))
            {
                byte[] croped = await Task.Run(() =>
                        image.Crop(10, 10, 150, 150)
                             .Resize(100, 0)
                             .ToPng()
                );
    
                if (!_tesseract.Initialized) await _tesseract.Init("eng");
                
                try
                {
                    await _tesseract.SetImage(croped);
                    string recognizedText = _tesseract.Text;
    
                    if (string.IsNullOrEmpty(recognizedText))
                    {
                        Console.WriteLine("识别结果为空,请检查图像质量或预处理步骤。");
                    }
                    else
                    {
                        TextLabel.Text = recognizedText;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"OCR 处理时发生错误: {ex.Message}");
                }
    
                minhaImagem.Source = ImageSource.FromStream(() => new MemoryStream(croped));
            }
        }
    }
    

    请逐步检查这些方面,看看是否能够解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月15日