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

📄 image.cpp

📁 车牌识别(改定位)武汉理工大学
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if(bBlackText)
	{
				ratio = ratio-0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
				}
				else
				{
				ratio = ratio+0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
	}*/
		
		if(bBlackText)
		{
			if (dRate1<dRate)
			{
				ratio = ratio-0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
				Enter = 1;
			}
			else
			{
				if (Enter == 1)
				{
					ratio = ratio+0.1;
				}
				else
				{
					ratio = ratio+0.05;
				}
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
			}
			
		}
		else
		{
			if (dRate1<dRate)
			{
				ratio = ratio+0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
				Enter = 1;
			}
			else
			{
				if(Enter == 1)
				{
					ratio = ratio-0.1;
				}
				else
				{
					ratio = ratio - 0.05;
				}
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
			}
		}
	}
	while(dRate>0.7 && (ratio<0.4 && ratio>0.1))
	{
	/*
	if(bBlackText)
	{
				ratio = ratio+0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
				}
				else
				{
				ratio = ratio-0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
	}*/
		if(bBlackText)
		{
			if (dRate1<dRate)
			{
				ratio = ratio+0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
				Enter = 1;
			}
			else
			{
				if (Enter == 1)
				{
					ratio = ratio-0.1;
				}
				else
				{
					ratio = ratio-0.05;
				}
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
			}
			
		}
		else
		{
			if (dRate1<dRate)
			{
				ratio = ratio-0.05;
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
				Enter = 1;
			}
			else
			{
				if(Enter == 1)
				{
					ratio = ratio+0.1;
				}
				else
				{
					ratio = ratio + 0.05;
				}
				Threold1(ImgOut,Template4,Template3,pos,min,bBlackText,ratio);
				dRate1 = dRate;
				dRate = ImgOut.GetAllTextPointNum(CRect(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4),0);
				dRate/=((GetWidth()/2)*(GetHeight()/2));
			}
		}
		
	}
	/*
   	if (dRate<0.25)
	{
	if (bBlackText == TRUE)
	{
	dPercent = 0.7;
	}
	else
	{
	dPercent = 0.3;
	}
	CRect rcImgTemp(m_nWidth/4,m_nHeight/4,m_nWidth*3/4,m_nHeight*3/4);
	CutFromImg(ImgTemp,rcImgTemp);
	ImgTemp.CalCulate(pHist,pMean,dS);
	nToTalPix = ImgTemp.GetWidth()*ImgTemp.GetHeight();
	pos=0;
	double nPix = 0;
	for(i=255;i>0;i--)
	{
	nPix += pHist[0][i];
	if (nPix/nToTalPix>dPercent)
	{
	pos=i;
	break;
	}
	}	
	Threthold(ImgOut,pos,!bBlackText);
	}
	*/
	
    //反色还是有错误,下面的处理方法不好用
    if (dRate>0.72)
    {
		for (i=0;i<nToTalPix;i++)
		{
			ImgOut.m_pR[i] = BYTE(255-ImgOut.m_pR[i]);
		}
		
    }
    
	
	//求连通,去噪并切割
	CImage ImgOut1,ImgOutLianTong;
	ImgOut1 = ImgOut;
	CList<int,int> ListNum;
	CList<CRect,CRect> ListRect;
	ImgOut1.GetLiantong(ListNum,ListRect,ImgOutLianTong,0);
	
	ListRect.RemoveAll();
	POSITION posList;
	int nIndex = 1;
	nPix = ImgOut1.GetWidth()*ImgOut1.GetHeight();
	while (nIndex<ListNum.GetCount())
	{
		posList = ListNum.FindIndex(nIndex);
		int nVal = ListNum.GetAt(posList);
		if (nVal<10 &&nVal>0)
		{
			for(i=0;i<nPix;i++)
			{
				if (ImgOutLianTong.m_pR[i]==nIndex)
				{
					ImgOut1.m_pR[i] = 255;
				}
			}
		}		
		else if (nVal>=10)
		{
			CRect rcR(ImgOut1.GetWidth(),ImgOut1.GetHeight(),0,0);
			for (i=0;i<ImgOut1.GetHeight();i++)
			{
				for (int j=0;j<ImgOut1.GetWidth();j++)
				{
					if (ImgOutLianTong.m_pR[i*ImgOut1.GetWidth()+j]==nIndex)
					{
						rcR.left = min(j,rcR.left);
						rcR.right = max(j,rcR.right);
						rcR.top = min(i,rcR.top);
						rcR.bottom = max(i,rcR.bottom);
					}
				}
			}
			if ((rcR.top<4 || rcR.top>ImgOut1.GetHeight()-4) && rcR.Height()<ImgOut1.GetHeight()/3)
			{
				for(i=0;i<nPix;i++)
				{
					if (ImgOutLianTong.m_pR[i]==nIndex)
					{
						ImgOut1.m_pR[i] = 255;
					}
				}				
			}
			else if(rcR.Width()<m_nWidth/7&&rcR.Height()>7)
			{
				ListRect.AddTail(rcR);
			}
		}
		nIndex++;			
	}
	//采用模板分割
	//
	CList<CImage,CImage&> ListImg;
	return ImgOut1.CutTextByModel(ImgOutList);
	//////////////////////////////////////////////////////////////////////////
	
	/*int nCount = ListRect.GetCount();
	CList<CPoint,CPoint> ptListUp;
	CList<CPoint,CPoint> ptListDown;
	BOOL bHaveLiangTong = FALSE;
	if (nCount>1)//说明能够提取出两个字以上
	{
		CRect * pRect = new CRect[ListRect.GetCount()];
		double dAvgH = 0;
		for(i=0;i<nCount;i++)
		{
			posList = ListRect.FindIndex(i);
			pRect[i] = ListRect.GetAt(posList);
			dAvgH += pRect[i].Height();
		}
		dAvgH /= nCount;
		
		for(i=0;i<nCount;i++)
		{
			if (fabs(pRect[i].Height()-dAvgH)<1.5) 
			{
				ptListUp.AddTail(CPoint(pRect[i].left+pRect[i].Width()/2,pRect[i].top));
				ptListDown.AddTail(CPoint(pRect[i].left+pRect[i].Width()/2,pRect[i].bottom));
			}
		}
		if (ptListUp.GetCount()>1) 
		{
			double dA[2],dB[2];
			GetLineAB(ptListUp,dA[0],dB[0]);
			GetLineAB(ptListDown,dA[1],dB[1]);
			if (fabs(dA[0]-dA[1])>0.05) 
			{
				if (fabs(dA[0])<fabs(dA[1]))
				{
					dA[1] = dA[0];
					dB[1] = dB[0]+dAvgH;
				}
				else
				{
					dA[0] = dA[1];
					dB[0] = dB[1]-dAvgH;
				}
			}
			
			//求图像的高度
			int nUp = ROUND(dA[0]*0+dB[0]);
			int nDown = ROUND(dA[1]*0+dB[1]);
			int nHeight = nDown-nUp;
			nUp = ROUND(dA[0]*m_nWidth+dB[0]);
			nDown = ROUND(dA[1]*m_nWidth+dB[1]);
			nHeight = max(nDown-nUp,nHeight);
			nHeight++;
			nHeight = min(nHeight,m_nHeight);
			
			CImage ImgTemp;
			ImgTemp.Create(CSize(m_nWidth,nHeight),FALSE);
			int j;
			for(i=0;i<m_nWidth;i++)
			{
				nUp = ROUND(dA[0]*i+dB[0]);
				nDown = ROUND(dA[1]*i+dB[1]);
				nUp = max(nUp,0);
				nDown = min(nDown,m_nHeight-1);
				for(j=nUp;j<=nDown;j++)
				{
					if (j-nUp<nHeight)
					{
						ImgTemp.m_pR[i+(j-nUp)*m_nWidth] = 
							ImgOut1.m_pR[j*m_nWidth+i];
					}					
				}
			}
			ImgOut = ImgTemp;
			bHaveLiangTong = TRUE;
		}		
		delete []pRect;
	}
	if (!bHaveLiangTong) 
	{
		if (!ImgOut1.CutExact(ImgOut)) //细定位,输出为黑字白底
		{		
			return FALSE;
		}
	}
 	return ImgOut.GetExactText(ImgOutList);	*/
}

