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

📄 spdlg.cpp

📁 基于图象理解的汽车牌照自动识别系统是智能交通系统(ITS)的一个重要分支
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -