Я пытаюсь реализовать 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
Tesseract - папка Tessdata не найдена в Android ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1716018420
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».
В чем здесь проблема?
[b] Изменить:[/b] мой файл манифеста
Подробнее здесь: [url]https://stackoverflow.com/questions/78499009/tesseract-tessdata-folder-cannot-be-found-in-android[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия