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

📄 showprocedure.cpp

📁 车牌识别(改定位)武汉理工大学
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ShowProcedure.cpp : implementation file
//

#include "stdafx.h"
#include "ShowProcedure.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "LocateGray.h"
#include "SegmentationbyModel.h"
#include "SegmentationbyProjection.h"
/////////////////////////////////////////////////////////////////////////////
// CShowProcedure dialog


CShowProcedure::CShowProcedure(CWnd* pParent /*=NULL*/)
	: CDialog(CShowProcedure::IDD, pParent)
{
	//{{AFX_DATA_INIT(CShowProcedure)
	m_bExample = FALSE;
	m_strResult = _T("");
	m_dError = 0.0;
	m_strColorType = _T("");
	//}}AFX_DATA_INIT

	
	CString strPath;
	strPath.Format("%sannInt.ann",GetAppPath());
	m_BpNet.LoadBpNetInt(strPath);
	strPath.Format("%sannInt1.ann",GetAppPath());
	m_BpNet.LoadBpNetInt1(strPath);

	strPath.Format("%sannChar.ann",GetAppPath());
	m_BpNet.LoadBpNetChar(strPath);
	strPath.Format("%sannCDG0.ann",GetAppPath());
	m_BpNet.LoadBpNetCDG0(strPath);
	m_BpNet.LoadBpNetSimilar();

	strPath.Format("%sannInt3.ann",GetAppPath());
	m_RecBaseInt3.LoadBpNet(strPath);

	for(int i=0;i<3;i++)
	{
		strPath.Format("%sAnnCharInt%d.ann",GetAppPath(),i+1);
		m_RecBaseCharInt[i].LoadBpNet(strPath);
		strPath.Format("%sAnnChar%d.ann",GetAppPath(),i+1);
		m_RecBaseChar[i].LoadBpNet(strPath);
		strPath.Format("%sChinese%d.ann",GetAppPath(),i+1);
		m_RecBaseChinese[i].LoadBpNet(strPath);
	}
}

