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

📄 bmptestview.cpp

📁 车牌识别及定位
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	int i,j,image[4][4],Height,Width,a,k;
	//filtering
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
//如下代码可防止不同图像调色板的不同
	BYTE * m_Buffer1;
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
	m_Gradmax=0;
    for ( i=0;i<256;i++)
	{
	    m_Grade[i]=0;
	}
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	    m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
	}
	m_Gradmax=0;
    for ( i=1;i<256;i++)
	{
	   if (m_Grade[i]>m_Gradmax)
	   {
		  m_Gradmax=m_Grade[i];
		  k=i;
	   }
	}
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<Width +1;j++)
		{
			image[2][2]=(int) *(m_Buffer1+i*Width+j);
			image[2][1]=(int) *(m_Buffer1+i*Width+j-1);
			image[2][3]=(int) *(m_Buffer1+i*Width+j+1);
			image[1][2]=(int) *(m_Buffer1+(i-1)*Width+j);
			image[1][1]=(int) *(m_Buffer1+(i-1)*Width+j-1);
			image[1][3]=(int) *(m_Buffer1+(i-1)*Width+j+1);
			image[3][2]=(int) *(m_Buffer1+(i+1)*Width+j);
			image[3][1]=(int) *(m_Buffer1+(i+1)*Width+j-1);
			image[3][3]=(int) *(m_Buffer1+(i+1)*Width+j+1);
			a=image[1][1]&&image[1][2]&&image[1][3]&&image[2][1]&&image[2][2]&&image[2][3]&&image[3][1]&&image[3][2]&&image[3][3];
			*(pDoc->m_Dib.m_Buffer+i*Width+j)=(a?k:0);
		}
	}
	if(m_Buffer1)
	{
		delete [] m_Buffer1;
		m_Buffer1=0;
	}
	pDoc->m_BM=true;
	Invalidate();		
}

void CBmpTestView::OnStruOpen() 
{
	// TODO: Add your command handler code here
	OnStruSub();
	OnStruAdd();
}

void CBmpTestView::OnStruClose() 
{
	// TODO: Add your command handler code here
	OnStruAdd();
	OnStruSub();	
}

void CBmpTestView::OnEditBackup() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
    pDoc->m_Dib.restoreimage();
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnEditBlue() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_Dib.BPP<=8)
	{
       AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
	   return;
	}
	if(pDoc->m_Dib.GetBlueImg())
		Invalidate();
}

void CBmpTestView::OnEditGreen() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP<=8)
	{
       AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
	   return;
	}
	if(pDoc->m_Dib.GetGreenImg())
		Invalidate();	
}

void CBmpTestView::OnEditRed() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP<=8)
	{
       AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
	   return;
	}
	if(pDoc->m_Dib.GetRedImg())
		Invalidate();	
}

