📄 lprprocess.cpp
字号:
avg = (int)(avg*1.0/(LPCharRect[CharID].right-LPCharRect[CharID].left)+0.5);
if (!((LPCharRect[CharID].right-LPCharRect[CharID].left<(int)(0.2*pSrcImg->Height+0.5)) && (avg < (int)(0.5*pSrcImg->Height+0.5))))
{
if (LPCharRect[CharID].right-LPCharRect[CharID].left > (int)(0.05*pSrcImg->Height+0.5))
{
if (LPCharRect[CharID].right-LPCharRect[CharID].left < (int)(0.25*pSrcImg->Height+0.5))
{
avg = 0;
for (x=0; x<pSrcImg->Height; x++)
for (y=LPCharRect[CharID].left; y<=LPCharRect[CharID].right; y++)
{
if (*(pSrcImg->pImg+x*pSrcImg->Width+y) == 255)
avg++;
}
if (1.0*avg/(LPCharRect[CharID].right-LPCharRect[CharID].left)/pSrcImg->Height > 0.6)
CharID++;
}
else
CharID++;
}
}
if (CharID > MAX_LPCHAR_CURRENT_COUNT-1)
break;
Flag = TRUE;
}
}
Flag = TRUE;
Flag1 = TRUE;
k = 0;
if (LPCharRect[CharID-1].right-LPCharRect[0].left < (int)(4.3*pSrcImg->Height+0.5))
{
for (i=0; i<pSrcImg->Width; i++)
{
if ((*(pOutLineProject+i) != 0) && Flag1)
Flag1 = FALSE;
if ((*(pOutLineProject+i) == 0) && (!Flag1))
{
TempLeft = i;
Flag1 = TRUE;
Flag = FALSE;
}
if ((*(pOutLineProject+i) != 0) && (!Flag))
{
TempRight = i;
if (TempRight-TempLeft < (int)(0.26*pSrcImg->Height+0.5))
Code[k] = 0;
else
Code[k] = 1;
k++;
if (k > 100)
return 0;
Flag = TRUE;
}
}
if (Code[0] != 0)
{
if (CharID > MAX_LPCHAR_CURRENT_COUNT-1)
CharID--;
}
else
{
if ((Code[1] == 1) && (CharID < MAX_LPCHAR_CURRENT_COUNT))
CharID++;
}
}
for (i=CharID-1; i>=1; i--)
{
if (LPCharRect[i].right-LPCharRect[i].left < (int)(0.2*pSrcImg->Height+0.5))
{
if (LPCharRect[i].left-LPCharRect[i-1].right < (int)(0.22*pSrcImg->Height+0.5))
CharID--;
}
else
break;
}
if (LPCharRect[CharID-1].right-LPCharRect[CharID-1].left > (int)(0.5*pSrcImg->Height+0.5))
{
if (LPCharRect[CharID-1].left+(int)(0.5*pSrcImg->Height+0.5)<pSrcImg->Width-1)
{
LPCharRect[CharID-1].right = LPCharRect[CharID-1].left+(int)(0.5*pSrcImg->Height+0.5);
}
else
LPCharRect[CharID-1].right = pSrcImg->Width - 1;
}
*pCharCount = CharID;
if (pOutLineProject != NULL)
{
free(pOutLineProject);
pOutLineProject = NULL;
}
return 1;
}
int OutLineProject(int *pProject, PGrayImg pSrcImg)
{
int i, j, HighP, LowP;
for (j=0; j<pSrcImg->Width; j++)
{
HighP = pSrcImg->Height;
LowP = pSrcImg->Height;
for (i=0; i<pSrcImg->Height; i++)
{
if (*(pSrcImg->pImg+i*pSrcImg->Width+j) > 0)
{
HighP = i;
break;
}
}
for (i=pSrcImg->Height-1; i>=0; i--)
{
if (*(pSrcImg->pImg+i*pSrcImg->Width+j) > 0)
{
LowP = i;
break;
}
}
*(pProject+j) = LowP - HighP;
}
*(pProject+pSrcImg->Width-1) = 0;
return 1;
}
int OutLineProjectFilter(int *pProject, int PrjLen, int LPHeight)
{
int i, CharID, j;
int Temp;
int MergeID[101], TempWidth[101];
RECT LPCharRect[101];
BOOL Flag;
*(pProject+PrjLen-1) = 0;
Flag = TRUE;
for (i=0; i<PrjLen; i++)
{
if ((*(pProject+i) != 0) && Flag)
{
Temp = i;
Flag = FALSE;
}
if ((*(pProject+i) == 0) && (!Flag))
{
if (i-Temp < (int)(0.2*LPHeight+0.5))
{
for (j=Temp; j<i; j++)
{
if ((*(pProject+j)<(int)(0.5*LPHeight+0.5)) || (i-Temp<(int)(0.05*LPHeight+0.5)))
*(pProject+j) = 0;
}
}
Flag = TRUE;
}
}
Flag = FALSE;
for (i=0; i<PrjLen-1; i++)
{
if (*(pProject+i) < 2)
*(pProject+i) = 0;
if ((*(pProject+i) < *(pProject+i+1)) && Flag)
{
if (*(pProject+i) < (int)(0.3*LPHeight+0.5))
*(pProject+i) = 0;
Flag = FALSE;
}
if ((*(pProject+i) > *(pProject+i+1)) && (!Flag))
Flag = TRUE;
}
Flag = TRUE;
CharID = 0;
for (i=0; i<PrjLen; i++)
{
if ((*(pProject+i) != 0) && Flag)
{
LPCharRect[CharID].left = i;
Flag = FALSE;
}
if ((*(pProject+i) == 0) && (!Flag))
{
LPCharRect[CharID].right = i - 1;
TempWidth[CharID] = LPCharRect[CharID].right - LPCharRect[CharID].left + 1;
if (TempWidth[CharID] < 2)
{
for (j=LPCharRect[CharID].left; j<=LPCharRect[CharID].right; j++)
*(pProject+j) = 0;
}
else
CharID++;
if (CharID > 100)
return 0;
Flag = TRUE;
}
}
j = 0;
for (i=0; i<CharID; i++)
{
if (TempWidth[i] < (int)(0.4 * LPHeight + 0.5))
{
MergeID[j] = i;
j++;
}
if ((i==CharID-1) || (TempWidth[i]>=(int)(0.4*LPHeight+0.5)))
{
switch (j)
{
case 1:
if (MergeID[0] < CharID - 1)
{
if (1 == IsChar(LPCharRect[MergeID[0]].left, LPCharRect[MergeID[0]+1].right, LPHeight))
if (LPCharRect[MergeID[0]+1].left-LPCharRect[MergeID[0]].right <= 4)
*(pProject+LPCharRect[MergeID[0]].right+1) = 20;
}
if (MergeID[0] > 0)
{
if (1 == IsChar(LPCharRect[MergeID[0]-1].left, LPCharRect[MergeID[0]].right, LPHeight))
if (LPCharRect[MergeID[0]].left - LPCharRect[MergeID[0] - 1].right <= 4)
*(pProject+LPCharRect[MergeID[0]].right+1) = 20;
}
break;
case 2:
Merge2(pProject, PrjLen, LPCharRect, MergeID, 0, 1, LPHeight);
break;
case 3:
Merge3(pProject, PrjLen, LPCharRect, MergeID, 0, 2, LPHeight);
break;
case 4:
Merge4(pProject, PrjLen, LPCharRect, MergeID, 0, 3, LPHeight);
break;
case 5:
Merge5(pProject, PrjLen, LPCharRect, MergeID, 0, 4, LPHeight);
break;
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
Merge6(pProject, PrjLen, LPCharRect, MergeID, 0, 5, LPHeight);
break;
}
j = 0;
}
}
return 1;
}
int Merge2(int *pProject, int PrjLen, RECT LPCharRect[],
int MergeID[], int StartID, int EndID, int CharHeight)
{
int p;
BOOL Flag;
if (1 == IsChar(LPCharRect[MergeID[StartID]].left, LPCharRect[MergeID[EndID]].right, CharHeight))
{
Flag = TRUE;
for (p=StartID; p<EndID; p++)
{
if (LPCharRect[MergeID[StartID+1]].left-LPCharRect[MergeID[StartID]].right>(int)(0.15*CharHeight+0.5))
Flag = FALSE;
}
if (Flag)
{
for (p=LPCharRect[MergeID[StartID]].left; p<=LPCharRect[MergeID[EndID]].right; p++)
*(pProject+p) = (int)(CharHeight * 0.8 + 0.5);
}
else
return 0;
}
else
return 0;
return 1;
}
int Merge3(int *pProject, int PrjLen, RECT LPCharRect[],
int MergeID[], int StartID, int EndID, int CharHeight)
{
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 1, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID, CharHeight))
return 0;
return 1;
}
int Merge4(int *pProject, int PrjLen, RECT LPCharRect[],
int MergeID[], int StartID, int EndID, int CharHeight)
{
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 1, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID, CharHeight))
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 2, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID, CharHeight);
else
{
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID - 1, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID, CharHeight))
return 0;
}
return 1;
}
int Merge5(int *pProject, int PrjLen, RECT LPCharRect[],
int MergeID[], int StartID, int EndID, int CharHeight)
{
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 1, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID, CharHeight))
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 2, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 3, EndID, CharHeight);
else
{
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID - 1, CharHeight))
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 3, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 3, CharHeight))
Merge3(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID - 2, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 3, EndID, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID - 1, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 3, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 3, EndID, CharHeight))
if (0 == Merge3(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 2, CharHeight))
return 0;
}
}
}
}
}
return 1;
}
int Merge6(int *pProject, int PrjLen, RECT LPCharRect[],
int MergeID[], int StartID, int EndID, int CharHeight)
{
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 1, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID, CharHeight))
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 2, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 4, EndID, CharHeight);
else
{
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID - 1, CharHeight))
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 4, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 3, CharHeight))
Merge3(pProject, PrjLen, LPCharRect, MergeID, StartID + 3, EndID, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID - 2, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 4, EndID, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID - 1, CharHeight))
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 4, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 3, EndID, CharHeight))
Merge3(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 3, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 4, CharHeight))
Merge4(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 1, EndID - 3, CharHeight))
Merge3(pProject, PrjLen, LPCharRect, MergeID, StartID + 3, EndID, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 2, EndID - 2, CharHeight))
{
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 4, CharHeight);
Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 4, EndID, CharHeight);
}
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 3, EndID - 1, CharHeight))
Merge3(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 3, CharHeight);
else
{
if (1 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID + 4, EndID, CharHeight))
if (0 == Merge2(pProject, PrjLen, LPCharRect, MergeID, StartID, EndID - 2, CharHeight))
return 0;
}
}
}
}
}
}
}
}
}
}
return 1;
}
int Merge7(int *pProject, int PrjLen, RECT LPCharRect[],
int MergeID[], int StartID, int EndID, int CharHeight)
{
return 1;
}
int Merge8(int *pProject, int PrjLen, RECT LPCharRect[],
int MergeID[], int StartID, int EndID, int CharHeight)
{
return 1;
}
int IsChar(int CharLeft, int CharRight, int CharHeight)
{
int res = 0;
if ((CharRight-CharLeft>(int)(0.30*CharHeight+0.5)) && (CharRight-CharLeft<(int)(0.6*CharHeight+0.5)))
res = 1;
else
res = 0;
return res;
}
int ReadParam(char *szFileName)
{
_finddata_t fileinfo;
long lres;
lres = _findfirst(szFileName, &fileinfo);
if (-1 != lres)
{
g_LPHeight = GetPrivateProfileInt("GDCLPRINI", "LPHeight", 80, szFileName);
g_LPWidth = GetPrivateProfileInt("GDCLPRINI", "LPWidth", 220, szFileName);
g_LPAccurateHeight = GetPrivateProfileInt("GDCLPRINI", "LPAccurateHeight", 40, szFileName);;
g_Threshold = GetPrivateProfileInt("GDCLPRINI", "Threshold", 160, szFileName);
g_Threshold_HLP = GetPrivateProfileInt("GDCLPRINT", "Threshold_HLP", 100, szFileName);
g_LeftOffset = GetPrivateProfileInt("GDCLPRINI", "LeftOffset", 0, szFileName);
g_RightOffset = GetPrivateProfileInt("GDCLPRINI", "RightOffset", 0, szFileName);
g_TopOffset = GetPrivateProfileInt("GDCLPRINI", "TopOffset", 0, szFileName);
g_BottomOffset = GetPrivateProfileInt("GDCLPRINI", "BottomOffset", 0, szFileName);
}
return 1;
}
int SaveParam(int LPHeight,
int LPWidth,
int LPAccurateHeight,
int Threshold,
int Threshold_HLP,
int LeftOffset,
int RightOffset,
int TopOffset,
int BottomOffset,
char *szFileName)
{
char str[255];
sprintf(str, "%d", LPHeight);
WritePrivateProfileString("GDCLPRINI", "LPHeight", str, szFileName);
sprintf(str, "%d", LPWidth);
WritePrivateProfileString("GDCLPRINI", "LPWidth", str, szFileName);
sprintf(str, "%d", LPAccurateHeight);
WritePrivateProfileString("GDCLPRINI", "LPAccurateHeight", str, szFileName);
sprintf(str, "%d", Threshold);
WritePrivateProfileString("GDCLPRINI", "Threshold", str, szFileName);
sprintf(str, "%d", Threshold_HLP);
WritePrivateProfileString("GDCLPRINI", "Threshold_HLP", str, szFileName);
sprintf(str, "%d", LeftOffset);
WritePrivateProfileString("GDCLPRINI", "LeftOffset", str, szFileName);
sprintf(str, "%d", RightOffset);
WritePrivateProfileString("GDCLPRINI", "RightOffset", str, szFileName);
sprintf(str, "%d", TopOffset);
WritePrivateProfileString("GDCLPRINI", "TopOffset", str, szFileName);
sprintf(str, "%d", BottomOffset);
WritePrivateProfileString("GDCLPRINI", "BottomOffset", str, szFileName);
return 1;
}
RECT GetManualCutRect(int *pLeftOffset, int *pRightOffset, int *pTopOffset, int *pBottomOffset, int OriWidth, int OriHeight)
{
RECT CutRect;
*pLeftOffset = g_LeftOffset;
*pRightOffset = g_RightOffset;
*pTopOffset = g_TopOffset;
*pBottomOffset = g_BottomOffset;
CutRect.left = g_LeftOffset;
CutRect.top = g_TopOffset;
CutRect.right = OriWidth - g_RightOffset - 1;
CutRect.bottom = OriHeight - g_BottomOffset - 1;
return CutRect;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -