zoukankan      html  css  js  c++  java
  • WIN7下的MODI

     

    1. 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下不行吗?

    1. 柳暗花明

    带着WIN7下的疑问,开始安装VitualBox,计划在虚拟机中安装WINXP系统。

    当然,这个是要花时间的。

    一切妥当后,在虚拟机中安装CB6,编译上述代码,结果不出错,且识别出结果。再将WIN7下的可执行程序拷贝到XP中,运行,也得到期望的正确结果(识别错误的地方基本上都是混合识别问题),纯粹的汉字识别正确率已超过90%:

    这一下,总算给自己打了一剂强心针,程序还没问题,只是在WIN7不能运行OCR模块。

    这当然是不行的。

    突然想到,可能是WIN7下的管理员身份问题,回到WIN7下,右键选择"以管理员身份运行",OK了。

    但这带来一个问题:不能在CB中进行调试,需要编译链接后,在资源管理器中找到目标EXE文件,然后手动进行选择管理员身份。

    太不爽。几遍之后就烦了。

    怎么办?

    突然一下想到,是否可以试下以管理员身份运行IDE,然后看能否在IDE中进行调试。

    结果又OK了,我都有点佩服自己了。

    这下效率又高起来了。剩下的问题只是能否生成自动以管理员身份运行的程序了。

    1. 管理员身份

    上网一搜,发现这个问题还问得比较多,解决方法也简单:

    加上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在设计的时候,弹出用户账户控制窗口时,可能屏蔽了所有的键盘响应事件。

    不过,我的目的已达到,没图没真相而已。

  • 相关阅读:
    CentOS命令修改系统时间同步
    Redis的两种持久化方式-快照持久化(RDB)和AOF持久化
    Mysql优化_内置profiling性能分析工具
    Samba服务器的安装与配置
    Linux下yum安装MysqL数据库
    CentOS下安装配置cmake
    自定义环形进度条
    教你实现语音识别(基于科大讯飞)
    Eclipse中如何安装和使用GrepCode插件
    如何在代码中动态设置字体大小
  • 原文地址:https://www.cnblogs.com/drgraph/p/3083153.html
Copyright © 2011-2022 走看看