index-关于文字扫描录入功能的代码,求大神帮忙修改

问题描述

关于文字扫描录入功能的代码,求大神帮忙修改

/** 取得每个字符的边界***/
void CPOCRNuberDlg::GetCharRect(HBITMAP bit, RECT rect,int type, CDC* pDC )
{
CString strTemp2;
CBitmap bitmap;
bitmap.m_hObject = CopyImage(bit,IMAGE_BITMAP,0,0,LR_MONOCHROME);

//CDC *pDC = GetDC();
CDC mDC;

mDC.CreateCompatibleDC( pDC );
mDC.SetBoundsRect( &rect, DCB_RESET);
mDC.SelectObject(bitmap.m_hObject);

BOOL bIsChar = false;
corInfo = new OCR_Info[50];
int index = 0;

COLORREF colPix;
int        iR;
int        iG;

/************** 取出每个数字所占的Rect **************/
// 列扫描

CString str;
for (int i = rect.left; i < rect.right ; i++)
{
    for (int j = rect.top - 250 ; j < rect.bottom - 250; j++)
    {
        colPix = mDC.GetPixel(i,j);
        iG = GetGValue(colPix);

        // 字符开始
        if ( (iG == 0) && (!bIsChar) )
        {
            corInfo[index].rect.left = i;
            corInfo[index].Index = index;
            bIsChar = true;

            break;
        }
        // 字符继续
        else if ((iG == 0) && (bIsChar))
        {
            break;
        }
        // 字符结束
        else if ((iG == 255) && ( j > rect.bottom -252) && (bIsChar))
        {
            corInfo[index].rect.right = i-1;
            if ((corInfo[index].rect.right - corInfo[index].rect.left) > 3)
                index++;
            bIsChar = false;
            break;
        }

    }
}

CClientDC lDC(this);

// 行扫描
bIsChar = false;
int iBZ =0;
for ( int iinx = 0; iinx < index; iinx++)
{
for (int ii = rect.top-250 ; ii < rect.bottom -250; ii++)
{
for (int j = corInfo[iinx].rect.left ; j < corInfo[iinx].rect.right ; j++)
{
colPix = mDC.GetPixel(j,ii);

iG = GetGValue(colPix);

// 字符顶端开始
if ( (iG == 0) && (!bIsChar) )
{
corInfo[iinx].rect.top = ii;

bIsChar = true;

break;

}
// 字符继续
else if ((iG == 0) && (bIsChar))
{
break;
}
// 字符底端结束
else if ((iG == 255) && ( j > corInfo[iinx].rect.right -2 ) && (bIsChar))
{

corInfo[iinx].rect.bottom = ii-1;

bIsChar = false;
break;
}

}

}
}

/****** 位置确定完成,每个字符的位置信息写在 corInfo.rect 中********/

char m_pFilePath[255];
CStdioFile fInfo;

strcpy(m_pFilePath,"D:\info.ini");
fInfo.Open( m_pFilePath, CFile::modeCreate | CFile::modeWrite );

CDC NewDC;
NewDC.CreateCompatibleDC(pDC);
CBitmap memBmp;
memBmp.CreateCompatibleBitmap( &mDC, 14, 20 );
NewDC.SelectObject( memBmp );

CString strField;
CString strtemp;
char cNum[281];
int iNumIndex = 0;
int iErrCount[10];
int iECount =0;
int iBlack = 0;
int idx = 0;
int ww =0;
int w = 0;

GetCurrentDirectory(255,m_pFilePath);
strcat(m_pFilePath,HOCRINI);
//strcat(m_pFilePath,"\stdinfo.ini");

// 逐个扫描,识别

for (int l = 0; l<index; l++)
{

NewDC.StretchBlt( 0,0,14,20,
&mDC,corInfo[l].rect.left +1,
corInfo[l].rect.top +1,
corInfo[l].rect.right - corInfo[l].rect.left -1,
corInfo[l].rect.bottom - corInfo[l].rect.top -1,
SRCCOPY);

    for (w = 0 ;w< 10; w++)
        iErrCount[w] = 0;

    for (int itmp = 0; itmp < 10; itmp++)
    {
        strtemp.Format("%d",itmp);
        GetPrivateProfileString("Number",strtemp,"",
                    cNum,281,m_pFilePath);
        for(int iy = 0; iy < 20; iy ++)
        {
            for(int ix = 0; ix<14;ix++)
            {
                colPix = NewDC.GetPixel(ix,iy);
                iR = GetRValue(colPix);
                if (iR == 255)
                    iR = 49;
                else
                    iR = 48;
                if ( iR != cNum[iNumIndex])
                    iErrCount[itmp]++;
                iNumIndex++;
            }
        }
        iNumIndex = 0;
    }
    iECount = iErrCount[0];
    idx = 0;
    for(ww =0; ww< 10; ww++)
    {
        if (iErrCount[ww] < iECount)
        {
            iECount = iErrCount[ww];
            idx = ww;
        }
    }
    // 区别1
    if (idx != 1)
    {
        for (int itx = 7; itx < 9; itx++)
        {
            for (int ity = 0; ity < 20; ity++)
            {
                colPix = NewDC.GetPixel(itx,ity);
                iR = GetRValue(colPix);
                if (iR == 0)
                    iBlack++;
            }
        }
        if (iBlack > 39)
        {
            idx = 1;
        }
        iBlack = 0;
    }
    // 再将0 和8 进行判断
    if ((idx == 0) | (idx ==8))
    {
        for (int ity = 8; ity < 10; ity++)
        {
            for (int itx = 2; itx < 12; itx++)
            {
                colPix = NewDC.GetPixel(itx,ity);
                iR = GetRValue(colPix);
                if (iR == 0)
                    iBlack++;
            }
        }
        if (iBlack > 14)
            idx = 8;
        else
            idx = 0;
        iBlack = 0;
    }
    // 再将5 和6 进行判断
    if (( idx == 5) | (idx == 6))
    {

    }
    str.Format("%d",idx);
    strTemp2 += str;
}

delete [] corInfo;   

if (type == 1)
    m_ctrlCardNum.SetWindowText( strTemp2 );
else
    m_ctrlCardPWD.SetWindowText( strTemp2 );

}

