halkar / Tesseract.Xamarin

Tesseract OCR wrapper for Xamarin
MIT License
121 stars 40 forks source link

0.3.1 not initializing ITesseractApi #30

Closed hyderlyger closed 7 years ago

hyderlyger commented 7 years ago

api.Init("eng") is returning false even though i have added lang files in assets. (Droid)

halkar commented 7 years ago

@hyderlyger can you share the project?

rakesh79mca commented 7 years ago

TesseractApi _api = new TesseractApi (this, AssetsDeployment.OncePerInitialization); _api.Init ("eng");

when i debugging code and check _api intialized value it is returning false

hyderlyger commented 7 years ago

I turned out to be using wrong language files i.e version 3.* , it worked fine with version 2.* files. Thanks for your reply though. :) P.S. i think the link you have given for the language files has been modified and this project is not working with those files. Have a look at that so other people don't get stuck.

rakesh79mca commented 7 years ago

@hyderlyger can you send me version 2.\ files so i can check this issue

halkar commented 7 years ago

@rakesh79mca you do not await the Init method. Hence it's not initialised.

halkar commented 7 years ago

@hyderlyger thanks, I will check that!

rakesh79mca commented 7 years ago

@halkar

Please let me know where i am wrong? I have added await the init method.

 [Activity (Label = "ReceiptScanner", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class TextureViewActivity : Activity, ISurfaceHolderCallback, Android.Hardware.Camera.IPreviewCallback
    {
        private bool syncObj = false;
        Android.Hardware.Camera camera;
        TesseractApi _api;

        protected override async void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            _api = new TesseractApi(this, AssetsDeployment.OncePerInitialization);
            await _api.Init("eng");
            SurfaceView cameraSurface = FindViewById<SurfaceView>(Resource.Id.cpPreview);
            ISurfaceHolder holder = cameraSurface.Holder;
            holder.AddCallback(this);
            holder.SetType(SurfaceType.PushBuffers);
        }

        public async void OnPreviewFrame (byte[] data, Android.Hardware.Camera camera)
        {
            if (syncObj)
                return;
            if (!_api.Initialized)
                return;
            syncObj = true;
            await _api.SetImage (ConvertYuvToJpeg (data, camera));
            var results = _api.Results (PageIteratorLevel.Block);
            foreach (var result in results) {
                Log.Debug ("TextureViewActivity", "Word: \"{0}\", confidence: {1}", result.Text, result.Confidence);
            }
            syncObj = false;
        }

        public void SurfaceChanged (ISurfaceHolder holder, Format format, int width, int height)
        {

        }

        public void SurfaceCreated (ISurfaceHolder holder)
        {
            if (camera == null) {
                this.camera = Android.Hardware.Camera.Open ();
                this.camera.SetPreviewDisplay (holder);
                this.camera.SetPreviewCallback (this);
                this.camera.StartPreview ();
            }
        }

        public void SurfaceDestroyed (ISurfaceHolder holder)
        {

        }

        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;
        }
    }
}
rakesh79mca commented 7 years ago

@hyderlyger can you help me on this it is urgent for me

Please let me know where i am wrong? I have added await the init method.

[Activity (Label = "ReceiptScanner", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class TextureViewActivity : Activity, ISurfaceHolderCallback, Android.Hardware.Camera.IPreviewCallback
    {
        private bool syncObj = false;
        Android.Hardware.Camera camera;
        TesseractApi _api;

        protected override async void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            _api = new TesseractApi(this, AssetsDeployment.OncePerInitialization);
            await _api.Init("eng");
            SurfaceView cameraSurface = FindViewById<SurfaceView>(Resource.Id.cpPreview);
            ISurfaceHolder holder = cameraSurface.Holder;
            holder.AddCallback(this);
            holder.SetType(SurfaceType.PushBuffers);
        }

        public async void OnPreviewFrame (byte[] data, Android.Hardware.Camera camera)
        {
            if (syncObj)
                return;
            if (!_api.Initialized)
                return;
            syncObj = true;
            await _api.SetImage (ConvertYuvToJpeg (data, camera));
            var results = _api.Results (PageIteratorLevel.Block);
            foreach (var result in results) {
                Log.Debug ("TextureViewActivity", "Word: \"{0}\", confidence: {1}", result.Text, result.Confidence);
            }
            syncObj = false;
        }

        public void SurfaceChanged (ISurfaceHolder holder, Format format, int width, int height)
        {

        }

        public void SurfaceCreated (ISurfaceHolder holder)
        {
            if (camera == null) {
                this.camera = Android.Hardware.Camera.Open ();
                this.camera.SetPreviewDisplay (holder);
                this.camera.SetPreviewCallback (this);
                this.camera.StartPreview ();
            }
        }

        public void SurfaceDestroyed (ISurfaceHolder holder)
        {

        }

        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;
        }
    }
}
halkar commented 7 years ago

@rakesh79mca what result do you get from await _api.Init("eng")?