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

📄 jisuanprocessdib.cpp

📁 电梯客流密度识别系统中面积的计算
💻 CPP
字号:
// JisuanProcessDib.cpp: implementation of the JisuanProcessDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DSplit.h"
#include "JisuanProcessDib.h"
#include "SquareDlg.h"
#include "LINEDLG.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

JisuanProcessDib::JisuanProcessDib()
{
	x_sign=0;
	m_temp=0;
	x_temp=0;
	y_temp=0;
    p_temp=0;
	stop=0;
}

JisuanProcessDib::~JisuanProcessDib()
{
	
}

void JisuanProcessDib::erzhihua(int yuzhi_gray)
{
	p_data=this->GetData ();   
    wide=this->GetWidth ();  
    height=this->GetHeight ();   
    if(m_pBitmapInfoHeader->biBitCount<9)
	{
		for(int j=0;j<height;j++)
			for(int i=0;i<wide;i++)
			{
				int temp=0;
				temp= *(p_data+(height-j-1)*wide+i);
				if(temp<yuzhi_gray)
					*(p_data+(height-j-1)*wide+i)=0;
				else
					*(p_data+(height-j-1)*wide+i)=255;
			}
	}
	else	//24位彩色
	{
		for(int j=0;j<height;j++)	
			for(int i=0;i<wide;i++)	
			{
				int temp=0;
				temp= *(p_data+(height-j-1)*wide*3+i*3);
				if(temp<yuzhi_gray)
				{
					*(p_data+(height-j-1)*wide*3+i*3)=0;
					*(p_data+(height-j-1)*wide*3+i*3+1)=0;
					*(p_data+(height-j-1)*wide*3+i*3+2)=0;
				}
				else
				{
					*(p_data+(height-j-1)*wide*3+i*3)=255;
					*(p_data+(height-j-1)*wide*3+i*3+1)=255;
					*(p_data+(height-j-1)*wide*3+i*3+2)=255;
				}
			}
	}
}








void JisuanProcessDib::biaoji()
{
	x_sign=0; 
	m_temp=0;
	x_temp=0;
	y_temp=0;
	stop=0;
	memset(flag,0,255);
	p_data=this->GetData ();   
    wide=this->GetWidth ();  
    height=this->GetHeight ();   
    if(m_pBitmapInfoHeader->biBitCount<9)	
	{
		p_temp=new BYTE[wide*height];//开辟一个临时内存区
		memset(p_temp,255,wide*height);
		//从左到右标号
		for(int j=1;j<height-1;j++)	
		{
			if(stop==1)//判断连通区是否太多
				break;
			for(int i=1;i<wide-1;i++)
			{
				if(x_sign>250)
				{
					AfxMessageBox("连通区数目太多,请增大阈值");
					stop=1;
					break;
				}
				if(*(p_data+(height-j-1)*wide+i)==0)//若当前点为黑点
				{
					if(*(p_data+(height-j-1+1)*wide+i+1)==0)//右上
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+i+1);
						x_temp=*(p_temp+(height-j-1+1)*wide+i+1);
						flag[x_temp]+=1;
						if(*(p_data+(height-j-1)*wide+i-1)==0&&*(p_temp+(height-j-1)*wide+i-1)!=x_temp)//左前
						{
							y_temp=*(p_temp+(height-j-1)*wide+i-1);
							for(int m=1;m<=height-1;m++)
								for(int n=1;n<=wide-1;n++)
								{
									if(*(p_temp+(height-m-1)*wide+n)==y_temp)
									{	
										flag[y_temp]=0;
										*(p_temp+(height-m-1)*wide+n)=x_temp;
										flag[x_temp]+=1;
									}
								}
						}//end//左前
						if(*(p_data+(height-j-1+1)*wide+i-1)==0&&*(p_temp+(height-j-1+1)*wide+i-1)!=x_temp)//左上
						{
							y_temp=*(p_temp+(height-j-1+1)*wide+i-1);
							for(int m=1;m<=height-1;m++)
								for(int n=1;n<=wide-1;n++)
								{
									if(*(p_temp+(height-m-1)*wide+n)==y_temp)
									{	
										flag[y_temp]=0;
										*(p_temp+(height-m-1)*wide+n)=x_temp;
										flag[x_temp]+=1;
									}
								}
						}//end//左上
					}
					else if(*(p_data+(height-j-1+1)*wide+i)==0)//正上
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+i);
						x_temp=*(p_temp+(height-j-1+1)*wide+i);
						flag[x_temp]+=1;
					}
					else if(*(p_data+(height-j-1+1)*wide+i-1)==0)//左上
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+i-1);
						x_temp=*(p_temp+(height-j-1+1)*wide+i-1);
						flag[x_temp]+=1;
					}
					else if(*(p_data+(height-j-1)*wide+i-1)==0)//左前
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1)*wide+i-1);
						x_temp=*(p_temp+(height-j-1)*wide+i-1);
						flag[x_temp]+=1;
					}
					else//没有
					{				
						++x_sign;
						m_temp=x_sign;
						*(p_temp+(height-j-1)*wide+i)=m_temp;
						flag[m_temp]=1;
						
					}
				}//end if
			}// 每列
		}//end 每行
	}
	else	//24位彩色
	{
		p_temp=new BYTE[wide*height];//开辟一个临时内存区
		memset(p_temp,255,wide*height);
		//从左到右标号
		for(int j=1;j<height-1;j++)	// 每行
		{
			if(stop==1)//判断连通区是否太多
				break;
			for(int i=1;i<wide-1;i++)	// 每列
			{
				if(x_sign>250)
				{
					AfxMessageBox("连通区数目太多,请增大阈值");
					stop=1;
					break;
				}
				if(*(p_data+(height-j-1)*wide*3+i*3)==0)//若当前点为黑点
				{
					
					if(*(p_data+(height-j-1+1)*wide*3+(i+1)*3)==0)//右上
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+(i+1));
						x_temp=*(p_temp+(height-j-1+1)*wide+(i+1));
						flag[x_temp]+=1;
						if(*(p_data+(height-j-1)*wide*3+(i-1)*3)==0&&*(p_temp+(height-j-1)*wide+(i-1))!=x_temp)//左前
						{
							y_temp=*(p_temp+(height-j-1)*wide+(i-1));
							for(int m=1;m<=height-1;m++)
								for(int n=1;n<=wide-1;n++)
								{
									if(*(p_temp+(height-m-1)*wide+n)==y_temp)
									{	
										flag[y_temp]=0;
										*(p_temp+(height-m-1)*wide+n)=x_temp;
										
										flag[x_temp]+=1;
									}
								}
						}//end//左前
						if(*(p_data+(height-j-1+1)*wide*3+(i-1)*3)==0&&*(p_temp+(height-j-1+1)*wide+(i-1))!=x_temp)//左上
						{
							y_temp=*(p_temp+(height-j-1+1)*wide+(i-1));
							for(int m=1;m<=height-1;m++)
								for(int n=1;n<=wide-1;n++)
								{
									if(*(p_temp+(height-m-1)*wide+n)==y_temp)
									{	
										flag[y_temp]=0;
										*(p_temp+(height-m-1)*wide+n)=x_temp;
										
										flag[x_temp]+=1;
									}
								}
						}//end//左上
					}
					else if(*(p_data+(height-j-1+1)*wide*3+i*3)==0)//正上
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+i);
						x_temp=*(p_temp+(height-j-1+1)*wide+i);
						flag[x_temp]+=1;
					}
					else if(*(p_data+(height-j-1+1)*wide*3+(i-1)*3)==0)//左上
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1+1)*wide+(i-1));
						x_temp=*(p_temp+(height-j-1+1)*wide+(i-1));
						flag[x_temp]+=1;
					}
					else if(*(p_data+(height-j-1)*wide*3+(i-1)*3)==0)//左前
					{
						*(p_temp+(height-j-1)*wide+i)=*(p_temp+(height-j-1)*wide+i-1);
						x_temp=*(p_temp+(height-j-1)*wide+(i-1));
						flag[x_temp]+=1;
					}
					else//没有
					{				
						++x_sign;
						m_temp=x_sign;
						*(p_temp+(height-j-1)*wide+i)=m_temp;
						
						flag[m_temp]=1;
					}
				}//end if
			}// 每列
		}//end 每行
	}
}