BOOL CImage::Grad(CImage &ImgOut)
{
    if (!ImgOut.Create(CSize(this->GetWidth(),this->GetHeight()),FALSE))
	{
		return FALSE;
	}
	int nIndex;
	for (int i=0;i<ImgOut.GetHeight();i++)
	{		
		for (int j=1;j<ImgOut.GetWidth()-1;j++)
		{
			nIndex = i*m_nWidth+j;
			ImgOut.m_pR[nIndex] = BYTE(abs(2*m_pR[nIndex]-m_pR[nIndex-1]-m_pR[nIndex+1]));
		}
	}
	return TRUE;
}
BOOL CImage::Grad1(CImage &ImgOut)
{
    if (!ImgOut.Create(CSize(this->GetWidth(),this->GetHeight()),FALSE))
	{
		return FALSE;
	}
    for (int i=0;i<ImgOut.GetHeight();i++)
	{		
		for (int j=0;j<ImgOut.GetWidth();j++)
		{
			ImgOut.m_pR[i*m_nWidth+j] = 0;
		}
	}
	//int nIndex;
	for (i=0;i<ImgOut.GetHeight();i++)
	{		
		for (int j=1;j<ImgOut.GetWidth()-1;j++)
		{
			//nIndex = i*ImgOut.GetWidth()+j;
			ImgOut.m_pR[i*ImgOut.GetWidth()+j] = BYTE(abs(m_pR[i*ImgOut.GetWidth()+j-1]-m_pR[i*ImgOut.GetWidth()+j+1])+0.5);
		}
	}
	return TRUE;
}
//将灰度图转化为二值化图象
BOOL CImage::graytoTwo(CImage &ImgOut, CImage &Imgavg, CImage &ImagTh)
{
    if (!ImgOut.Create(CSize(this->GetWidth(),this->GetHeight()),FALSE))
	{
		return FALSE;
	}
	int nPix = m_nWidth*m_nHeight;
	double dS = 0;
	for(int i=0;i<nPix;i++)
	{
		dS += m_pR[i];
	}
	dS /= nPix;
    for (i=0;i<ImgOut.GetHeight();i++)
	{
		for (int j=0;j<ImgOut.GetWidth();j++)
		{
			if (m_pR[i*m_nWidth+j]>ImagTh.m_pR[i*ImagTh.GetWidth()+j]
				&& Imgavg.m_pR[i*Imgavg.GetWidth()+j]>BYTE(2*dS))
				//	&& m_pR[i*m_nWidth+j]>2*Imgavg.m_pR[i*Imgavg.GetWidth()+j])
				ImgOut.m_pR[i*ImgOut.GetWidth()+j]=BYTE(255);
			else
                ImgOut.m_pR[i*ImgOut.GetWidth()+j]=BYTE(0);
		}
	}
	return TRUE;
}

