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

📄 segmentationbyprojection.cpp

📁 车牌识别(改定位)武汉理工大学
💻 CPP
📖 第 1 页 / 共 2 页
字号:
									nStart = -1;
									nEnd = -1;
								}
							}
						}
						else
						{
							ptList.AddTail(CPoint(nStart,i));
							nStart = -1;
							nEnd = -1;
						}
					}
					else
					{
						if (nStart>=0)
						{
							ptList.AddTail(CPoint(nStart,i));
							nStart = -1;
							nEnd = -1;
						}
					}
				}
			}
			i++;
		}
		int nCount = ptList.GetCount();
		if (nCount<6)
		{
			continue;
		}
		else if (nCount>=6) //正常
		{			
			break;
		}
	}
	
	int nWNum[MAXWIDTH];
	memset(nWNum,0,sizeof(int)*MAXWIDTH);
	pos = ptList.GetHeadPosition();
	while (pos)
	{
		ptTemp = ptList.GetNext(pos);
		if (ptTemp.y-ptTemp.x<MAXWIDTH&&ptTemp.y-ptTemp.x>3) 
		{
			nWNum[ptTemp.y-ptTemp.x]++;
		}
	}
	int nMaxNum = nWNum[0];
	int nMaxNo = 0;
	for(i=0;i<MAXWIDTH;i++)
	{
		if (nMaxNum<nWNum[i]) 
		{
			nMaxNum = nWNum[i];
			nMaxNo = i;
		}
	}
	//字宽应该是nMaxNo
	if (nMaxNo<3) 
	{
		delete []nX;
		return FALSE;
	}
	
	//排除第3个黑点
	if (ptList.GetCount()>7) 
	{
		for(i=1;i<4;i++)
		{
			pos = ptList.FindIndex(i);
			ptTemp = ptList.GetAt(pos);			
			if (ptTemp.y-ptTemp.x<nMaxNo-1) 
			{
				BOOL bHave = TRUE;
				for(int j=ptTemp.x;j<=ptTemp.y;j++)
				{
					if (nX[j]>nHeight*0.8)
					{
						bHave = FALSE;
						break;
					}					
				}
				if (bHave) 
				{
					ptList.RemoveAt(pos);
					break;
				}
			}
		}
	}
	
	nCount = ptList.GetCount();
	int nMinNum,nMinNo;
	POSITION posLast;
	
	//先看有合并的没有
	pos = ptList.GetHeadPosition();
	POSITION posNext;
	int nNo = 0;
	CPoint ptTemp1;
	while (pos)
	{
		ptTemp = ptList.GetNext(pos);
		if (ptTemp.y-ptTemp.x<=nMaxNo/2) 
		{
			if (pos)
			{
				posNext = pos;
				ptTemp1 = ptList.GetNext(posNext);
				if (ptTemp1.y-ptTemp1.x<=nMaxNo/2&&ptTemp1.y-ptTemp.x<nMaxNo+2)//应该合并
				{
					ptList.GetPrev(pos);
					ptList.SetAt(pos,CPoint(ptTemp.x,ptTemp1.y));
					posNext = pos;
					ptList.GetNext(posNext);
					ptList.RemoveAt(posNext);
				}
			}
		}
	}
	
	//再看有没有可以分解的
	pos = ptList.GetHeadPosition();
	nIndex = 0;
	posLast = pos;
	while (pos)
	{
		ptTemp = ptList.GetNext(pos);
		if (ptTemp.y-ptTemp.x>nMaxNo+2&&nIndex>1) //需要拆分
		{
			nMinNo = ptTemp.x+1;
			nMinNum = nX[ptTemp.x+1];
			for(i=ptTemp.x+1;i<ptTemp.y-1;i++)
			{
				if (nMinNum>nX[i]) 
				{
					nMinNum = nX[i];
					nMinNo = i;
				}
			}
			if (nMinNum<3&&(nMinNo-ptTemp.x>3)&&(ptTemp.y-nMinNo>3)) 
			{
				ptList.InsertBefore(posLast,CPoint(ptTemp.x,nMinNo));
				ptList.SetAt(posLast,CPoint(nMinNo,ptTemp.y));
			}
		}	
		nIndex++;
		posLast = pos;
	}
	
	pos = ptList.GetHeadPosition();
	posLast = pos;
	nIndex = 0;
	while (pos)
	{
		ptTemp = ptList.GetNext(pos);
		if (ptTemp.y-ptTemp.x>nMaxNo+1) //有噪音
		{
			nMinNum = nX[ptTemp.x];
			nMinNo = ptTemp.x;
			for(i=ptTemp.x+1;i<ptTemp.y-1;i++)
			{
				if (nMinNum>nX[i])
				{
					nMinNum = nX[i];
					nMinNo = i;
				}
			}
			if (nMinNum<3&&(nIndex<=3||nIndex==ptList.GetCount()-1)) 
			{
				if (nMinNo-ptTemp.x<3&&ptTemp.y-nMinNo>nMaxNo-3)
				{
					ptList.SetAt(posLast,CPoint(nMinNo,ptTemp.y));
				}
				else if (nMinNo-ptTemp.x>nMaxNo-3&&ptTemp.y-nMinNo<=3)
				{
					ptList.SetAt(posLast,CPoint(ptTemp.x,nMinNo));
				}
			}
		}
		posLast = pos;
		nIndex++;
	}
	
	//去掉最后一竖
	nCount = ptList.GetCount();
	if (nCount>7) 
	{
		ptTemp = ptList.GetTail();
		if (ptTemp.y-ptTemp.x<3)
		{
			double dCenter[4];
			for(i=nCount-1;i>nCount-5;i--)
			{
				pos = ptList.FindIndex(i);
				ptTemp = ptList.GetAt(pos);
				dCenter[nCount-1-i] = (ptTemp.y+ptTemp.x)/2;
			}
			for(i=0;i<3;i++)
			{
				dCenter[i] = dCenter[i]-dCenter[i+1];
			}
			if (dCenter[0]<(dCenter[1]+dCenter[2])/2-2)
			{
				ptList.RemoveTail();
			}
		}
	}
	
	//去上下边框
	pos = ptList.GetHeadPosition();
	int nTop[20];
	int nButtom[20];
	
	nIndex = 0;
	CImage imgTemp;
	while (pos)
	{
		ptTemp = ptList.GetNext(pos);
		ImgOut.CutFromImg(imgTemp,CRect(ptTemp.x,0,ptTemp.y+1,ImgOut.GetHeight()));
		ImgList.AddTail(imgTemp);
		imgTemp.CutUpAndDown(nTop[nIndex],nButtom[nIndex]);
		nIndex++;
	}	
	int nTopOut[20];
	int nButtomOut[20];
	ImgIn.GetOutUpAndDown(nTop, nButtom, nIndex, nTopOut, nButtomOut,ImgOut.GetHeight());
	
	pos = ptList.GetHeadPosition();
	posLast = pos;
	ImgList.RemoveAll();
	nIndex = 0;
	int nH = (int)(ImgOut.GetHeight()*0.5);
	nH = max(nH,7);
	while (pos)
	{	
		//底下是为了取出灰度图象
	/*
			ptTemp = ptList.GetNext(pos);
				ImgGray.CutFromImg(imgTemp,CRect(ptTemp.x,0,ptTemp.y+1,ImgOut.GetHeight()));
				CImage ImgOut1;
				ImgOut1 = imgTemp;
				ImgOut1.imGraytoTwo(imgTemp,m_bBlack);
				CList<CRect,CRect> ListRect;
				imgTemp.imLTquzao(ListRect);
				ImgList.AddTail(imgTemp);
				posLast = pos;
				nIndex++;*/
		ptTemp = ptList.GetNext(pos);
		ImgOut.CutFromImg(imgTemp,CRect(ptTemp.x,0,ptTemp.y+1,ImgOut.GetHeight()));
	     //下面为只保留最大连通区域...可考虑修改去掉点少的和连通域在右边的,而且第一个汉字不用执行。
		imgTemp.DenoiseMax();
		imgTemp.CutOffUnUsedArea();
		ImgList.AddTail(imgTemp);
		posLast = pos;
		nIndex++;
	}	
	delete []nX;
	
	//去前面几个黑块
	int nRemove = 0;
	if (ImgList.GetCount()>7) 
	{
		int nIndex = 0;
		for(i=2;i>0;i--)
		{
			pos = ImgList.FindIndex(i);
			imgTemp = ImgList.GetAt(pos);
			double dPix = imgTemp.GetAllTextPointNum(CRect(0,0,imgTemp.GetWidth(),imgTemp.GetHeight()),0);
			dPix /= imgTemp.GetWidth()*imgTemp.GetHeight();
			if (dPix>0.65)
			{
				nIndex = i;
				break;
			}
		}
		for(i=nIndex-1;i>=0;i--)
		{
			pos = ImgList.FindIndex(i);
			ImgList.RemoveAt(pos);
			pos = ptList.FindIndex(i);
			ptList.RemoveAt(pos);
		}
		if (nIndex>0)
		{
			while (ImgList.GetCount()>7)
			{
				ImgList.RemoveTail();
			}
			while (ptList.GetCount()>7) 
			{
				ptList.RemoveTail();
			}
		}
	}
	
	if (ptList.GetCount()>7)
	{
		//先根据第2和第三个字之间有一个点来确定去掉什么地方
		//算出两个字之间的距离最大的两个
		pos = ptList.FindIndex(4);
		CPoint ptLast = ptList.GetAt(pos);
		nMaxNum = 0;
		nMaxNo = 4;
		for(i=3;i>0;i--)
		{
			pos = ptList.FindIndex(i);
			ptTemp = ptList.GetAt(pos);
			if (ptLast.y-ptTemp.x>nMaxNum)
			{
				nMaxNum = ptLast.y - ptTemp.x;
				nMaxNo = i;
			}
			ptLast = ptTemp;
			//如果是1
			if (ptTemp.y-ptTemp.x<=nMaxNo/2)
			{
				ptLast.y = ptLast.x + nMaxNo;
			}			
		}
		nMaxNo+=2;
		//要是nMaxNo>0,说明在第nMaxNo前有一个点
		
		nIndex = ImgList.GetCount();
		if (nMaxNo>1&&nIndex>7)
		{
			for(i=0;i<nMaxNo-3;i++)
			{
				if (ImgList.GetCount()<=7) {
					break;
				}
				ImgList.RemoveHead();
				ptList.RemoveHead();
				nRemove++;
			}
			
			for(i=0;i<nIndex-nMaxNo-4;i++)
			{
				if (ImgList.GetCount()<=7)
				{
					break;
				}
				ImgList.RemoveTail();
				ptList.RemoveTail();
			}
		}
	}


	CImage ImgOut2;
	ImgOut2 = ImgGray;
    pos = ptList.GetHeadPosition();
	CPoint ptFirst = ptList.GetAt(pos);
	pos = ptList.GetTailPosition();
	CPoint ptLast = ptList.GetAt(pos);
	int kkk;
	int ll;
    if(ImgList.GetCount()>=7 && (ptFirst.y-ptFirst.x)>=5)
	{
       kkk = max(ptFirst.x-2,0);
       ll = min(ptLast.y+2,ImgGray.GetWidth());
	   RImgGray.CutFromImg(ImgOut2,CRect(kkk,0,ll,RImgGray.GetHeight()));
	}

    else
		{ 	
		   kkk = max(ptFirst.x+nLR[0]-12,0);
	        ll = min(ptLast.y+nLR[0],ImgGray.GetWidth());
			ImgGray.CutFromImg(ImgOut2,CRect(kkk,0,ll,ImgGray.GetHeight()));
		}
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -