相机预览和OCR

Dar*_*ell 5 ocr tesseract xamarin.android android-camera xamarin

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

我正在尝试编写一个启动摄像头预览的应用程序,然后不断扫描传入的帧以查找文本(我正在使用来自NuGet的Xamarin.Tesseract).

换句话说,我不想让用户拍照然后进行OCR分析,而是我希望他们只是将摄像机对准一些带有文字的纸张,我会不断进行OCR分析,直到我检测到我正在搜索的特定文本),此时我会对用户大加赞赏.

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

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

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

    public void OnPreviewFrame(byte[] data, Android.Hardware.Camera camera)
    {        
    await _TesseractApi.SetImage(data); /// this hangs                
    string text = _Api.Text;
    return text;          
    } 
    
    

当将byte []传递给Tesseract API时,这会挂起.我很确定这是因为数组中的字节编码错误,或者我从根本上不了解Camera api!

任何人都可以在写方向上轻推一下吗?

Kil*_*man 6

查看 的代码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;
}
Run Code Online (Sandbox Code Playgroud)