Как установить текстуру, читаемую при захвате изображения камерой с помощью Android или IOS Unity? - PullRequest
1 голос
/ 22 марта 2019

Я попытался создать приложение, которое должно использовать камеру для захвата изображения (кредитная карта) и считывания числа с изображения.

Число, которое мне нужно прочитать: номер карты, месяц истечения и год.

Я использую бесплатный актив здесь:

Родная камера для Android IOS

для захвата изображения.

Также я использую Google Tessseract формы дизайна Spark здесь:

Тессеракт OCR Unity

для распознавания текста с изображения.

Но прежде чем пытаться прочитать текст с картинки, у меня возникла проблема с чтением текстуры.

Для подробностей мой код ниже:

public void TakePicture(int maxSize)
    {
        if (NativeCamera.IsCameraBusy())
        {
            return;
        }
        else
        {
            NativeCamera.Permission permission = NativeCamera.TakePicture((path) =>
            {
                Debug.Log("Image path: " + path);
                if (path != null)
                {
                    // Create a Texture2D from the captured image                    
                    Texture2D texture = NativeCamera.LoadImageAtPath(path, maxSize);                          

                    if (texture == null)
                    {
                        Debug.Log("Couldn't load texture from " + path);
                        return;
                    }

                    TesseractWrapper_And tesseract = new TesseractWrapper_And();
                    string datapath = System.IO.Path.Combine(Application.persistentDataPath, "tessdata");
                    tesseract.Init("eng", datapath);

                    //Color32[] imageColors = texture.GetPixels32();
                    string result = tesseract.RecognizeFromTexture(texture, false);

                    //copy bufferColors to imageColors one by one with necessary logic.

                    Card_Number.text = result ?? "Error: " + tesseract.errorMsg;

                    // Assign texture to a temporary quad and destroy it after 5 seconds
                    GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad);
                    quad.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 2.5f;
                    quad.transform.forward = Camera.main.transform.forward;
                    quad.transform.localScale = new Vector3(1f, texture.height / (float)texture.width, 1f);

                    Material material = quad.GetComponent<Renderer>().material;
                    if (!material.shader.isSupported) // happens when Standard shader is not included in the build
                        material.shader = Shader.Find("Legacy Shaders/Diffuse");

                    material.mainTexture = texture;

                    Destroy(quad, 5f);

                    // If a procedural texture is not destroyed manually, 
                    // it will only be freed after a scene change
                    Destroy(texture, 5f);                   

                }
            }, maxSize);

            Debug.Log("Permission result: " + permission);
        }

    }

Я получил сообщение об ошибке:

string result = tesseract.RecognizeFromTexture (texture, false);

Ошибка:

AndroidPlayer (ADB@127.0.0.1: 34999) UnityException: Texture '' is не читается, память текстур не может быть доступна из скриптов. Вы можно сделать текстуру удобочитаемой в настройках импорта текстур. в (обертка, управляемая на родной язык) UnityEngine.Texture2D.GetPixels (UnityEngine.Texture2D, Int, Int, Int, Int, Int) в UnityEngine.Texture2D.GetPixels (уровень m Systemle.Int32) [0x0002b] в <004fc436a9154f7fab4df9679445af6c>: 0 в UnityEngine.Texture2D.GetPixels () [0x00001] в <004fc436a9154f7fab4df9679445af6c>: 0 в OCR_Test + <> c__DisplayClass6_0.b__0 (путь System.String) [0x00040] в F: \ Github \ Tesseract_OCR \ Assets \ script \ OCR_Test.cs: 80
в NativeCameraNamespace.NCCameraCallbackAndroid.MediaReceiveCallback (System.String path) [0x0001d] в F: \ Github \ Tesseract_OCR \ Assets \ Plugins \ NativeCamera \ Android \ NCCameraCallbackAndroid.cs: 30 в NativeCameraNamespace.NCCameraCallbackAndroid + <> c__DisplayClass3_0.b__0 () [0x00000] в F: \ Github \ Tesseract_OCR \ Assets \ Plugins \ NativeCamera \ Android \ NCCameraCallbackAndroid.cs: 19 в NativeCameraNamespace.NCCallbackHelper.Update () [0x0001d] в F: \ GitHub \ Tesseract_OCR \ Assets \ Plugins \ NativeCamera \ Android \ NCCallbackHelper.cs: 21 (Имя файла: <004fc436a9154f7fab4df9679445af6c> Строка: 0)

Текстура не читается.

Это как и где изображение захвачено и сохранено на временном диске.

Texture2D texture = NativeCamera.LoadImageAtPath (path, maxSize);

и файл был найден здесь:

Путь к изображению: /data/user/0/com.Creativire.OCR/cache/IMG_camera.jpg

Вопрос:

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

Как настроить Google Tesseract из DesignSpark просто распознать номер?

Для заметки: Я уже попробовал Oscr designspark tesseract с сохранением файла изображения в единстве, и это сработало, только не работало при захвате с камеры напрямую.

Любое объяснение от вас очень ценит.

Спасибо

...