📄 spdlg.cpp
字号:
MessageBox("没有灰度化","错误",MB_ICONSTOP|MB_OK);
return;
}
LPSTR lpDIB;
LPSTR lpDIBBits;
LONG lLineBytes;
unsigned char * lpSrc; //指向原图像象素点的指针
long lWidth;
long lHeight;
long i,j;
lpDIB = (LPSTR)::GlobalLock((HGLOBAL)m_dib.GetHDIB());
lpDIBBits = m_dib.FindDIBBits(lpDIB);
lWidth = m_dib.DIBWidth(lpDIB);
lHeight = m_dib.DIBHeight(lpDIB);
lLineBytes = WIDTHBYTES(lWidth * 8);
long lCount[256];
for(i=0;i<256;i++)
{
lCount[i]=0;
}
if(m_dib.DIBNumColors(lpDIB) != 256)
{
return;
}
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char *)lpDIB+lLineBytes*i+j;
lCount[*(lpSrc)]++;
}
}
long temp[16];
int k=0;
for(k=0;k<16;k++)
{
temp[k]=0;
for(i=k*16;i<(k+1)*16;i++)
temp[k]+=lCount[i];
}
long max=0;
int t=0;
for(k=15;k>=0;k--)
{
if(temp[k]>max)
{
max=temp[k];
t=k;
}
}
int bLow=0,bUp=0;
bLow=(t-1)*16;
bUp=255;
// 阈值
INT bThre;
bThre=(INT)((2*bUp+bLow)/3);
// 调用ThresholdTrans()函数进行阈值变换
ThresholdTrans(lpDIBBits, m_dib.DIBWidth(lpDIB), m_dib.DIBHeight(lpDIB), bThre);
Show();
Flag=2;
::GlobalUnlock((HGLOBAL)m_dib.GetHDIB());
}
//削弱背景干扰。对图像B作简单的相邻像素灰度值相减,得到新的图像
void CSpDlg::OnWeakenBG()
{
if(Flag!=2)
{
MessageBox("没有二值化","错误",MB_ICONSTOP|MB_OK);
return;
}
LPSTR lpDIB;
lpDIB = (LPSTR)::GlobalLock((HGLOBAL) m_dib.GetHDIB());
//用自定义的模板消弱背景干扰
myTemplate(lpDIB);
Show();
Flag=3;
::GlobalUnlock((HGLOBAL)m_dib.GetHDIB());
}
//对图像G进行中值滤波,得到除掉了大部分干扰的图像C。
void CSpDlg::OnMedianFilter()
{
if(Flag!=3)
{
MessageBox("没有消弱背景","错误",MB_ICONSTOP|MB_OK);
return;
}
LPSTR lpDIB;
LPSTR lpDIBBits;
int iFilterH;
int iFilterW;
int iFilterMX;
int iFilterMY;
lpDIB = (LPSTR)::GlobalLock((HGLOBAL) m_dib.GetHDIB());
lpDIBBits = m_dib.FindDIBBits(lpDIB);
if (m_dib.DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的中值滤波!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) m_dib.GetHDIB());
return;
}
iFilterH = 5;
iFilterW = 1;
iFilterMX = 0;
iFilterMY = 2;
// 调用myMedianFilter()函数中值滤波
if (myMedianFilter(lpDIBBits, m_dib.DIBWidth(lpDIB), m_dib.DIBHeight(lpDIB),
iFilterH, iFilterW, iFilterMX, iFilterMY))
{
Show();
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
Flag=4;
::GlobalUnlock((HGLOBAL) m_dib.GetHDIB());
}
//水平垂直投影检测车牌位置
void CSpDlg::OnHVProject()
{
if(Flag!=4)
{
MessageBox("没有中值滤波","错误",MB_ICONSTOP|MB_OK);
return;
}
LPSTR lpDIB;
long lWidth;
long lHeight;
lpDIB = (LPSTR)::GlobalLock((HGLOBAL) m_dib.GetHDIB());
lWidth = m_dib.DIBWidth(lpDIB);
lHeight = m_dib.DIBHeight(lpDIB);
//水平投影,求取车牌子图像的上下边缘位置
myHprojectDIB(lpDIB, lWidth, lHeight,&m_ipzTop, &m_ipzBottom) ;
m_ipzLeft=0;
m_ipzRight=lWidth;
HDIB hDIB;
HDIB hNewDIB;
hDIB=m_dib.GetHDIB();
//假定的剪裁区域(车牌附近)
CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom);
hNewDIB= myCropDIB(hDIB,rect);
if (hNewDIB != NULL)
{
m_dib.ReplaceHDIB(hNewDIB);
m_dib.InitDIBData();
}
//垂直投影法检测车牌垂直位置
lpDIB = (LPSTR)::GlobalLock((HGLOBAL) m_dib.GetHDIB());
lWidth = m_dib.DIBWidth(lpDIB);
lHeight =m_dib.DIBHeight(lpDIB);
myVprojectDIB(lpDIB, lWidth, lHeight,&m_ipzLeft, &m_ipzRight);
Show();
Flag=5;
::GlobalUnlock((HGLOBAL) m_dib.GetHDIB());
}
//截取车牌子图像
void CSpDlg::OnAreaCut()
{
if(Flag!=5)
{
MessageBox("没有平直投影","错误",MB_ICONSTOP|MB_OK);
return;
}
OnEditPaste();
Show();
OnTempSubrect();
OnEditPaste();
CPoint x1,x2,x3,x4; //车牌子图像矩形区域的4个点
x1.x=m_ipzLeft;x1.y=m_ipzTop;
x2.x=m_ipzLeft;x2.y=m_ipzBottom;
x3.x=m_ipzRight;x3.y=m_ipzBottom;
x4.x=m_ipzRight;x4.y=m_ipzTop;
CRect rcclient;
GetDlgItem(IDC_PIC)->GetClientRect(&rcclient);
//判断是否存在车牌
if(rcclient.PtInRect(x1) && rcclient.PtInRect(x2) &&
rcclient.PtInRect(x3) && rcclient.PtInRect(x4))
{
//以下代码段是为了画出子图像
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_dib.GetHDIB());
int cxDIB = (int) m_dib.DIBWidth(lpDIB);// 获取DIB宽度
int cyDIB = (int) m_dib.DIBHeight(lpDIB);// 获取DIB高度
::GlobalUnlock((HGLOBAL) m_dib.GetHDIB());
CClientDC dc(GetDlgItem(IDC_SUBPIC));
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest;
rcDest= rcDIB;
m_dib.PaintDIB(dc.m_hDC, &rcDest, m_dib.GetHDIB(),
&rcDIB, m_dib.GetDocPalette());
//画出车牌区域
CClientDC cdc(GetDlgItem(IDC_PIC));
CPen pen(PS_SOLID,1,RGB(255,0,0));
cdc.SelectObject(pen);
cdc.MoveTo(m_ipzLeft,m_ipzTop);
cdc.LineTo(m_ipzLeft,m_ipzBottom);
cdc.LineTo(m_ipzRight,m_ipzBottom);
cdc.LineTo(m_ipzRight,m_ipzTop);
cdc.LineTo(m_ipzLeft,m_ipzTop);
}
else MessageBox("没有检测到车牌!","提示",MB_ICONINFORMATION|MB_OK);
EmptyClipboard();
Flag=6;
}
void CSpDlg::OnQuick()
{
if(Flag!=0)
{
CString str;
str="没有打开文件或捕获视频,请重新打开文件或视频";
MessageBox(str,"错误",MB_ICONSTOP|MB_OK);
return;
}
OnTruecolorToGray();
OnTwoValue();
OnWeakenBG();
OnMedianFilter();
OnHVProject();
OnAreaCut();
}
void CSpDlg::OnAbout()
{
if (Ispre)
{
capPreview(m_hWndCap,FALSE);
capDriverDisconnect(m_hWndCap);
}
Invalidate();
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
void CSpDlg::OnTimer(UINT nIDEvent)
{
CClientDC dc(GetDlgItem(IDC_STATIC));
CDC *pMemDC=new CDC;
pMemDC->CreateCompatibleDC(&dc);
pMemDC->SelectObject(m_Bitmap[m_Frame++]);
dc.StretchBlt(-435,245,520,150,pMemDC,0,0,520,150,SRCCOPY);
if(m_Frame==6)m_Frame=0;
delete pMemDC;
CDialog::OnTimer(nIDEvent);
}
//打开文件对话框
void CSpDlg::OnOpenFile()
{
capPreview(m_hWndCap,FALSE);
capDriverDisconnect(m_hWndCap);
CString strPath;
CFile file;
CFileDialog *openFile = new CFileDialog(TRUE,"bmp","*.bmp",NULL,"位图文件(*.bmp)",NULL);
if(openFile->DoModal() == IDOK)
{
strPath = openFile->GetPathName();
if(file.Open(strPath,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
{
AfxMessageBox("无法打开文件!",MB_OK,0);
return;
}
m_dib.m_hDIB = m_dib.ReadDIBFile(file);
m_dib.InitDIBData();
if (m_dib.m_hDIB == NULL)
{
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
return;
}
Show();
}
else return;
Flag=0;
}
void CSpDlg::OnPreview()
{
//视频采集部分
wnd=this->GetDlgItem(IDC_PIC);
m_hWndCap=capCreateCaptureWindow((LPSTR)"Video Capture Windows",
WS_CHILD|WS_VISIBLE,0,0,320,240,wnd->m_hWnd,0);//创建采集窗口
if(!capDriverConnect(m_hWndCap,0))//连接设备
{
MessageBox("未检测到视频设备!","错误",MB_ICONERROR|MB_OK);
return;
}
else
{
capPreviewRate(m_hWndCap,40);//预览模式
capPreview(m_hWndCap,TRUE);
capPreviewScale(m_hWndCap,TRUE);
}
Flag=10;
Ispre=1;
}
void CSpDlg::OnClose()
{
if (Ispre)
{
capPreview(m_hWndCap,FALSE);
capDriverDisconnect(m_hWndCap);
}
SendMessage(WM_CLOSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -