Installing Tesseract On Unity 3DC#

Место общения программистов C#
Ответить
Anonymous
 Installing Tesseract On Unity 3D

Сообщение Anonymous »

У меня возникла проблема с Tesseract, и я думаю, она связана с его неправильным импортом.
Я использовал менеджер пакетов NuGet в Visual Studios для установки Tesseract, а затем скопировал файлы в Папка плагина находится внутри папки Assets в Unity, а также eng.tessData. Однако каждый раз, когда я запускаю свой код и делаю снимок для его чтения, я получаю эту ошибку

Ошибка OCR: целью вызова было создано исключение. .

Любой совет хорош.
Вот мой код
для примера.

Любой совет хорош.
Вот мой код
для примера.

Любой совет хорош.
Вот мой код
для примера.

Любой совет хорош.
Вот мой код
для примера.

Любой совет хорош.
Вот мой код
для примера.

Любой совет хорош.
Вот мой код
для примера.

Любой совет хорош.
p>

Код: Выделить всё

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using Newtonsoft.Json.Linq;
using Tesseract;

public class CaptureCards : MonoBehaviour
{
public RawImage cameraFeed;
public Button captureButton;
public Text cardDetailsText;

private WebCamTexture webCamTexture;
private HttpClient httpClient;

// Start is called before the first frame update
void Start()
{
StartCameraFeed();
httpClient = new HttpClient();
captureButton.onClick.AddListener(CaptureAndProcess);
}

void StartCameraFeed()
{
WebCamDevice[] devices = WebCamTexture.devices;

if (devices.Length == 0)
{
Debug.LogError("No camera devices found.");
return;
}

// Log available cameras
Debug.Log("Available cameras:");
foreach (var device in devices)
{
Debug.Log(device.name);
}

string selectedCamera = devices[0].name;
Debug.Log("Using camera: " + selectedCamera);

webCamTexture = new WebCamTexture(selectedCamera);
cameraFeed.texture = webCamTexture;
cameraFeed.material.mainTexture = webCamTexture;
webCamTexture.Play();
}

async void CaptureAndProcess()
{
if (webCamTexture == null || !webCamTexture.isPlaying)
{
cardDetailsText.text = "Camera feed not available.";
return;
}

Texture2D captureImage = new Texture2D(webCamTexture.width, webCamTexture.height);
captureImage.SetPixels(webCamTexture.GetPixels());
captureImage.Apply();

string tempPath = Path.Combine(Application.persistentDataPath, "captureCard.png");
Texture2D preprocessedImage = PreprocessImage(captureImage);
File.WriteAllBytes(tempPath, preprocessedImage.EncodeToPNG());
Debug.Log("Image saved at: " + tempPath);

string cardName = await RecognizeText(tempPath);

if (!string.IsNullOrEmpty(cardName))
{
JObject cardData = await FetchCardDetails(cardName);
if (cardData != null)
{
DisplayCardDetails(cardData);
SaveCardDetails(cardData);
}
else
{
cardDetailsText.text = "Card not Found";
}
}
else
{
cardDetailsText.text = "Failed to recognize card name";
}
}

Texture2D PreprocessImage(Texture2D original)
{
int targetWidth = 800; // Resize for better OCR accuracy
int targetHeight = (int)(original.height * (800.0f / original.width));
Texture2D resizedImage = new Texture2D(targetWidth, targetHeight);

for (int y = 0; y < targetHeight; y++)
{
for (int x = 0; x < targetWidth; x++)
{
Color pixel = original.GetPixelBilinear((float)x / targetWidth, (float)y / targetHeight);
resizedImage.SetPixel(x, y, pixel);
}
}
resizedImage.Apply();

// Convert to grayscale
Color[] pixels = resizedImage.GetPixels();
for (int i = 0; i < pixels.Length; i++)
{
float gray = pixels[i].grayscale;
pixels[i] = new Color(gray, gray, gray);
}
resizedImage.SetPixels(pixels);
resizedImage.Apply();

return resizedImage;
}

async Task  RecognizeText(string imagePath)
{
string resultText = string.Empty;
string tessDataPath = Path.Combine(Application.streamingAssetsPath, "tessdata");
Debug.Log($"StreamingAssets Path: {Application.streamingAssetsPath}");
Debug.Log($"File Exists: {File.Exists(Path.Combine(Application.streamingAssetsPath, "tessdata", "eng.traineddata"))}");

await Task.Run(() =>
{
try
{
if (!Directory.Exists(tessDataPath))
throw new DirectoryNotFoundException($"Tesseract data directory not found: {tessDataPath}");

if (!File.Exists(Path.Combine(tessDataPath, "eng.traineddata")))
throw new FileNotFoundException("Tesseract trained data file not found (eng.traineddata).");

if (!File.Exists(imagePath))
throw new FileNotFoundException($"Image file not found: {imagePath}");

using (var engine = new TesseractEngine(tessDataPath, "eng", EngineMode.Default))
{
using (var img = Pix.LoadFromFile(imagePath))
{
using (var page = engine.Process(img, PageSegMode.SingleBlock))
{
resultText = page.GetText().Trim();
}
}
}
}
catch (Exception ex)
{
Debug.LogError($"OCR Error: {ex.Message}\n{ex.StackTrace}");
}
});

return resultText;
}

async Task FetchCardDetails(string cardName)
{
try
{
string apiUrl = $"https://api.scryfall.com/cards/named?exact={UnityWebRequest.EscapeURL(cardName)}";
string response = await httpClient.GetStringAsync(apiUrl);
return JObject.Parse(response);
}
catch
{
return null;
}
}

void DisplayCardDetails(JObject cardData)
{
string name = cardData["name"].ToString();
string type = cardData["type_line"].ToString();
string manaCost = cardData["mana_cost"].ToString();
string description = cardData["oracle_text"].ToString();

cardDetailsText.text = $"Name: {name}\nType: {type}\nMana Cost: {manaCost}\nDescription: {description}";
}

void SaveCardDetails(JObject cardData)
{
string savePath = Path.Combine(Application.persistentDataPath, "savedCards.json");

JArray savedCards = File.Exists(savePath)
? JArray.Parse(File.ReadAllText(savePath))
: new JArray();

savedCards.Add(cardData);
File.WriteAllText(savePath, savedCards.ToString());
}

void OnDestroy()
{
// Clean up resources
webCamTexture.Stop();
httpClient.Dispose();
}
}
Чтобы исправить ошибку, из-за которой тессеракт не работает должным образом, чтобы я мог получить текст из изображения.


Подробнее здесь: https://stackoverflow.com/questions/793 ... n-unity-3d
Ответить

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

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

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

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

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