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

📄 typerecview.cpp

📁 一个比较重要的车牌识别程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	ReleaseDC(pDC);
	
	
}

//灰度转换测试
//

void CTypeRecView::OnTempGray() 
{
	
	CTypeRecDoc* pDoc = GetDocument();
	HDIB hDIB=pDoc->GetHDIB();
	
	long lWidth;                    //图像宽度和高度
	long lHeight;
	LONG lLineBytes;
	
	// 指向DIB的指针
	LPSTR	lpDIB;
	unsigned char * lpSrc;          //指向原图像象素点的指针
	
	// 指向DIB象素指针
	LPSTR   lpDIBBits;
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	
	// 更改光标形状
	BeginWaitCursor();
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 找到DIB图像象素起始位置
	lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
	lHeight = ::DIBHeight(lpDIB); //DIB 高度
	lLineBytes=WIDTHBYTES(lWidth*8);	
	
	int i,j;
	
	for(i=0;i<lHeight;i++)
		for(j=0;j<lWidth;j++)
		{
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			//if((*lpSrc)<255&&(*lpSrc)>190)
			if((*lpSrc)<155&&(*lpSrc)>100)
				*lpSrc=255;
			else
				if((*lpSrc)<255&&(*lpSrc)>190)
					*lpSrc=0;
		}
		
		pDoc->SetModifiedFlag(TRUE);
		pDoc->UpdateAllViews(NULL);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	
		
		/*
		// 获取文档
		CTypeRecDoc* pDoc = GetDocument();
		
		  // 指向DIB的指针
		  LPSTR	lpDIB;
		  
			// 指向DIB象素指针
			LPSTR   lpDIBBits;
			
			  unsigned char * lpSrc;          //指向原图像象素点的指针
			  
				// 锁定DIB
				lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
				
				  // 更改光标形状
				  BeginWaitCursor();
				  
					// 找到DIB图像象素起始位置
					lpDIBBits = ::FindDIBBits(lpDIB);
					long lWidth;                    //图像宽度和高度
					long lHeight;
					LONG lLineBytes;
					
					  long i,j;           //循环变量
					  
						lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
						// 找到DIB图像象素起始位置
						lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
						lHeight = ::DIBHeight(lpDIB); //DIB 高度
						
						  lLineBytes=WIDTHBYTES(lWidth*8);
						  
							for(i = 0; i < lHeight; i++)
							{
							// 每列
							for(j =  0; j < lWidth; j++)
							{
							lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
							*lpSrc=0;
							}
							}
							
							  // 更改光标形状
							  EndWaitCursor();
							  
								pDoc->SetModifiedFlag(TRUE);
								pDoc->UpdateAllViews(NULL);
								::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		*/
}

void CTypeRecView::OnTempError() 
{
	CTypeRecDoc* pDoc = GetDocument();
	HDIB hDIB=pDoc->GetHDIB();
	
	long lWidth;                    //图像宽度和高度
	long lHeight;
	LONG lLineBytes;
	
	// 指向DIB的指针
	LPSTR	lpDIB;
	unsigned char * lpSrc;          //指向原图像象素点的指针
	
	// 指向DIB象素指针
	LPSTR   lpDIBBits;
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	
	// 更改光标形状
	BeginWaitCursor();
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 找到DIB图像象素起始位置
	lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
	lHeight = ::DIBHeight(lpDIB); //DIB 高度
	lLineBytes=WIDTHBYTES(lWidth*8);	
	
	int i,j,pixel;
	
	long lHistogram[256];
	for(i=0;i<256;i++)
		lHistogram[i]=0;
	
	//获得直方图
	int iMax1GrayValue=0;
	int iMax2GrayValue=0;
	
	for(i=0;i<lHeight;i++)
	{
		for(j=0;j<lWidth;j++)
		{
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			pixel=(unsigned char)(*lpSrc);
			lHistogram[pixel]++;
		}
	}
	
	for(i=0;i<256;i++)
	{
		//找最大灰度值点为背景灰度值
		if(iMax1GrayValue<lHistogram[i])
		{
			iMax1GrayValue=i;
		}
		else if(iMax2GrayValue<iMax1GrayValue&&iMax2GrayValue-1<iMax2GrayValue&&iMax2GrayValue+1<iMax2GrayValue)
		{
			iMax2GrayValue=i;
		}
	}
	
	
}

