【问题标题】:Camera Preview and OCR相机预览和 OCR
【发布时间】:2015-09-04 09:44:10
【问题描述】:

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

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

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

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

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

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

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

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

谁能在写作方向上给我指点一下?

【问题讨论】:

  • 看起来 Android 在回调中返回了相机的原始位图,我希望 Tesseract 可以使用特定的图像格式
  • 您是如何在没有内存问题的情况下实现这一目标的?我目前也在做同样的事情,但现在卡住了

标签: xamarin xamarin.android android-camera ocr tesseract


【解决方案1】:

查看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;
}

【讨论】:

  • 我目前正在做类似的事情,我是我的情况,我裁剪相机图像流的一部分并将其设置为 tesseract 的图像,以确保我也专注于必要的部分作为一个较小的图像。大约 15 到 20 秒后面临的问题是“内存不足”
  • @DrPatience - 你在处理 MemoryStream 吗?
  • 您也可能希望降低采样率。我的意思是,如果处理来自单个帧的数据输入需要很长时间,而不是尝试处理所有帧,那么如果工作量过多,则允许丢弃一些帧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多