سؤال

أحاول استخدام MODI إلى برنامج OCR. إنه يعمل بشكل جيد لقطات الشاشة التي أمسك بها برمجيا باستخدام Win32 Interop مثل هذا:

public string SaveScreenShotToFile()
{
    RECT rc;
    GetWindowRect(_hWnd, out rc);

    int width = rc.right - rc.left;
    int height = rc.bottom - rc.top;

    Bitmap bmp = new Bitmap(width, height);
    Graphics gfxBmp = Graphics.FromImage(bmp);
    IntPtr hdcBitmap = gfxBmp.GetHdc();

    PrintWindow(_hWnd, hdcBitmap, 0);

    gfxBmp.ReleaseHdc(hdcBitmap);
    gfxBmp.Dispose();

    string fileName = @"c:\temp\screenshots\" + Guid.NewGuid().ToString() + ".bmp";
    bmp.Save(fileName);
    return fileName;
}

ثم يتم حفظ هذه الصورة في ملف وركض من خلال modi مثل هذا:

    private string GetTextFromImage(string fileName)
    {

        MODI.Document doc = new MODI.DocumentClass();
        doc.Create(fileName);
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        MODI.Image img = (MODI.Image)doc.Images[0];
        MODI.Layout layout = img.Layout;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < layout.Words.Count; i++)
        {
            MODI.Word word = (MODI.Word)layout.Words[i];
            sb.Append(word.Text);
            sb.Append(" ");
        }

        if (sb.Length > 1)
            sb.Length--;

        return sb.ToString();
    }

هذا الجزء يعمل بشكل جيد، ومع ذلك، لا أريد الوصول إلى OCR لقطة الشاشة بأكملها، فقط أجزاء منه. أحاول اقتصاص الصورة برمجيا مثل هذا:

    private string SaveToCroppedImage(Bitmap original)
    {
        Bitmap result = original.Clone(new Rectangle(0, 0, 250, 250), original.PixelFormat);
        var fileName = "c:\\" + Guid.NewGuid().ToString() + ".bmp";
        result.Save(fileName, original.RawFormat);

        return fileName;
    }

ثم تعريك هذه الصورة الأصغر، مهما يلقي modi استثناء؛ "خطأ في تشغيل OCR"، رمز الخطأ -959967087.

لماذا يمكن أن يعالج modi الصورة النقطية الأصلية ولكن ليس الإصدار الأصغر مأخوذة منه؟

هل كانت مفيدة؟

المحلول

يبدو كما لو أن الإجابة في إعطاء modi قماش أكبر. كنت أحاول أيضا أخذ لقطة شاشة للتحكم والكهرباء في نفس المشكلة. في النهاية أخذت صورة عنصر التحكم، نسخ الصورة إلى صورة نقطية أكبر ووجرت الصورة النقطية الكبيرة.

مشكلة أخرى وجدتها هي أنه يجب أن يكون لديك امتداد مناسب لملف الصور الخاص بك. بمعنى آخر، NTMP لا يقطعه.

حافظت على عمل إنشاء مصدر أكبر داخل طريقة تعريضي، والتي تبدو مثل هذا (أتعامل مباشرة مع كائنات الصورة):

public static string ExtractText(this Image image)
{
    var tmpFile = Path.GetTempFileName();
    string text;
    try
    {
        var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
        var gfxResize = Graphics.FromImage(bmp);
        gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
        bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
        var doc = new MODI.Document();
        doc.Create(tmpFile + ".bmp");
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        var img = (MODI.Image)doc.Images[0];
        var layout = img.Layout;
        text = layout.Text;
    }
    finally
    {
        File.Delete(tmpFile);
        File.Delete(tmpFile + ".bmp");
    }

    return text;
}

لست متأكدا تماما ما هو الحد الأدنى للحجم، ولكن يبدو كما لو أن 1024 × 768 هل الخدعة.

نصائح أخرى

نعم، ساعدني الوظائف في هذا الموضوع في الحصول عليها للعمل، وهنا ما يجب أن أضيف:

كان يحاول تنزيل الصور (تلك الصغيرة) ثم OCR ...

- عند معالجة الصور، يبدو أنه يجب أن يكون حجم ISHINR قوة 2! (تمكنت من الصور OCR: 512x512، 128x128، 256x64 .. أحجام أخرى فشلت في الغالب (مثل 1103x334)

  • صنعت خلفية شفافة أيضا مشاكل. حصلت على أفضل النتائج عند إنشاء TIF جديد مع حدود Powerof2، خلفية بيضاء، لصق الصورة التي تم تنزيلها فيها، حفظ.

  • لم تنجح تحجيم الصورة بالنسبة لي، لأن OCR يحصل على نتائج خاطئة، خاصة لأحرف "الألمانية" مثل "ü"

  • في النهاية، استخدمت أيضا: Doc.ocrock (modi.milanguages.milang_English، False، False)؛

  • باستخدام modi من Office 2003

تحية طيبة

Womd.

يعمل MODI OCR فقط TIF معي. حاول حفظ الصورة في "TIF".

آسف لغتي الانجليزية ضعيفة

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

مما يعني أنني لا أريدها أن يكتشف الاتجاه وعدم إصلاح أي سيذ. الآن الأمر يعمل بشكل جيد على جميع الصور بما في ذلك TIFF 2400X2496.

ولكن يجب أن تكون الصورة في.

آمل أن يساعد هذا الأشخاص الذين يواجهون نفس المشكلة.

كان لدي نفس المشكلة "مشكلة تشغيل OCR" مع بعض الصور. أعيد تحجيم الصورة (في حالتي بنسبة 50٪)، أي خفض حجمها وفويلا! إنها تعمل!

كان لدي نفس المشكلة أثناء استخدام

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);

في ملف TIFF كان 2400x2496. تغيير حجمه إلى 50٪ (تقليل الحجم) تم إصلاح المشكلة والطريقة لم تعد رمي الاستثناء بعد الآن، ومع ذلك، فقد تعترف بشكل غير صحيح بالنص مثل الكشف عن "الاعتدالية" بدلا من "المرجع" أو "712017" بدلا من "712517" وبعد حافظت على تجربة أحجام صور مختلفة لكنها كانت جميعها كانت جميعها نفس المشكلة، حتى غيرت الأمر

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

مما يعني أنني لا أريد ذلك أن يكتشف التوجه وعدم إصلاح أي سيذ. الآن الأمر يعمل بشكل جيد على جميع الصور بما في ذلك TIFF 2400X2496.

آمل أن يساعد هذا الأشخاص الذين يواجهون نفس المشكلة

ما تم حل وضعي يستخدم محرر صور (Paint.Net) واستخدم تأثير شحذ بالحد الأقصى.

أنا أيضا استخدام: DOC.OCROCR (modi.milanguages.milang_english، خطأ، خطأ)؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top