//用一初始阈值T对图像A进行二值化得到二值化图像B,初始阈值T的确定方法是:选择阈值
//T=Gmax-(Gmax-Gmin)/3,Gmax和Gmin分别是最高、最低灰度值。
//该阈值对不同牌照有一定的适应性,能够保证背景基本被置为0,以突出牌照区域
//
void CTypeRecView::OnTest11() 
{
	CTypeRecDoc* pDoc=GetDocument();   //获得文档
	LPSTR lpDIB;                       //指向DIB的指针
	LPSTR lpDIBBits;                   //指向DIB的象素的指针
	
    LONG lLineBytes;
	unsigned char * lpSrc;             //指向原图像象素点的指针
	
    long lWidth;                       //图像宽度和高度
	long lHeight;
	
	long i,j;           //循环变量
	
	OnEditCopy();
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
	lHeight = ::DIBHeight(lpDIB); //DIB 高度
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	long lCount[256];
	for(i=0;i<256;i++)
	{
		lCount[i]=0;  //清零
	}
	if(::DIBNumColors(lpDIB) != 256)  //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=(t+5)*16;
	
	//	bLow=100;
	bUp=255;
	// 阈值
	INT	bThre;
	
	bThre=(INT)((2*bUp+bLow)/3);
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 调用ThresholdTrans()函数进行阈值变换
	ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre);
	
	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	// 恢复光标
	EndWaitCursor();
}

//(2)削弱背景干扰。对图像B作简单的相邻像素灰度值相减,得到新的图像G,
//即Gi,j=|Pi,j-Pi,j-1|i=0,1,…,439;j=0,1,…,639Gi,0=Pi,0,左边缘直接赋值,
//不会影响整体效果。
//
void CTypeRecView::OnTest12() 
{
	
	CTypeRecDoc* pDoc=GetDocument();   //获得文档
	LPSTR lpDIB;                       //指向DIB的指针
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	
	//用自定义的模板消弱背景干扰
	myTemplate(lpDIB);
	
	pDoc->SetModifiedFlag(TRUE);
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	
}

//区域灰度基本被赋值为0(图2(f))。考虑到文字是由许多短竖线组成,
//而背景噪声有一大部分是孤立噪声,用模板(1,1,1,1,1)T对G进行中值滤波,
//得到除掉了大部分干扰的图像C。
//
void CTypeRecView::OnTest13() 
{
	// 中值滤波
	
	// 获取文档
	CTypeRecDoc* pDoc = GetDocument();
	
	// 指向DIB的指针
	LPSTR	lpDIB;
	
	// 指向DIB象素指针
	LPSTR   lpDIBBits;
	
	// 滤波器的高度
	int iFilterH;
	
	// 滤波器的宽度
	int iFilterW;
	
	// 中心元素的X坐标
	int iFilterMX;
	
	// 中心元素的Y坐标
	int iFilterMY;
	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的中值滤波!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	
	// 创建对话框
	
	// 初始化变量值
	iFilterH = 5;
	iFilterW = 1;
	iFilterMX = 0;
	iFilterMY = 2;
	
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 调用MedianFilter()函数中值滤波
	if (myMedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), 
		iFilterH, iFilterW, iFilterMX, iFilterMY))
	{
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);
		
		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	
	// 恢复光标
	EndWaitCursor();
	
}

//利用水平投影法检测车牌水平位置
//
void CTypeRecView::OnTest14() 
{
	CTypeRecDoc* pDoc=GetDocument();   //获得文档
	LPSTR lpDIB;                       //指向DIB的指针
    long lWidth;                       //图像宽度和高度
	long lHeight;
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
	lHeight = ::DIBHeight(lpDIB); //DIB 高度
	
	//水平投影,求取车牌子图像的上下边缘位置
	//
	myHprojectDIB(lpDIB, lWidth, lHeight,&m_ipzTop, &m_ipzBottom) ;
	m_ipzLeft=0;
	m_ipzRight=lWidth;
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	
	
	//对含车牌图像进行剪裁,得到车牌高度,原图像宽度的图像
	OnTempSubrect();
}

