VS2010调用微软OCR进行文字识别

拉拉123 2013-04-23 09:57:53
毕业设计是调用微软的OCR即MODI进行文字识别,网上也有相关代码,但是调试起来都有问题。调试到之后,跳出窗口,可以选择图片,但点击字符识别按钮,程序会跳到这里:



BOOL CMODIVCDemoDlg::bReadOCRByMODIAXCtrl(CString csFilePath, CString &csText)
{
BOOL bRet = TRUE;
HRESULT hr = 0;
csText.Empty();

IUnknown *pVal = NULL;
IDocument1 *IDobj = NULL;
ILayout *ILayout = NULL;
IImages *IImages = NULL;
IImage *IImage = NULL;
IWords *IWords = NULL;
IWord *IWord = NULL;

try
{

pVal = (IUnknown *) m_MIDOCtrl.GetDocument();

if ( pVal != NULL )
{

//Already has image in it, Don't need to create again
//Just get IDocument1 interface
// OCROCROCROCROCR
hr = pVal->QueryInterface(IID_IDocument1,(void**) &IDobj);

if ( SUCCEEDED(hr) )
{

hr = IDobj->OCR(miLANG_SYSDEFAULT,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);

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);

csText += csTemp;
csText +=" ";
}

//Release all objects
IWord->Release();
IWords->Release();
ILayout->Release();
IImage->Release();
}
IImages->Release();

} else {
bRet = FALSE;
}

} else {
bRet = FALSE;
}

IDobj->Close(0);
IDobj->Release();
pVal->Release();


} else {
bRet = FALSE;
}

pVal = NULL;
IDobj = NULL;
ILayout = NULL;
IImages = NULL;
IImage = NULL;
IWords = NULL;
IWord = NULL;
}
catch(...)
{

}

return bRet;
}


/////////////////////////////////////////////////////////
//This function convert File Path to BSTR string
////////////////////////////////////////////////////////
BSTR CMODIVCDemoDlg::AsciiToBSTR(const char* pszFName)
{
WCHAR wszURL[MAX_PATH];
::MultiByteToWideChar(CP_ACP, 0, pszFName, -1, wszURL, MAX_PATH);
return SysAllocString(wszURL);
}


void CMODIVCDemoDlg::OnClose()
{
CDialog::OnClose();
}


然后就运行不下去了。求告知啊!!大神们!!都要哭了!!
...全文
968 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
拉拉123 2013-05-05
  • 打赏
  • 举报
回复
恩恩。谢谢。有启发~
拉拉123 2013-04-26
  • 打赏
  • 举报
回复
自己顶~求支招啊!
赵4老师 2013-04-26
  • 打赏
  • 举报
回复
先将图片用PhotoShop“图象、模式、灰度”再“图象、模式、位图”,保存或另存为bmp或tif再试试。 参考下面:
VB实现OCR文字识别
原理: 利用微软OCR控件, 只需要不到10行代码就能够实现自已的OCR文字识别软件.
1. 添加控件,需要安装office2003, 没有安装office2003的可以从别人机子上拷贝相关文件,注册regsvr32.exe mdivwctl.dll,
控件一般在这个目录下:C:\Program Files\Common Files\Microsoft Shared\MODI\11.0, 只需要相关的几个文件就可以了, 此文件夹全部文件大概在21M左右.
工程->部件->添加这个控件:Microsoft Office Document Imaging 11.0 Type Library

2.在按钮的Click事件里:
    Dim strLayoutInfo As String, strLPN As String

     '初始化并加载文档
    Set miDoc = CreateObject("MODI.Document")            '创建对象
    miDoc.Create "D:\未命名.jpg"                         '加载图片文件

    Screen.MousePointer = vbHourglass                    '设置光标忙
    '识别
    miDoc.Images(0).OCR miLANG_CHINESE_SIMPLIFIED, True, True '有用的就此一句,识别为中文简体

    Set modiLayout = miDoc.Images(0).Layout              '读出数据
    strLayoutInfo = _
        "Language: " & modiLayout.Language & vbCrLf & _
        "Number of characters: " & modiLayout.NumChars & vbCrLf & _
        "Number of fonts: " & modiLayout.NumFonts & vbCrLf & _
        "Number of words: " & modiLayout.NumWords & vbCrLf & _
        "Beginning of text: " & Left(modiLayout.Text, 50) & vbCrLf & _
        "First word of text: " & modiLayout.Words(0).Text
    MsgBox strLayoutInfo, vbInformation + vbOKOnly, "Layout Information"
    Set modiLayout = Nothing
    Set miDoc = Nothing
    Screen.MousePointer = vbDefault

3. OK了, 是不是很简单

拉拉123 2013-04-26
  • 打赏
  • 举报
回复
那请问我的代码哪里出问题了吗?
赵4老师 2013-04-26
  • 打赏
  • 举报
回复
OCR通常要求被识别的图片必须是黑白二值图象。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