xamarin - 相机预览和 OCR

标签 xamarin xamarin.android android-camera ocr tesseract

我是 android 开发的新手 - 我正在使用 Xamarin。

我正在尝试编写一个启动相机预览的应用程序,然后不断扫描传入的帧以获取文本(我使用的是 NuGet 的 Xamarin.Tesseract)。

换句话说,我不想让用户拍照然后进行 OCR 分析,而是希望他们只是将摄像机指向一些上面有文字的纸,我会不断地进行 OCR 分析,直到我检测到我正在搜索的特定文本),此时我会向用户竖起大拇指。

这是我到目前为止所采用的方法:

  • 初始化相机并设置预览回调

    _Camera = Android.Hardware.Camera.Open();
    _Camera.SetPreviewCallback(this);
    _Camera.StartPreview();
  • 在回调中,获取表示当前帧的字节并将其作为 Xamarin.Tesseract 的输入图像字节传递

    public void OnPreviewFrame(byte[] data, Android.Hardware.Camera camera)
    {
    等待 _TesseractApi.SetImage(data);///这挂了
    字符串文本 = _Api.Text;
    返回文本;
    }


  • 当前将 byte[] 传递到 Tesseract API 时会挂起。我很确定这将是因为数组中的字节要么是错误的编码,要么是我根本不了解相机 api!

    谁能给我一个写作方向的插入?

    最佳答案

    查看 TesseractApi.SetImage(byte[]) 的代码,它正在调用 BitmapFactory.DecodeByteArray()它需要一个有效的位图。

    不幸的是,相机预览会返回一个 YUV 图像,BitmapFactory 不支持该图像。

    这是将 YUV 图像转换为 JPEG 的代码,然后您可以将其传递给 Tesseract。

    private byte[] ConvertYuvToJpeg(byte[] yuvData, Android.Hardware.Camera camera)
    {
        var cameraParameters = camera.GetParameters();
        var width = cameraParameters.PreviewSize.Width;
        var height = cameraParameters.PreviewSize.Height;
        var yuv = new YuvImage(yuvData, cameraParameters.PreviewFormat, width, height, null);   
        var ms = new MemoryStream();
        var quality = 80;   // adjust this as needed
        yuv.CompressToJpeg(new Rect(0, 0, width, height), quality, ms);
        var jpegData = ms.ToArray();
    
        return jpegData;
    }
    

    关于xamarin - 相机预览和 OCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30920675/

    相关文章:

    ios - 从 XAMARIN 中的 UIScrollView 中删除 UIView

    c# - 无法正确部署应用程序 Xamarin

    xamarin - MvvmCross 5.4 在 ConsoleLogProvider 处使用 NullRef 启动应用程序时崩溃

    android - 将拍摄的图像设置为墙纸的相机应用程序未获得所需的结果

    java - Android 应用程序 - 带有相机应用程序的弹出菜单

    xamarin - DelayBind什么时候用?

    xamarin - Prism 和控制模板

    c# - 来自 Xamarin 应用程序的第二次 api 调用失败(第一次调用总是返回正常)

    Xamarin Native Android HttpClient,它位于哪里?

    安卓视频录制 2160p