当前位置:编程学习 > VC++ >>

VC++和OCR问题,连接

答案:
TIF光学识别OCR、VC调用的程序写法如下:
VC6.0建个MFC的Dialog based工程,然后"Project"->"add to project"->"Components and controls",在Registered ActiveX Controls中找到Microsoft Office Document Imaging Viewer Control 11.0,INSERT建立一个类,然后从控件工具箱中拖一个到窗口上,右键classWizard,Member Variables找到IDC_MIDOCVIEW1然后AddVariable变量名为m_MIDOCtrl,然后在你的类里面找到*Dlg.cpp,在最上面写的#import "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MDIVWCTL.DLL",路径需要你自己改一下,大多数就是这个路径,然后编译一下,在Debug下能找到MDIVWCTL.tlh,复制到工程文件夹中,在*Dlg.cpp中#include "MDIVWCTL.tlh",然后删除刚刚写的#import...,*Dlg.cpp中添加一个成员函数:


BOOL 这里修改成你的Dlg类名::OCRImage(CString i_csPath, CString &o_Gotten)
{
BOOL rtn = TRUE; //返回值
HRESULT hr = 0;

IUnknown *pIObj = NULL;
IDocument *IDoc = NULL;
IImages *IImages = NULL;
IImage *IImage = NULL;
ILayout *ILayout = NULL;
IWords *IWords = NULL;
IWord *IWord = NULL;
long numWord=0;


try
{
pIObj = (IUnknown *) m_MIDOCtrl.GetDocument();
if(!pIObj)
{
hr = pIObj->QueryInterface(IID_IDocument,(void**) &IDoc);
if ( SUCCEEDED(hr) )
{
hr = IDoc->OCR(miLANG_SYSDEFAULT,TRUE,TRUE);
if ( SUCCEEDED(hr) )
{
IDoc->get_Images(&IImages);
IImages->get_Item(0,(IDispatch**)&IImage);
IImage->get_Layout(&ILayout);

ILayout->get_NumWords(&numWord);
ILayout->get_Words(&IWords);

IWords->get_Count(&numWord);

for ( long i=0; i<numWord;i++)
{
IWords->get_Item(i,(IDispatch**)&IWord);
CString csTemp;
BSTR result;
IWord->get_Text(&result);
char buf[256];
sprintf(buf,"%S",result);
csTemp.Format("%s",buf);

o_Gotten += csTemp;
o_Gotten +=" ";
}
IWord->Release();
IWords->Release();
ILayout->Release();
IImage->Release();
IImages->Release();
}
else
rtn = FALSE;
}
else
rtn = FALSE;
IDoc->Close(0);
IDoc->Release();
pIObj->Release();
}
else
rtn = FALSE;
pIObj = NULL;
IDoc = NULL;
ILayout = NULL;
IImages = NULL;
IImage = NULL;
IWords = NULL;
IWord = NULL;
}
catch (...)
{

}

return rtn;

}

函数的用法:

OCRImage(路径,返回识别后的文本) 返回值为FALSE说明识别不成功,TRUE则正功。
CreateInstance(__uuidof(Connection)); //创建连接实例
Open(strCnn,"","",adModeUnknown);
strCnn是接连字符串如:Provider=SQLOLEDB;Persist Security Info=False;User ID=sa ;Password=sa ;Initial Catalog=BusSel ;Data Source=aato
VC6.0建个MFC的Dialog based工程,然后"Project"->"add to project"->"Components and controls",在Registered ActiveX Controls中找到Microsoft Office Document Imaging Viewer Control 11.0,INSERT建立一个类,然后从控件工具箱中拖一个到窗口上,右键classWizard,Member Variables找到IDC_MIDOCVIEW1然后AddVariable变量名为m_MIDOCtrl,然后在你的类里面找到*Dlg.cpp,在最上面写的#import "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MDIVWCTL.DLL",路径需要你自己改一下,大多数就是这个路径,然后编译一下,在Debug下能找到MDIVWCTL.tlh,复制到工程文件夹中,在*Dlg.cpp中#include "MDIVWCTL.tlh",然后删除刚刚写的#import...,*Dlg.cpp中添加一个成员函数:


BOOL 这里修改成你的Dlg类名::OCRImage(CString i_csPath, CString &o_Gotten)
{
BOOL rtn = TRUE; //返回值
HRESULT hr = 0;

IUnknown *pIObj = NULL;
IDocument *IDoc = NULL;
IImages *IImages = NULL;
IImage *IImage = NULL;
ILayout *ILayout = NULL;
IWords *IWords = NULL;
IWord *IWord = NULL;
long numWord=0;


try
{
pIObj = (IUnknown *) m_MIDOCtrl.GetDocument();
if(!pIObj)
{
hr = pIObj->QueryInterface(IID_IDocument,(void**) &IDoc);
if ( SUCCEEDED(hr) )
{
hr = IDoc->OCR(miLANG_SYSDEFAULT,TRUE,TRUE);
if ( SUCCEEDED(hr) )
{
IDoc->get_Images(&IImages);
IImages->get_Item(0,(IDispatch**)&IImage);
IImage->get_Layout(&ILayout);

ILayout->get_NumWords(&numWord);
ILayout->get_Words(&IWords);

IWords->get_Count(&numWord);

for ( long i=0; i<numWord;i++)
{
IWords->get_Item(i,(IDispatch**)&IWord);
CString csTemp;
BSTR result;
IWord->get_Text(&result);
char buf[256];
sprintf(buf,"%S",result);
csTemp.Format("%s",buf);

o_Gotten += csTemp;
o_Gotten +=" ";
}
IWord->Release();
IWords->Release();
ILayout->Release();
IImage->Release();
IImages->Release();
}
else
rtn = FALSE;
}
else
rtn = FALSE;
IDoc->Close(0);
IDoc->Release();
pIObj->Release();
}
else
rtn = FALSE;
pIObj = NULL;
IDoc = NULL;
ILayout = NULL;
IImages = NULL;
IImage = NULL;
IWords = NULL;
IWord = NULL;
}
catch (...)
{

}

return rtn;

}

怎么调用随便你了,OCRImage(路径,返回识别后的文本) 返回值为FALSE说明识别不成功,TRUE则正功。

上一个:vc++的mfc怎么学
下一个:vc++ mfc两数相乘

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,