📄 showprocedure.cpp
字号:
// 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 + -