BOOL CImage::Stretch(BYTE nMax, BYTE nMin)
{
	BYTE nMaxMin[2] = {0,255};
	int nPix = m_nWidth*m_nHeight;
	for(int i=0;i<nPix;i++)
	{
		if (m_pR[i]>nMaxMin[0])
		{
			nMaxMin[0] = m_pR[i];
		}
		else if (m_pR[i]<nMaxMin[1])
		{
			nMaxMin[1] = m_pR[i];
		}
		if (m_bRGB)
		{
			if (m_pG[i]>nMaxMin[0])
			{
				nMaxMin[0] = m_pG[i];
			}
			else if (m_pG[i]<nMaxMin[1])
			{
				nMaxMin[1] = m_pG[i];
			}
			
			if (m_pB[i]>nMaxMin[0])
			{
				nMaxMin[0] = m_pB[i];
			}
			else if (m_pB[i]<nMaxMin[1])
			{
				nMaxMin[1] = m_pB[i];
			}
		}
	}
	
	if (nMax==nMaxMin[0]&&nMin==nMaxMin[1]) 
	{
		return TRUE;
	}
	double dStep = double(nMax-nMin+1)/(nMaxMin[0]-nMaxMin[1]);
	double dTemp;
	for(i=0;i<nPix;i++)
	{
		dTemp = dStep * (m_pR[i]-nMaxMin[1]);
		dTemp = dTemp>nMax?nMax:dTemp;
		dTemp = dTemp<nMin?nMin:dTemp;
		m_pR[i] = (BYTE)dTemp;
		
		if (m_bRGB)
		{
			dTemp = dStep * (m_pG[i]-nMaxMin[1]);
			dTemp = dTemp>nMax?nMax:dTemp;
			dTemp = dTemp<nMin?nMin:dTemp;
			m_pG[i] = (BYTE)dTemp;
			
			dTemp = dStep * (m_pG[i]-nMaxMin[1]);
			dTemp = dTemp>nMax?nMax:dTemp;
			dTemp = dTemp<nMin?nMin:dTemp;
			m_pG[i] = (BYTE)dTemp;
		}
	}
	return TRUE;
}
CString GetAppPath()
{
	CString path;
	char filepath[1024];
	char lpBuffer[1024];
	GetModuleFileName(AfxGetInstanceHandle(),lpBuffer,1024);
	int len=strlen(lpBuffer);
	for(int i=len;i>0;i--)
	{
		if(lpBuffer[i]=='\\') 
		{
			break;	
		}
	}
	memcpy(filepath,lpBuffer,i+1);
	filepath[i+1]=0;
	path=filepath;
	return path;
}

