相机预览和 OCR
Camera Preview and OCR
我是 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)
{
await _TesseractApi.SetImage(data); /// this hangs
string text = _Api.Text;
return 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;
}
我是 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) { await _TesseractApi.SetImage(data); /// this hangs string text = _Api.Text; return 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;
}