//利用垂直投影法检测车牌垂直位置
//
void CTypeRecView::OnTest15() 
{
	CTypeRecDoc* pDoc=GetDocument();   //获得文档
	LPSTR lpDIB;                       //指向DIB的指针
	
    long lWidth;                       //图像宽度和高度
	long lHeight;
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
	lHeight = ::DIBHeight(lpDIB); //DIB 高度
	
	myVprojectDIB(lpDIB, lWidth, lHeight,&m_ipzLeft, &m_ipzRight) ;
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());		
	OnTempSubrect();
}

void CTypeRecView::OnEditPaste() 
{
	// 粘贴图像
	
	// 创建新DIB
	HDIB hNewDIB = NULL;
	
	// 打开剪贴板
	if (OpenClipboard())
	{
		// 更改光标形状
		BeginWaitCursor();
		
		// 读取剪贴板中的图像
		hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB));
		
		// 关闭剪贴板
		CloseClipboard();
		
		// 判断是否读取成功
		if (hNewDIB != NULL)
		{
			// 获取文档
			CTypeRecDoc* pDoc = GetDocument();
			
			// 替换DIB,同时释放旧DIB对象
			pDoc->ReplaceHDIB(hNewDIB);
			
			// 更新DIB大小和调色板
			pDoc->InitDIBData();
			
			// 设置脏标记
			pDoc->SetModifiedFlag(TRUE);
			
			// 重新设置滚动视图大小
			//	SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
			
			// 实现新的调色板
			OnDoRealize((WPARAM)m_hWnd,0);
			
			// 更新视图
			pDoc->UpdateAllViews(NULL);
		}
		// 恢复光标
		EndWaitCursor();
	}	
}

//综合第4,5步骤
//
void CTypeRecView::OnTest145() 
{
	CTypeRecDoc* pDoc=GetDocument();   //获得文档
	LPSTR lpDIB;                       //指向DIB的指针
    long lWidth;                       //图像宽度和高度
	long lHeight;
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
	lHeight = ::DIBHeight(lpDIB); //DIB 高度
	
	//水平投影,求取车牌子图像的上下边缘位置
	//
	myHprojectDIB(lpDIB, lWidth, lHeight,&m_ipzTop, &m_ipzBottom) ;
	m_ipzLeft=0;
	m_ipzRight=lWidth;
	
	//对含车牌图像进行剪裁,得到车牌高度,原图像宽度的图像
	//	OnTempSubrect();
	
	HDIB hDIB;
	HDIB hNewDIB;
	hDIB=pDoc->GetHDIB();
	
    //假定的剪裁区域(车牌附近)
	//
	CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom);
	hNewDIB= myCropDIB(hDIB,rect);
	
	// 判断是否剪裁成功
	if (hNewDIB != NULL)
	{
		// 获取文档
		CTypeRecDoc* pDoc = GetDocument();
		
		// 替换DIB,同时释放旧DIB对象
		pDoc->ReplaceHDIB(hNewDIB);
		
		// 更新DIB大小和调色板
		pDoc->InitDIBData();
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);
		
		// 实现新的调色板
		OnDoRealize((WPARAM)m_hWnd,0);
		
	}
	
	//5
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
	lWidth = ::DIBWidth(lpDIB);   //DIB 宽度
	lHeight =::DIBHeight(lpDIB); //DIB 高度
	
	myVprojectDIB(lpDIB, lWidth, lHeight,&m_ipzLeft, &m_ipzRight) ;
	
	pDoc->UpdateAllViews(NULL);
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	
}

//截取车牌子图像
//
void CTypeRecView::OnTest16() 
{
	OnEditPaste();
	OnTempSubrect();
	OnEditPaste();	
}

⌨️ 快捷键说明

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