⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lprprocess.cpp

📁 TRY2LPR-1.0开源的车牌识别核心
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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 + -