CString CShowProcedure::RecChar(CList<CImage,CImage&>& ListText)
{
	CString strRes;
	int nCount = ListText.GetCount();
	if (nCount<5) 
	{
		return "";
	}
	int i;
	POSITION pos;
//	double dRecVal;
	double dRecValTemp[3];
	char cRes[3];
	CImage imgTemp;
	int nStart = 0;
	if (nCount>=7) 
	{
		pos = ListText.FindIndex(nStart++);//第二个字为字母		
		imgTemp = ListText.GetAt(pos);
		//根据是否有环进行分类
		cRes[0] = m_RecBaseChinese[0].Recogn(imgTemp,dRecValTemp[0]);
		cRes[1] = m_RecBaseChinese[1].Recogn(imgTemp,dRecValTemp[1]);
		cRes[2] = m_RecBaseChinese[2].Recogn(imgTemp,dRecValTemp[2]);
		strRes = CRecImg::m_strChinese[cRes[2]-'0'];
	//	strRes = "浙";//第一个为汉字
		nStart = 1;		
	}
	else
	{
		strRes = "?";
	}
	pos = ListText.FindIndex(nStart++);//第二个字为字母		
	imgTemp = ListText.GetAt(pos);

	
	//根据是否有环进行分类
	cRes[0] = m_RecBaseChar[0].Recogn(imgTemp,dRecValTemp[0]);
	cRes[1] = m_RecBaseChar[1].Recogn(imgTemp,dRecValTemp[1]);
	cRes[2] = m_RecBaseChar[2].Recogn(imgTemp,dRecValTemp[2]);
//	cRes[0] = cRes[1];

/*
		if(cRes[0]==cRes[1]||cRes[0]==cRes[2])
		{
		}
		else if(cRes[1]==cRes[2])
		{
			cRes[0] = cRes[1];
			dRecValTemp[0] = max(dRecValTemp[1],dRecValTemp[2]);
		}
		else
		{
			cRes[0] = '?';
		}*/
	

	strRes.Insert(strRes.GetLength(),cRes[0]);
//	strRes.Insert(strRes.GetLength(),m_BpNet.RecognChar(imgTemp,dRecVal));
	
	for(i=nStart;i<nStart+2;i++)//数字,字母组合
	{		
		pos = ListText.FindIndex(i);//第二个字为字母		
		imgTemp = ListText.GetAt(pos);
		
//		cRes[0] = m_BpNet.RecognChar(imgTemp,dRecValTemp[0]);
//		cRes[1] = m_BpNet.RecognInt(imgTemp,dRecValTemp[1]);
		cRes[0] = m_RecBaseCharInt[0].Recogn(imgTemp,dRecValTemp[0]);
		cRes[1] = m_RecBaseCharInt[1].Recogn(imgTemp,dRecValTemp[1]);
		cRes[2] = m_RecBaseCharInt[2].Recogn(imgTemp,dRecValTemp[2]);
	//	cRes[0] = cRes[1];
		/*
		if(cRes[0]==cRes[1]||cRes[0]==cRes[2])
				{
				}
				else if(cRes[1]==cRes[2])
				{
					cRes[0] = cRes[1];
					dRecValTemp[0] = max(dRecValTemp[1],dRecValTemp[2]);
				}
				else
				{
					cRes[0] = '?';
				}*/
		

		//根据是否有环进行分类
	/*	CList<int,int> ListNum;
		CList<CRect,CRect> ListRect;
		int nRingNum = imgTemp.GetRingNum(ListNum,ListRect);
		cRes[0] = '?';
/*
				if (nRingNum==2)
				{
					cRes[0] = 'B';
				}
				else if (nRingNum==1) 
				{
					int nImgH = imgTemp.GetHeight();
					CRect rcR = ListRect.GetHead();
					//如果环的位置是接近整个字符,应该是0
					if (rcR.Height()>nImgH/2) 
					{
						cRes[0] = '0';			
					}
					else//如果环的位置在上面应该是9,p
					{
						cRes[0] = m_BpNet.RecognSimilar(imgTemp,dRecValTemp[0],SIMILAR_PR89);
					}			
				}
		
		if (cRes[0]=='?')
		{
			cRes[0] = m_BpNet.RecognChar(imgTemp,dRecValTemp[0]);
			cRes[1] = m_BpNet.RecognInt(imgTemp,dRecValTemp[1]);
			char cTemp = dRecValTemp[0]>dRecValTemp[1]?cRes[0]:cRes[1];
			if (cRes[0] == cRes[1] ||  (cRes[0]=='D' && cRes[1]=='0'))
			{
                strRes.Insert(strRes.GetLength(),cTemp);
				continue;
			}
			//dRecValTemp[0] = max(dRecValTemp[0],dRecValTemp[1]);
			switch(cTemp) 
			{
			case '0':
			case 'C':
			case 'D':
			case 'G':
			case 'U':
				
				break;
			case '7':
			case 'T':
				int nStart1;
				nStart1 = 0;
                int HContinue,VContinue;
				VContinue = imgTemp.GetHVContinue(0,TRUE,nStart1);
				HContinue = imgTemp.GetHVContinue(0,FALSE,nStart1);
				if (VContinue == -1)
				{
					if (cRes[0] == 'T')
					{
                        strRes.Insert(strRes.GetLength(),cRes[1]);
				        continue;
					}
				}
				if (nStart1-HContinue>4)
				{
					if (cRes[0] == '7')
					{
                        strRes.Insert(strRes.GetLength(),cRes[1]);
				        continue;
					}
				}
				break;
			case 'A':
			case '4':
				break;
			default:
				break;;
			}			
		}*/
		strRes.Insert(strRes.GetLength(),cRes[0]);
	}
	nStart += 2;
	for(i=nStart;i<nCount;i++)
	{
		pos = ListText.FindIndex(i);//第二个字为字母		
		imgTemp = ListText.GetAt(pos);

//		cRes[0] = m_RecBaseInt3.Recogn(imgTemp,dRecValTemp[0]);
		cRes[0] = m_BpNet.RecognInt(imgTemp,dRecValTemp[0]);
		cRes[1] = m_BpNet.RecognInt1(imgTemp,dRecValTemp[1]);	
		cRes[2] = m_RecBaseInt3.Recogn(imgTemp,dRecValTemp[2]);	
		
		if(cRes[0]==cRes[1]||cRes[0]==cRes[2])
		{
		}
		else if(cRes[1]==cRes[2])
		{
			cRes[0] = cRes[1];
			dRecValTemp[0] = max(dRecValTemp[1],dRecValTemp[2]);
		}
		else
		{
			cRes[0] = '?';
		}

//		cRes[0] = dRecValTemp[0]>dRecValTemp[1]?cRes[0]:cRes[1];
//		dRecValTemp[0] = max(dRecValTemp[0],dRecValTemp[1]);		
		strRes.Insert(strRes.GetLength(),cRes[0]);
	}
	return strRes;
}
void CShowProcedure::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CShowProcedure)
	DDX_Control(pDX, IDC_LIST_FILE_NAME, m_ListCtrlFileName);
	DDX_Check(pDX, IDC_CHECK_EXAMPLE, m_bExample);
	DDX_Text(pDX, IDC_EDIT_RESULT, m_strResult);
	DDX_Text(pDX, IDC_EDIT_ERROR, m_dError);
	DDX_Text(pDX, IDC_EDIT_COLOR_TYPE, m_strColorType);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CShowProcedure, CDialog)
	//{{AFX_MSG_MAP(CShowProcedure)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpen)
	ON_COMMAND(ID_MENU_OPEN, OnMenuOpen)
	ON_WM_DRAWITEM()
	ON_BN_CLICKED(IDC_BUTTON_REC, OnButtonRec)
	ON_BN_CLICKED(IDC_BUTTON_TRAIN, OnButtonTrain)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_BN_CLICKED(IDC_BUTTON_SAVE_AS_EXAPLE, OnButtonSaveAsExaple)
	ON_BN_CLICKED(IDC_BUTTON_LOAD_ANN, OnButtonLoadAnn)
	ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
	ON_BN_CLICKED(IDC_BUTTON_ALL, OnButtonAll)
	ON_NOTIFY(NM_CLICK, IDC_LIST_FILE_NAME, OnClickListFileName)
	ON_NOTIFY(NM_RCLICK, IDC_LIST_FILE_NAME, OnRclickListFileName)
	ON_BN_CLICKED(IDC_TRAIN_CHAR, OnTrainChar)
	ON_BN_CLICKED(IDC_BUTTON_CDGO, OnButtonCdgo)
	ON_BN_CLICKED(IDC_BUTTON_A4, OnButtonA4)
	ON_BN_CLICKED(IDC_BUTTON_7T, OnButton7t)
	ON_BN_CLICKED(IDC_BUTTON_PR8, OnButtonPr8)
	ON_BN_CLICKED(IDC_BUTTON_NUM_1, OnButtonNum1)
	ON_BN_CLICKED(IDC_BUTTON_CHAR_3, OnButtonChar3)
	ON_BN_CLICKED(IDC_BUTTON_INT_3, OnButtonInt3)
	ON_BN_CLICKED(IDC_BUTTON_CHAR_AND_INT, OnButtonCharAndInt)
	ON_BN_CLICKED(IDC_BUTTON_CharInt1, OnBUTTONCharInt1)
	ON_BN_CLICKED(IDC_BUTTON_CharInt2, OnBUTTONCharInt2)
	ON_BN_CLICKED(IDC_BUTTON_GET_ERROR, OnButtonGetError)
	ON_BN_CLICKED(IDC_REVERSECLR, OnReverseclr)
	ON_BN_CLICKED(IDC_BUTTON_CHAR1, OnButtonChar1)
	ON_BN_CLICKED(IDC_BUTTON_CHINESE1, OnButtonChinese1)
	ON_BN_CLICKED(IDC_BUTTON_CHINESE2, OnButtonChinese2)
	ON_BN_CLICKED(IDC_BUTTON_CHINESE3, OnButtonChinese3)
	ON_BN_CLICKED(IDC_CHECK_EXAMPLE, OnCheckExample)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShowProcedure message handlers
