Я пытаюсь извлечь числа из пунктирных цифр в стиле светодиодов (0–9), используя tesseract ocr в приложении maui/xamarin на Android и iOS , полностью отключен. Мой босс хочет, чтобы локальное решение < /strong> работает на мобильных телефонах без какого-либо облачного сервиса. < /P>
Проблема: < /p>
Цифры «точечные» (например, 7-сегментные светодиодные панели, но только точки). Digits .
Я попробовал несколько моделей Tesseract (ENG, LESGODIGITAL, OCR и т. Д.), Но результаты плохие или пустые. My код предварительной обработки изображения < /strong> (с помощью EMGU CV /OpenCV для C#): < /p>
public static byte[] ProcessImageForOcr(string inputImagePath)
{
Mat originalImage = CvInvoke.Imread(inputImagePath, ImreadModes.ColorBgr);
if(originalImage.IsEmpty)
throw new Exception($"Could not load image from: {inputImagePath}");
Mat gray = new Mat();
CvInvoke.CvtColor(originalImage, gray, ColorConversion.Bgr2Gray);
Mat blurred = new Mat();
CvInvoke.GaussianBlur(gray, blurred, new Size(5,5), 0);
Mat edges = new Mat();
CvInvoke.Canny(blurred, edges, 50, 150);
int cropY = (int)(edges.Height * 0.25);
Rectangle roi = new Rectangle(0, cropY, edges.Width, edges.Height - cropY);
Mat croppedEdges = new Mat(edges, roi);
Mat dilatedImage = new Mat();
Mat kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(4,4), new Point(-1,-1));
CvInvoke.Dilate(croppedEdges, dilatedImage, kernel, new Point(-1,-1), 1, BorderType.Default, new MCvScalar(0));
Mat finalImage = new Mat();
CvInvoke.BitwiseNot(dilatedImage, finalImage);
using var v = new VectorOfByte();
if(!CvInvoke.Imencode(".png", finalImage, v))
throw new InvalidOperationException("Failed to encode image");
return v.ToArray();
}
и вот вводные и выходные изображения
И вот мое использование Tesseract [/b]:
static void tryToExtractText(string file)
{
Dictionary dic = new Dictionary
{
{"C:\\Temp Files\\tesseract\\models\\tessdata", "eng"},
{"C:\\Temp Files\\tesseract\\models\\lets", "lets"},
{"C:\\Temp Files\\tesseract\\models\\letsgodigital", "letsgodigital"},
{"C:\\Temp Files\\tesseract\\models\\mcr", "mcr"},
{"C:\\Temp Files\\tesseract\\models\\ocr", "ocr"}
};
foreach(var item in dic)
{
using(var engine = new TesseractEngine(item.Key, item.Value, EngineMode.Default))
{
engine.SetVariable("tessedit_char_whitelist", "0123456789'");
engine.DefaultPageSegMode = PageSegMode.SingleLine;
В приложении консоли: частичное распознавание, в основном неверное. < /li>
< /ul>
На приложении Android Maui: Нет текста . panels.
Goal / Question:
How can I preprocess these dotted digits to make them readable by Tesseract on mobile devices (Android/iOS) offline?
Are there known techniques, image Обработка трубопроводов, или легкие модели ML, подходящие для подключения точек/реконструкции твердых цифр для OCR на мобильном телефоне?
Я пытаюсь извлечь числа из [b] пунктирных цифр в стиле светодиодов [/b] (0–9), используя [b] tesseract ocr [/b] в приложении [b] maui/xamarin [/b] на [b] Android и iOS [/b], полностью отключен. Мой босс хочет, чтобы [b] локальное решение < /strong> работает на мобильных телефонах без какого-либо облачного сервиса. < /P> Проблема: < /p> [list] [*] Цифры «точечные» (например, 7-сегментные светодиодные панели, но только точки). Digits [/b]. [*] Я попробовал несколько моделей Tesseract (ENG, LESGODIGITAL, OCR и т. Д.), Но результаты плохие или пустые. My [b] код предварительной обработки изображения < /strong> (с помощью EMGU CV /OpenCV для C#): < /p> [code]public static byte[] ProcessImageForOcr(string inputImagePath) { Mat originalImage = CvInvoke.Imread(inputImagePath, ImreadModes.ColorBgr); if(originalImage.IsEmpty) throw new Exception($"Could not load image from: {inputImagePath}");
Mat gray = new Mat(); CvInvoke.CvtColor(originalImage, gray, ColorConversion.Bgr2Gray);
Mat blurred = new Mat(); CvInvoke.GaussianBlur(gray, blurred, new Size(5,5), 0);
Mat edges = new Mat(); CvInvoke.Canny(blurred, edges, 50, 150);
int cropY = (int)(edges.Height * 0.25); Rectangle roi = new Rectangle(0, cropY, edges.Width, edges.Height - cropY); Mat croppedEdges = new Mat(edges, roi);
Mat dilatedImage = new Mat(); Mat kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(4,4), new Point(-1,-1)); CvInvoke.Dilate(croppedEdges, dilatedImage, kernel, new Point(-1,-1), 1, BorderType.Default, new MCvScalar(0));
Mat finalImage = new Mat(); CvInvoke.BitwiseNot(dilatedImage, finalImage);
using var v = new VectorOfByte(); if(!CvInvoke.Imencode(".png", finalImage, v)) throw new InvalidOperationException("Failed to encode image");
return v.ToArray(); } [/code] и вот вводные и выходные изображения
И вот мое использование Tesseract [/b]: static void tryToExtractText(string file) { Dictionary dic = new Dictionary { {"C:\\Temp Files\\tesseract\\models\\tessdata", "eng"}, {"C:\\Temp Files\\tesseract\\models\\lets", "lets"}, {"C:\\Temp Files\\tesseract\\models\\letsgodigital", "letsgodigital"}, {"C:\\Temp Files\\tesseract\\models\\mcr", "mcr"}, {"C:\\Temp Files\\tesseract\\models\\ocr", "ocr"} };
foreach(var item in dic) { using(var engine = new TesseractEngine(item.Key, item.Value, EngineMode.Default)) { engine.SetVariable("tessedit_char_whitelist", "0123456789'"); engine.DefaultPageSegMode = PageSegMode.SingleLine;
В приложении консоли: частичное распознавание, в основном неверное. < /li> < /ul>
На приложении Android Maui: Нет текста [/b]. panels. [/list] [b]Goal / Question:[/b] How can I preprocess these [b]dotted digits[/b] to make them [b]readable by Tesseract[/b] on [b]mobile devices[/b] (Android/iOS) [b]offline[/b]? Are there known techniques, image Обработка трубопроводов, или легкие модели ML, подходящие для [b] подключения точек/реконструкции твердых цифр [/b] для OCR на мобильном телефоне?