2015-06-18 4 views
4

Я новичок в разработке Android. Я использую Xamarin.Предварительный просмотр камеры и OCR

Я пытаюсь написать приложение, которое инициирует предварительный просмотр камеры, а затем постоянно сканирует входящие кадры для текста (я использую Xamarin.Tesseract от NuGet).

Другими словами, я не хочу, чтобы пользователь сделал фотографию, а затем выполнил анализ OCR, вместо этого я хочу, чтобы они просто указали на видеокамеру на какой-то бумаге с текстом на ней, я буду постоянно делать анализ OCR, пока я не обнаружу конкретный текст, который я ищу), в этот момент я дам большие пальцы для пользователя.

Это подход, который я пошел вниз до сих пор:

  1. Initialise камеру и установить предварительного обратного вызова

     
    _Camera = Android.Hardware.Camera.Open();   
    _Camera.SetPreviewCallback(this); 
    _Camera.StartPreview();    
    
  2. В Обратного, возьмите байты, представляющие текущий кадр и передать это как байты входного изображения для Xamarin.Tesseract

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

В настоящее время он висит при передаче байта [] в Tesseract API. Я уверен, что это произойдет потому, что байты в массиве - это неправильная кодировка, или я принципиально не понимаю Camera api!

Может ли кто-нибудь дать мне толчок в направлении записи?

+0

это выглядит как Android возвращает необработанное изображение для камеры в обратном вызове, и я ожидаю, что Tesseract работает с конкретными форматами – Jason

+0

изображения Как вы этого достигли, не имея проблемы с памятью? Я сейчас делаю то же самое, но застрял в данный момент – DrPatience

ответ

2

Рассматривая код 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; 
} 
+1

Ты, сэр, джентльмен и знаток. – Darrell

+0

В настоящее время я делаю что-то подобное, я в своем случае Я обрезаю часть потока изображений камеры и устанавливаю это как изображение тессеракта, чтобы я сосредоточился на нужном разделе, а также на меньшем изображении. Проблема заключается в том, что «не хватает памяти» примерно через 15-20 секунд. – DrPatience

+0

@ Даррелл. Любая помощь будет очень благодарна – DrPatience

Смежные вопросы