Я попытался создать приложение, которое должно использовать камеру для захвата изображения (кредитная карта) и считывания числа с изображения.
Число, которое мне нужно прочитать: номер карты, месяц истечения и год.
Я использую бесплатный актив здесь:
Родная камера для 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 с сохранением файла изображения в единстве, и это сработало, только не работало при захвате с камеры напрямую.
Любое объяснение от вас очень ценит.
Спасибо