Tesseract - папка Tessdata не найдена в AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Tesseract - папка Tessdata не найдена в Android

Сообщение Anonymous »

Я пытаюсь реализовать Tesseract в Xamarin.Forms (Android), но думаю, что решение подойдет для любого языка на базе Android.
У меня есть следующее исключение

"System.Reflection.TargetInvocationException: Исключение
вызвано целью вызова. --->
System.ArgumentNullException: Значение не может быть нулевым.\nИмя параметра:
путь\n в System.IO.Path.InsecureGetFullPath (путь System.String)
[0x00003] в
/Users/builder/jenkins/workspace/archive -mono/2020-02/android/release/mcs/class/corlib/System.IO/Path.cs:369
\n в System.IO.Path.GetFullPath (путь System.String) [0x00000] в
/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.IO/Path.cs:288
\n в InteropDotNet.LibraryLoader .CheckCurrentAppDomain
(System.String fileName, System.String PlatformName) [0x0000a] in
:0 \n at
InteropDotNet.LibraryLoader.LoadLibrary (System.String fileName,
System.String PlatformName) [0x00076] in
:0 \n at
InteropRuntimeImplementer.LeptonicaApiSignaturesInstance.LeptonicaApiSignaturesImplementation..ctor
(InteropDotNet.LibraryLoader loader) [0x00006] в :0 \n at (wrapper
managed-to-native)
System.Reflection.RuntimeConstructorInfo.InternalInvoke(System.Reflection.RuntimeConstructorInfo,object,object[],System.Exception& )\n
at System.Reflection.RuntimeConstructorInfo.InternalInvoke
(System.Object obj, параметры System.Object[], System.Boolean
wrapExceptions) [0x00005] в
/ Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.Reflection/RuntimeMethodInfo.cs:936
\n --- Конец внутренней трассировки стека исключений ---\n at
System.Reflection.RuntimeConstructorInfo.InternalInvoke (параметры System.Object
obj, System.Object[], System.Boolean WrapExceptions)
[0x00018] в
/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.Reflection/RuntimeMethodInfo.cs:944
\n в System.Reflection.RuntimeConstructorInfo. DoInvoke
(System.Object obj, System.Reflection.BindingFlags ignoreAttr,
Связующее устройство System.Reflection.Binder, параметры System.Object[],
System.Globalization.CultureInfo Culture) [0x00086] в
/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.Reflection/RuntimeMethodInfo.cs:926
\n в System. Reflection.RuntimeConstructorInfo.Invoke
(System.Reflection.BindingFlags ignoreAttr, System.Reflection.Binder
binder, параметры System.Object[], System.Globalization.CultureInfo
cultural) [0x00000] в
/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.Reflection/RuntimeMethodInfo.cs:960
\n в System.RuntimeType .CreateInstanceImpl
(System.Reflection.BindingFlagsbindingAttr, System.Reflection.Binder
binder, System.Object[] args, System.Globalization.CultureInfo
cultural, System.Object[] activeAttributes,
System.Threading.StackCrawlMark& stackMark) [0x0022b] в
/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/ rttype.cs:5535
\n в System.Activator.CreateInstance (тип System.Type,
System.Reflection.BindingFlagsbindingAttr, System.Reflection.Binder
binder, System.Object[] args, System.Globalization.CultureInfo
cultural, System.Object[] activeAttributes) [0x000b5] в
/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs /class/referencesource/mscorlib/system/activator.cs:107
\n в System.Activator.CreateInstance (тип System.Type, аргументы
System.Object[]) [0x00000] в
/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/activator.cs:112
\n в InteropDotNet.InteropRuntimeImplementer.CreateInstance[ T] ()
[0x000c9] в :0 \n at
Tesseract.Interop.LeptonicaApi.Initialize () [0x00007] в
:0 \n вTesseract.Interop.TessApi.Initialize() [0x00007] в
:0 \n в
Tesseract.Interop.TessApi.get_Native() [0x00007] в
< 34588703652c4d2782e7c04fa8ce17a8>:0 \n at
Tesseract.TesseractEngine..ctor (System.String datapath, System.String
язык, Tesseract.EngineMode engineMode,
System.Collections.Generic.IEnumerable1[T ] configFiles,
System.Collections.Generic.IDictionary2[TKey,TValue] InitialOptions,
System.Boolean setOnlyNonDebugVariables) [0x00018] в
:0 \n at
Tesseract.TesseractEngine..ctor (путь к данным System.String, язык System.String
, Tesseract.EngineMode engineMode) [0x0000f] в
:0 \n в
LedOcr.Droid. AndroidOcrProcessor.PerformOcr (System.String imagePath)
[0x001da] в
C:\user\Projects\Temp\LedOcr\LedOcr\LedOcr.Android\AndroidOcrProcessor.cs:56
\n at LedOcr.ViewModels.MainPageViewModel.paddleAction (System.Object
obj) [0x000eb] в
C:\user\Projects\Temp\LedOcr\LedOcr\LedOcr\ViewModels\MainPageViewModel.cs:102
"

Я тестирую его на реальном устройстве (Android 13)
Я скопировал в папку tessdata в папке «Активы» и установил «копировать, если новее» для eng.traineddata
вот мой код
public class AndroidOcrProcessor : IOcrProcessor
{
public async Task PerformOcr(string imagePath)
{
if (string.IsNullOrEmpty(imagePath))
{
throw new ArgumentNullException(nameof(imagePath), "Image path cannot be null or empty.");
}

string tessdataPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "tessdata");
string trainedDataPath = Path.Combine(tessdataPath, "eng.traineddata");

if (!Directory.Exists(tessdataPath))
{
Directory.CreateDirectory(tessdataPath);
}

if (!File.Exists(trainedDataPath))
{
using (var assets = Android.App.Application.Context.Assets.Open("tessdata/eng.traineddata"))
using (var dest = File.Create(trainedDataPath))
{
await assets.CopyToAsync(dest);
}
}

if (!Directory.Exists(tessdataPath) || !File.Exists(trainedDataPath))
{
throw new Exception($"Required data not found in {tessdataPath}. Ensure that the 'tessdata' folder contains 'eng.traineddata'.");
}

using (var engine = new TesseractEngine(tessdataPath, "eng", EngineMode.Default))
{
using (var img = Pix.LoadFromFile(imagePath))
{
using (var page = engine.Process(img))
{
string text = page.GetText();
return text;
}
}
}
}
}

Это исключение возникает в этой строке
var engine = new TesseractEngine(tessdataPath, "eng", EngineMode.Default);

Это означает, что tessdataPath существует, но TesseractEngine почему-то не может его найти. Может быть, мне нужно установить другую библиотеку?
Я использую эту библиотеку https://github.com/charlesw/tesseract/
Я использовал также этот Android.App.Application.Context.FilesDir.AbsolutePath; который указывает тот же путь, что и FileSystem.AppDataDirectory. Путь: «/data/user/0/com.companyname.ledocr/files».
В чем здесь проблема?
Изменить: мой файл манифеста























Подробнее здесь: https://stackoverflow.com/questions/784 ... in-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»