void JisuanProcessDib::LianTong()
{
	biaoji();  
	if(stop!=1)
	{
		int fg[255]={0};
		memset(fg,0,255);
		int y_sign=0;
		int m_Area=0;
		for(int i=1;i<=x_sign;i++)
		{
			if(flag[i]!=0)
			{
				if(fg[y_sign]==0)
				{
					fg[y_sign]=flag[i];
					++y_sign;
				}			
			}
			m_Area+=flag[i];
		}
		SquareDlg  dlg;
		dlg.m_number=y_sign;
		dlg.m_squareALL=m_Area;
		CString ss[20];
	
		for(i=0;i<y_sign;i++)
		{
			ss[i].Format("连通区:%3d  该区面积:%10.0d",i+1,fg[i]);
			dlg.m_ShuChu+=ss[i];
		}
		dlg.DoModal();
		for(i=0;i<255;i++) 
		{
			pppp[i].pp_area=0;
		}
		for(int t=1;t<=x_sign;t++)
		{	pppp[t].pp_number=t;
		for(int j=1;j<height-1;j++)
			for(int i=1;i<wide-1;i++)
			{
				if(*(p_temp+(height-j-1)*wide+i)==t)
				{
					pppp[t].pp_x=i;
					pppp[t].pp_y=j;
					pppp[t].pp_area=flag[t];
					break;
				}				
			}
		}
	}//end if(stop!=1)
}







//将24位彩色图像转换为24位灰度图
void JisuanProcessDib::MakeGray()
{
    BYTE *p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽、字节宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();   //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
	for(int j=0;j<height;j++)	// 每行
		for(int i=0;i<DibWidth;i+=3)	// 每列
		{
			BYTE* pbyBlue = p_data++;   //得到蓝色值
			BYTE* pbyGreen = p_data++;  //得到绿色值
			BYTE* pbyRed = p_data++;    //得 到红色值
			BYTE r = *pbyRed;
			BYTE g = *pbyGreen;
			BYTE b = *pbyBlue;
			int gray=0;
			gray=(30*r+59*g+11*b)/100;		
			*pbyBlue = gray;     
			*pbyGreen = gray;    
			*pbyRed = gray;	    	
		}
}

//保存未处理的原图像
void JisuanProcessDib::Baoliu(LPBYTE temp)
{
	// 指向DIB象素指针
	LPBYTE p_data;
	// 指向缓存图像的指针
	LPBYTE	lpDst;
	// 找到DIB图像象素起始位置
	p_data= GetData();
	// DIB的宽度
	LONG wide = GetDibWidthBytes();
	// DIB的高度
	LONG height = GetHeight();	
	// 初始化新分配的内存,设定初始值为255
	lpDst = (LPBYTE)temp;
	memset(lpDst, (BYTE)255, wide * height);
	memcpy(lpDst,p_data,wide*height);
}

⌨️ 快捷键说明

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