解决方案

自己用调试器检查下,看看每一步执行有没有问题

解决方案二:

代码太多了又不是完整代码,你说下错误原因

时间: 2024-10-30 12:43:07

index-关于文字扫描录入功能的代码,求大神帮忙修改的相关文章

c++-C++ 求大神帮忙修改段代码,信息管理系统,把原有的类拆成四个派生类

问题描述 C++ 求大神帮忙修改段代码,信息管理系统,把原有的类拆成四个派生类 http://pan.baidu.com/s/1o69SUWq 这里面是头文件和源文件和说明 求大神帮帮忙 解决方案 链接不存在了 提供一个思路吧,也就把工作细分化.把功能具体化.举一个简单例子 假如有一个图书管理类. 你可以拆分为:借书类.还书类.查书类等,

java-小白求助,求大神帮忙修改下代码

问题描述 小白求助,求大神帮忙修改下代码 我的条件是condition=1|2|3|4|5.... if (source.getProperty(""condition"" + NUM).equals(""1"")) { return p.panduan1(readrow source); } else if (source.getProperty(""condition"" + NUM

iOS 简单代码 求大神帮忙注释下 跪谢

问题描述 iOS 简单代码 求大神帮忙注释下 跪谢 //1 [self.navigationController popViewControllerAnimated:YES] //2 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { id objVC = [segue destinationViewController];// if([objVC isKindOfClass:[SecendViewContr

java代码-求大神帮忙Java作业,感谢

问题描述 求大神帮忙Java作业,感谢 好难做,有哪位大神会的帮帮忙 解决方案 自己做,相信自己可以的! 解决方案二: 大哥,作业是你自己的,你要思路还是要代码,代码在这里应该找不到的,思路的话我想java大神会给你的 解决方案三: http://download.csdn.net/detail/zings1986/3435243放心,只要你智商没问题,看了这个例子都能学会 解决方案四: 使用tree-view的包 在java代码中使用定义列表就行了 解决方案五: 作业怎么可以拿出来提问-这里会

代码-求大神帮忙,在MATLAB上用pca算法读入一组数据,分析处理结果

问题描述 求大神帮忙,在MATLAB上用pca算法读入一组数据,分析处理结果 求一个代码,数据是一个word表格,大约读入5000个数据,谢谢啊 解决方案 oo之前学过现在全部还给老师了

android开发-这个搜索功能怎么实现呀?求大神帮忙指点,谢谢!下面是代码

问题描述 这个搜索功能怎么实现呀?求大神帮忙指点,谢谢!下面是代码 主程序的:public class MainActivity extends Activity { private ListView listview; private MedicineService medicineservice; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVi

android http POST请求方式向服务其发送数据不成功 贴出代码求大神帮解决一下

问题描述 android http POST请求方式向服务其发送数据不成功 贴出代码求大神帮解决一下 new Thread(new Runnable() { @Override public void run() { String szSrc = ""abcdefghijkl123456789123"" ; byte[] encoded = ThreeDes.encryptMode(keyBytes szSrc.getBytes()); try { /* Strin

数据传输-WriteFile失败,GetLastError返回1,功能错误,求大神解答啊

问题描述 WriteFile失败,GetLastError返回1,功能错误,求大神解答啊 向DSP写入数据,设备打开成功句柄有效,WriteFile失败,GetLastError返回1 部分代码: DWORD dwTransRet = 0, dwRecRet = 0; BOOL bTransRet, bRecRet; DWORD dwError; unsigned char RecBuff[BufferSize] = { 0 }; unsigned char TransBuff[BufferSi

代码有错误,求大神帮忙指导!!!!

问题描述 代码有错误,求大神帮忙指导!!!! public class ContactsFragment extends Fragment implements OnClickListener { public static String hostIp; private ExpandableListView userList; private UserExpandableListAdapter adapter; private List<String> strGroups; //所有一级菜单名