int CImage::GetConnectivity()
{
	CImage Temp;
	Temp = *this;
	
	Temp.Crop(CRect(-1,-1,m_nWidth+1,m_nHeight+1));	
	Temp.Inverse();	
	int iInverseComponentNum;
	iInverseComponentNum=Temp.Label();
	
	return (iInverseComponentNum-1);
}
void CImage::Inverse()
{
	int nPix = m_nWidth*m_nHeight;	
	for(long i=0; i<nPix; i++)
		m_pR[i]=(unsigned char)(255-m_pR[i]);
}
int CImage::Label()
{
	int m_iPixelNum=m_nWidth*m_nHeight;
	
	int* piData;
	piData=new int[m_iPixelNum];
	
	for(long k=0; k<m_iPixelNum; k++)
		if(m_pR[k]==0)
			piData[k]=0;
		else
			piData[k]=-1;
		int iNum=0;
		
		int i,j;
		for(i=0;i<m_nHeight;i++)
			for(j=0;j<m_nWidth;j++)
			{
				if(piData[i*m_nWidth+j]==-1)
				{
					//原点
					if( i==0 && j==0 )
					{
						iNum++;
						piData[i*m_nWidth+j]=iNum;
						continue;
					}
					
					//上边界
					if(i==0)
						if(piData[i*m_nWidth+j-1]==0)
						{
							iNum++;
							piData[i*m_nWidth+j]=iNum;
							continue;
						}
						else
						{
							piData[i*m_nWidth+j]=piData[i*m_nWidth+j-1];
							continue;
						}
						
						//下边界
						if(j==0)
							if(piData[(i-1)*m_nWidth+j]==0)
							{
								iNum++;
								piData[i*m_nWidth+j]=iNum;
								continue;
							}
							else
							{
								piData[i*m_nWidth+j]=piData[(i-1)*m_nWidth+j];
								continue;
							}
							
							
							if( (i>0&&piData[(i-1)*m_nWidth+j]==0) && (j>0&&piData[i*m_nWidth+j-1]==0) )
							{
								iNum++;
								piData[i*m_nWidth+j]=iNum;
								continue;
							}
							
							if( (i>0&&piData[(i-1)*m_nWidth+j]!=0) && (j>0&&piData[i*m_nWidth+j-1]==0) )
							{
								piData[i*m_nWidth+j]=piData[(i-1)*m_nWidth+j];
								continue;
							}
							if( (i>0&&piData[(i-1)*m_nWidth+j]==0) && (j>0&&piData[i*m_nWidth+j-1]!=0) )
							{
								piData[i*m_nWidth+j]=piData[i*m_nWidth+j-1];
								continue;
							}
							if(piData[(i-1)*m_nWidth+j]==piData[i*m_nWidth+j-1])
								piData[i*m_nWidth+j]=piData[i*m_nWidth+j-1];
							else
							{	
								int iDiscard=piData[(i-1)*m_nWidth+j];
								int iReplace=piData[i*m_nWidth+j-1];
								
								int ii,jj;
								for(ii=0; ii<m_nHeight; ii++)
									for(jj=0; jj<m_nWidth; jj++)
										if(piData[ii*m_nWidth+jj]==iDiscard)
											piData[ii*m_nWidth+jj]=iReplace;
										piData[i*m_nWidth+j]=iReplace;
							}
				}
			}
			
			for(k=0; k<m_iPixelNum; k++)
				piData[k]=-piData[k];
			
			int index=0;
			int iValue;
			for(k=0; k<m_iPixelNum; k++)
				if(piData[k]<0)
				{
					iValue=piData[k];
					index++;
					for(long kk=k; kk<m_iPixelNum; kk++)
						if(piData[kk]==iValue)
							piData[kk]=index;
				}
				

⌨️ 快捷键说明

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