MODI梦魇
MODI代码其实很简单,简单调用即可,网上一大堆的源代码,稍加改造即可:
UnicodeString __fastcall TOcrDllObject::MODIOcrText
(UnicodeString destTifFileName, int langid,
bool orientImageFlag, bool straightenImage) {
UnicodeString result = "";
Modi_tlb::MiLANGUAGES language = (Modi_tlb::MiLANGUAGES)langid;
GlobalMiDocView->FileName = destTifFileName;
if (GlobalMiDocView->PageNum < 0)
return "";
HRESULT hr = 0;
IDocument *IDobj = NULL;
ILayout *ILayout = NULL;
IImages *IImages = NULL;
IImage *IImage = NULL;
IWords *IWords = NULL;
IWord *IWord = NULL;
// *
try {
IUnknown *pVal = GlobalMiDocView->Document;
if (pVal != NULL) {
hr = pVal->QueryInterface(IID_IDocument, (void**) & IDobj);
if (SUCCEEDED(hr)) {
hr = IDobj->OCR(language, // Modi_tlb::MiLANGUAGES::miLANG_CHINESE_SIMPLIFIED,
1, 1);
if (SUCCEEDED(hr)) {
IDobj->get_Images(&IImages);
long iImageCount = 0;
IImages->get_Count(&iImageCount);
for (int img = 0; img < iImageCount; img++) {
IImages->get_Item(img, (IDispatch * *) & IImage);
IImage->get_Layout(&ILayout);
long numWord = 0;
ILayout->get_NumWords(&numWord);
ILayout->get_Words(&IWords);
IWords->get_Count(&numWord);
UnicodeString ocrResult = "";
for (long i = 0; i < numWord; i++) {
IWords->get_Item(i, (IDispatch * *) & IWord);
BSTR tempResult;
IWord->get_Text(&tempResult);
UnicodeString info;
info.sprintf(L"%s", tempResult);
ocrResult += info;
}
if(ocrResult.Length())
result += ocrResult;
IWord->Release();
IWords->Release();
ILayout->Release();
IImage->Release();
}
IImages->Release();
}
else {
THelper::GetSystemErrorInfo(false);
}
}
else {
THelper::GetSystemErrorInfo(false);
}
IDobj->Close(0);
IDobj->Release();
pVal->Release();
}
pVal = NULL;
IDobj = NULL;
ILayout = NULL;
IImages = NULL;
IImage = NULL;
IWords = NULL;
IWord = NULL;
}
catch(...) {
THelper::MessageBox(THelper::GetSystemErrorInfo());
}
return result;
}
信心满满,开始运行:
自动分区结果:
但识别出错,最终只有图片结果,文字内容全为空
这中间的反复折腾啊,代码调整,均无济于事。
有点绝望了。在WIN7下不行吗?
柳暗花明
带着WIN7下的疑问,开始安装VitualBox,计划在虚拟机中安装WINXP系统。
当然,这个是要花时间的。
一切妥当后,在虚拟机中安装CB6,编译上述代码,结果不出错,且识别出结果。再将WIN7下的可执行程序拷贝到XP中,运行,也得到期望的正确结果(识别错误的地方基本上都是混合识别问题),纯粹的汉字识别正确率已超过90%:
这一下,总算给自己打了一剂强心针,程序还没问题,只是在WIN7不能运行OCR模块。
这当然是不行的。
突然想到,可能是WIN7下的管理员身份问题,回到WIN7下,右键选择"以管理员身份运行",OK了。
但这带来一个问题:不能在CB中进行调试,需要编译链接后,在资源管理器中找到目标EXE文件,然后手动进行选择管理员身份。
太不爽。几遍之后就烦了。
怎么办?
突然一下想到,是否可以试下以管理员身份运行IDE,然后看能否在IDE中进行调试。
结果又OK了,我都有点佩服自己了。
这下效率又高起来了。剩下的问题只是能否生成自动以管理员身份运行的程序了。
管理员身份
上网一搜,发现这个问题还问得比较多,解决方法也简单:
加上UAC盾牌,但短的没有包含WIN7风格 使用长的就行了
去掉delphi设置里边的 Enable runtime themes 就没有警告提示了
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="DelphiApplication"
version="1.0.0.0"
processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
保存为 UAC.manifest
编写一个 UAC.rc文件
1 24 UAC.manifest
再生成UAC.res文件
D2010生成方法:
在ProjectGroup的项目文件名上 比如project1.exe上
点右键 选择Add 选择 UAC.rc文件
编译 即可生成 UAC.res文件
使用方法如下,加在dpr文件中:
program 文本批量翻译助手;
uses
Forms,
GoogleUnit1 in 'GoogleUnit1.pas' {Form_Main},
{$R *.res}
{$R UAC.res} //
这样程序启动时会弹出提示 选择管理员运行
照猫画虎,这个还是会的:
uac.rc:
1 24 QianCamera.exe.manifest
将之编译成为uac.res
再在程序中写入:
#pragma resource "uac.res"
运行后提示询问,不过悲催的是,这个窗口截不了屏,WIN7在设计的时候,弹出用户账户控制窗口时,可能屏蔽了所有的键盘响应事件。
不过,我的目的已达到,没图没真相而已。