با اجازه اساتید محترم
همونطور که دوستان هم اشاره کردن Babylon برای تشخیص متن از دو راه Ocr و API استفاده می کنه. البته اگه دوستان خوبم دقت کنن Babylon با اینکه فقط توانایی OCR متن های انگلیسی رو داره اما با کلیک بر روی متن فارسی یک آبجکت اون متن بدون هیچ اشتباهی داخل برنامه لود می شه! پس به طور حتم برای آبجکتهای ویندوز از توابع API استفاده شده که اگه شما هم بخواین می تونید از این توابع برای تشخیص متن استفاده کنید
من یه سری از این توابع رو که مربوط به فایل GDI32.dll می شه رو گذاشتم و اگه عمری باقی باشه سعی دارم یه مقاله یا حداقل یه برنامه کوچک هم بنویسم تا دوستان بیشتر با این موضوع آشنا بشن.
کد:
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
external 'gdi32.dll' name 'SelectObject' index 463;
function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo; dwFlags: DWORD): BOOL; stdcall;
external 'gdi32.dll' name 'TranslateCharsetInfo' index 527;
function GetTextMetrics(DC: HDC; var TM: TTextMetricA): BOOL; stdcall;
external 'gdi32.dll' name 'GetTextMetricsA' index 383;
function GetTextFace(DC: HDC; Count: Integer; Buffer: PAnsiChar): Integer; stdcall;
external 'gdi32.dll' name 'GetTextFaceA' index 380;
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;
external 'gdi32.dll' name 'GetDeviceCaps' index 302;
function GetStockObject(Index: Integer): HGDIOBJ; stdcall;
external 'gdi32.dll' name 'GetStockObject' index 360;
function GetTextExtentPoint32(DC: HDC; Str: PAnsiChar; Count: Integer; var Size: TSize): BOOL; stdcall;
external 'gdi32.dll' name 'GetTextExtentPoint32A' index 375;
function GetCharacterPlacement(DC: HDC; p2: PAnsiChar; p3, p4: BOOL; var p5: TGCPResults; p6: DWORD): DWORD;
stdcall; external 'gdi32.dll' name 'GetCharacterPlacementA' index 289;
function GetFontData(DC: HDC; p2, p3: DWORD; p4: Pointer; p5: DWORD): DWORD; stdcall;
external 'gdi32.dll' name 'GetFontData' index 316;
function GetTextCharset(hdc: HDC): Integer; stdcall; external 'gdi32.dll' name 'GetTextCharset' index 368;
البته توابعی که Babylon از اونها استفاده می کنه خیلی تو در تو و پیچیده است و در حدود 30 تابع از توابع GDI32 رو استفاده می کنه ولی بیس کار همون تشخیص آبجکتها و متن اونهاست
کد:
function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo; dwFlags: DWORD): BOOL; stdcall;
external 'gdi32.dll' name 'TranslateCharsetInfo' index 527;
و بقیه توابع بیشتر برای ظرافت کار و جلوگیری از اشتباهات برنامه هست که برای اطلاعات بیشتر می تونید یه نیم نگاهی به سورس برنامه بندازید.
اما در مورد OCR برنامه : گرچه Babylon توانایی تشخیص متن رو حتی در فایل های گرافیکی هم داره اما باید بدونید که OCR اون در مقایسه با برنامه های OCR حرفه ایی حرف زیادی برای گفتن نداره . برای نمونه در حالی که Babylon در OCR و تشخیص متنی که در Paint ویندوز تایپ کرده اید با مشکل مواجه می شه اما برنامه های حرفه ایی مثل OMNI page حتی قادر به تبدیل متن دست نویس هم هستند و قدرت و توانایی اونها اصلا قابل مقایسه با Babylon نیست.
در هر صورت OCR تکنیکی برای تشخیص و تبدیل گرافیک به متن هست که هنوز جا برای پیشرفت زیاد داره و تقریبا هر برنامه ای تکنیکی خاص برای انجام این کار داره که مثل سورس ویندوز محرمانه و منحصر به فرد هست ولی روش کار تقریبا در همه اونها یکسان هست.
یعنی اول عکس رو به یه عکس Mono color یا سیاه و سفید تبدیل می کنن و بعد در یه رنج خاصی از اندازه فونت ( اندازه حروف ) به دنبال خطوطی با اندازه ها و زاویه های خاص می گردن و سپس اونها رو با حروف و اطلاعات بانک اطلاعاتی که برنامه داره مقایسه می کنن، چنانچه در این مرحله یک کاراکتر با دقت بالا شناسایی بشه که هیچ وگرنه کار شناخت اون کاراکتر به دامنه ای از حروف که شباهت بیشتری با اون دارن محدود می شه و سپس با کنار هم گذاشتن حروف شناسایی شده ایی که تشکیل یک کلمه رو می دن با استفاده از فرهنگ لغات رای به کلمه معنا دار داده خواهد شد.
یعنی اگه در یک کلمه 5 حرفی 3 حرف از اون به طور قطعی و 2 حرف دیگه به طور نسبی شناسایی شدن، برنامه با استفاده از فرهنگ لغات حروف مربوط به کلمه معنا دار رو جایگزین 2 حرف باقی مونده می کنه که البته کار به همین آسونی ها نیست ولی خوب نشدنی هم نیست.
یا حق