void CBmpTestView::OnEdgeColorprewitt() 
{
	// TODO: 一种强有力的非线性算子,加强了纵向,但也造成横向断裂
# include <math.h>
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP<=8)
	{
       AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
	   return;
	}
	int i,j,k,image[10][4],Height,Width;
	unsigned int a;
	BYTE * m_Buffer1;	
	double e1,e2,e3;
	//filtering
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<(int)Width/3 -1;j++)
		{
			for (k=0;k<3;k++)
			{
				image[1][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
				image[3][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
				image[4][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j-1)*3+k);
				image[6][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j+1)*3+k);
				image[7][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
				image[9][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
			}
            e1=sqrt(pow((image[1][1]-image[3][1]),2)+pow((image[1][2]-image[3][2]),2)+pow((image[1][3]-image[3][3]),2));
			e2=sqrt(pow((image[4][1]-image[6][1]),2)+pow((image[4][2]-image[6][2]),2)+pow((image[4][3]-image[6][3]),2));
			e3=sqrt(pow((image[7][1]-image[9][1]),2)+pow((image[7][2]-image[9][2]),2)+pow((image[7][3]-image[9][3]),2));
			a=(unsigned int)(e1+e2+e3);
			a=((a>255)?255:a);
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
		}
	}
	if(m_Buffer1)
	{
		delete [] m_Buffer1;
		m_Buffer1=0;
	}
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnEdgeColorrobert() 
{
	// TODO: 一种强烈的非线性算子,加强了双45度方向,保持了字符笔划的完整性
# include <math.h>
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP<=8)
	{
       AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
	   return;
	}
	int i,j,k,image[10][4],Height,Width;
	unsigned int a;
	BYTE * m_Buffer1;
	double e2,e1;
	//filtering
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
 	for (i=1;i<Height-1;i++)
	{
	    for (j=1;j<(int)Width/3 -1;j++)
		{
			for (k=0;k<3;k++)
			{
				image[1][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
				image[3][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
				image[7][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
				image[9][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
			}
            e1=pow((image[1][1]-image[9][1]),2)+pow((image[1][2]-image[9][2]),2)+pow((image[1][3]-image[9][3]),2);
			e2=pow((image[3][1]-image[7][1]),2)+pow((image[3][2]-image[7][2]),2)+pow((image[3][3]-image[7][3]),2);
			a=(unsigned int)sqrt(e1+e2);
			a=((a>255)?255:a);
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
		}
	}
	if(m_Buffer1)
	{
		delete [] m_Buffer1;
		m_Buffer1=0;
	}
	pDoc->m_BM=true;
	Invalidate();	
	
}

void CBmpTestView::OnMidFiltLine() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	BYTE * m_Buffer1;
	int i,Height,Width,i1,j1,j;
	//filtering
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
	if(pDoc->m_Dib.BPP==8)
	{
		int image[6],medium;
		Height=(int) pDoc->m_Dib.Height;
		Width=(int) pDoc->m_Dib.Bpl;
		for (j=0;j<Width +1;j++)
		{
	 		for (i=2;i<Height-2;i++)
			{
				image[3]=(int) *(m_Buffer1+i*Width+j);
				image[2]=(int) *(m_Buffer1+(i-1)*Width+j);
				image[4]=(int) *(m_Buffer1+(i+1)*Width+j);
				image[1]=(int) *(m_Buffer1+(i-2)*Width+j);
				image[5]=(int) *(m_Buffer1+(i+2)*Width+j);
		//冒泡排序
				for(i1=1;i1<5;i1++)
				{
		        	for(j1=i1+1;j1<6;j1++)
					{
			    		if(image[j1]>image[i1])
						{
					    	medium=image[i1];
		        			image[i1]=image[j1];
			        		image[j1]=medium;
						}
					}
				}
				*(pDoc->m_Dib.m_Buffer+i*Width+j)=image[3];
			}
		}
	}
	else
	{
// 24位彩色中值滤波
		int image[6][4],medium[4],k;
		Height=(int) pDoc->m_Dib.Height;
		Width=(int) pDoc->m_Dib.Bpl;
		for (j=0;j<(int)Width/3;j++)
		{
	 		for (i=2;i<Height-2;i++)
			{
				for(k=0;k<3;k++)
				{
					image[3][k+1]=(int) *(m_Buffer1+i*Width+j*3+k);
					image[2][k+1]=(int) *(m_Buffer1+(i-1)*Width+j*3+k);
					image[4][k+1]=(int) *(m_Buffer1+(i+1)*Width+j*3+k);
					image[1][k+1]=(int) *(m_Buffer1+(i-2)*Width+j*3+k);
					image[5][k+1]=(int) *(m_Buffer1+(i+2)*Width+j*3+k);
				}
//冒泡排序
				for(i1=1;i1<5;i1++)
				{
		        	for(j1=i1+1;j1<6;j1++)
					{
			    		if((image[j1][1]+image[j1][2]+image[j1][3])/3>(image[i1][1]+image[i1][2]+image[i1][3])/3)
						{
							for(k=1;k<4;k++)
							{
					    		medium[k]=image[i1][k];
								image[i1][k]=image[j1][k];
								image[j1][k]=medium[k];
							}
						}
					}
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=image[3][1];
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=image[3][2];
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=image[3][3];
				}
			}
		}
	}
	if(m_Buffer1)
	{
		delete [] m_Buffer1;
		m_Buffer1=0;
	}
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnDensityScan() 
{
	// TODO: Add your command handler code here
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
# include <math.h>
	int i,j,Height,Width;
	if(pDoc->m_Dib.BPP==8)
		return;
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
	int image[2048][4],b[2048],count;
	double diff;
//扫描从图像底部开始	
	for (i=0;i<Height;i++)
	{
		for(j=0;j<(int)Width/3;j++)
		{
			image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
			image[j][2]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1);
			image[j][3]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2);
			if(image[j][1]<60)
			{
				image[j][1]=0;
				image[j][2]=0;
				image[j][3]=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
			}
		} 
		j=0;
		count=0;
		while (j<(int)Width/3)
		{
//因每点三分量均相等,故可简化	diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
			diff=abs(image[j][1]-image[j+1][1])*1.7;
			b[j]=(((int)diff>150)?1:0);
			count+=b[j];
			j++;
		}
//变化15次已是最高限了,再高就会使车牌出现空线
		if (count<15) 
		{
    		for(j=0;j<(int)Width/3;j++)
			{
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
			}
		}
		else
		{
//分区域扫描法
			count=0;
//第一节
			for(j=0;j<(int)Width/45;j++)
				count+=b[j];
//剩余部分的简化算法
			do
			{
			//变化6次是最佳经验值
				if(count<4)
				{
					*(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3)=0;
					*(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3+1)=0;
					*(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3+2)=0;
				}
				count=count+b[j]-b[j-(int)Width/45];
				j++;
			}while(j<(int)Width/3);
			for(j=j-(int)Width/45;j<(int)Width/3;j++)
			{
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
			} 
//进一步扫描,消除图像中的残留点
			for(j=0;j<(int)Width/3;j++)
			{
				image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
			} 
			j=0;
			count=0;
			while (j<(int)Width/3)
			{
//因每点三分量均相等,故可简化	diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
				diff=abs(image[j][1]-image[j+1][1])*1.7;
				b[j]=(((int)diff>220)?1:0);
				count+=b[j];
				j++;
			}
//变化3次已是最高限了,再高就会使车牌出现空线
			if (count<8) 
			{
    			for(j=0;j<(int)Width/3;j++)
				{
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
					*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
				} 
			} 
		} 
	}
 	for (i=Height-5;i<Height;i++)
	{
	    for (j=0;j<(int)Width/3 ;j++)
		{
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
			*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
		}
	} 
//反向扫描
	for (i=0;i<Height;i++)
	{
	    for (j=0;j<(int)Width/3 ;j++)
		{
			image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
			image[j][2]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1);
			image[j][3]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2);
		} 
		j=(int)Width/3;
		while (j>=1)
		{
//因每点三分量均相等,故可简化	diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
			diff=abs(image[j][1]-image[j-1][1])*1.7;
			b[j]=(((int)diff>60)?1:0);
			j--;
		}
//变化15次已是最高限了,再高就会使车牌出现空线
//分区域扫描法
		count=0;
//第一节
		for(j=(int)Width/3-1;j>=(int)Width/3-(int)Width/45;j--)
				count+=b[j];
//剩余部分的简化算法
		do
		{
	//变化6次是最佳经验值
			if(count<4)
			{
				*(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3+1)=0;
				*(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3+2)=0;
			}
			count=count+b[j]-b[j+(int)Width/45];
			j--;
		}while(j>=1); 
	} 
	pDoc->m_BM=true;
	Invalidate();	
}

void CBmpTestView::OnRowDilation() 
{
	// TODO: Add your command handler code here
	// 形态学:横向膨胀,结构和,两边各扩展6个像素
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(pDoc->m_Dib.BPP==8)
		return;
	int i,j,i1,j1,Height,Width,a;
	Height=(int) pDoc->m_Dib.Height;
	Width=(int) pDoc->m_Dib.Bpl;
	BYTE * m_Buffer1;
	m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
    for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	{
	   	*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
	}
 	for (i=2;i<Height-3;i++)
	{
	    for (j=4;j<(int)Width/3-5;j++)
		{
			a=0;
			for (i1=-2;i1<3;i1++)
			{
				for(j1=-4;j1<5;j1++)
				{

⌨️ 快捷键说明

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