BOOL CShowProcedure::Run(CString strPath)
{
	
	m_ImgOrg.Detroy();
	m_ImgAfterCut.Detroy();
	m_ImgGray.Detroy();
	m_ImgTwo.Detroy();
	m_ImgLocation.Detroy();
	m_ImgChePai.Detroy();
	m_ImgTextPic.Detroy();
	m_strResult = "";
//	CLocation * pLocation;
	m_strColorType = "";
	
	//读图
	if (!m_ImgOrg.Load(strPath)) 
	{
		m_rcChePai = CRect(0,0,0,0);
		InvalidateRect(NULL);
		return FALSE;
	}
	m_rcChePai = CRect(0,0,m_ImgOrg.GetWidth(),m_ImgOrg.GetHeight());
	//剪图
	int nCutLineNum = (m_ImgOrg.GetWidth()==320)?27:0;
	CRect rcRealNeed = CRect(0,0,m_ImgOrg.GetWidth(),m_ImgOrg.GetHeight()-nCutLineNum);
	if (!m_ImgOrg.CutFromImg(m_ImgAfterCut,rcRealNeed))
	{
		InvalidateRect(NULL);
		return FALSE;
	}
	//转化为灰度图象
	if (!m_ImgAfterCut.Rgb2Gray(m_ImgGray,0.299,0.587,0.114)) 
	{
		InvalidateRect(NULL);
		return FALSE;
	}
	//定位
	//判断白天还是晚上。返回Day==0 or Night==1
  
    CImage ImgTemp3,ImgTemp4;
  	ImgTemp3 = m_ImgGray;
  	BOOL Dayornight = TRUE;
 // 	Dayornight=ImgTemp3.DayorNight(ImgTemp4);
    CRect rcChePai;
	//晚上用车灯定位方法
	if(Dayornight==FALSE)
	{
		CLocateGray Locate;	
		Locate.Locate(m_ImgLocation,rcChePai,m_ImgGray,25);
	}
	//白天用灰度跳变方法
	else if(Dayornight==TRUE)
	{
		CLocateGray Locate;
		Locate.Locate(m_ImgLocation,rcChePai,m_ImgGray,25);
	}
	m_rcChePai = rcChePai;
	//矫正
	m_ImgLocation.ShowImg();
	//切割
	
	//识别
/*
//	m_ImgGray.HistogramEqualization();

	
	//求出车牌位置
	CList<CRect,CRect> rcChePaiList;
	CRect rcChePai;
	if (!imgTemp.GetChePaiRect(m_ImgLocation,m_ImgGray,rcChePaiList)) 
	{
		//根据梯度将灰度图转化为二值化图
		int nTh = 30;
		if (!imgTemp2.Threthold(imgTemp,nTh))
		{
			InvalidateRect(NULL);
			return FALSE;
		}
		m_ImgTwo = imgTemp;
		
		if (!imgTemp.GetChePaiRect(m_ImgLocation,m_ImgGray,rcChePaiList)) 
		{
			InvalidateRect(NULL);
			return FALSE;
		}		
	}
	//判断哪个区域是车牌,并且剪切车牌
	rcChePai = rcChePaiList.GetTail();	
	if (!m_ImgGray.CutFromImg(m_ImgChePai,rcChePai)) 
	{
		InvalidateRect(NULL);
		return FALSE;
	}
*/
	if (!m_ImgGray.CutFromImg(m_ImgChePai,rcChePai)) 
	{
		InvalidateRect(NULL);
		return FALSE;
	}
//	m_ImgChePai.ShowImg();
	CImage imgColor;
	
	BOOL m_bBlackText = FALSE;
	if (m_ImgOrg.CutFromImg(imgColor,rcChePai))
	{
		m_strColorType = imgColor.GetColorType(m_bBlackText);
		UpdateData(FALSE);
	}
//	m_ImgChePai = m_ImgGray;
	CImage Temp2 = m_ImgChePai;
//	m_ImgChePai.ShowImg();
   
/*
	BOOL IsEnter = TRUE; 
    CSegmentationByProjection Segment;
    m_TextImgList.RemoveAll();
    if (!Segment.Segment(m_TextImgList,m_ImgChePai,rcChePai,m_ImgGray,m_bBlackText,IsEnter))
    {
      	InvalidateRect(NULL);
        return FALSE;		
     }
//	m_ImgChePai = Temp2;
	CSegmentationbyModel Segment1;
	m_TextImgList.RemoveAll();
	if (!Segment1.Segment(m_TextImgList,m_ImgChePai,rcChePai,m_ImgGray,m_bBlackText,IsEnter))
	{
		InvalidateRect(NULL);
		return FALSE;		
	}*/
    BOOL IsEnter = FALSE;
    CSegmentationByProjection Segment;
    CSegmentationbyModel Segment1;
	m_TextImgList.RemoveAll();
	if(!Segment1.Segment(m_TextImgList,m_ImgChePai,rcChePai,m_ImgGray,m_bBlackText,IsEnter))
	{
		BOOL IsEnter = TRUE;
        m_TextImgList.RemoveAll();
		m_ImgChePai = Temp2;
		if (!Segment.Segment(m_TextImgList,m_ImgChePai,rcChePai,m_ImgGray,m_bBlackText,IsEnter))
		{
			InvalidateRect(NULL);
			return FALSE;		
		}
		m_TextImgList.RemoveAll();
		if (!Segment1.Segment(m_TextImgList,m_ImgChePai,rcChePai,m_ImgGray,m_bBlackText,IsEnter))
		{
			InvalidateRect(NULL);
			return FALSE;		
		}

⌨️ 快捷键说明

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