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

📄 dib.cpp

📁 无线图象监控系统(用VC++编程)用数据库ACCESS存储图象
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
//dif(IC,IB,GetWidth(),GetHeight());

ChangeToGray(WEIGHT_GRAY);
lpData=this->GetBitsPtr();
 double averI=0;
 double averS=0;
 double averH=0;
 double sumI=0;
 double sumS=0;
 double sumH=0;
 double sI=0;
 double sS=0;
 double sH=0;
int Scnt=0;
 int Hcnt=0;
for(i=0;i<len;i++)
{
 
       int ISUB=abs(IC[i]-IB[i]);
           double lpbkS=*(SB+i);
		   double lpckS=*(SC+i);
			double lpbkH=*(HB+i);
			double lpckH=*(HC+i);

			double SSUB=(lpckS>lpbkS)?(lpckS-lpbkS):(lpbkS-lpckS);
            double HSUB=(lpckH>lpbkH)?(lpckH-lpbkH):(lpbkH-lpckH);
	if(ISUB>20)
	{
	sumS=sumS+SSUB;
	 Scnt++;
	 sumH=sumH+HSUB;
	 Hcnt++;
	}

}
averS=sumS/Scnt;
averH=sumH/Hcnt;
sumS=0;
sumH=0;
for(i=0;i<len;i++)
{int ISUB=abs(IC[i]-IB[i]);
double lpbkS=*(SB+i);
double lpckS=*(SC+i);
double lpbkH=*(HB+i);
double lpckH=*(HC+i);
double SSUB=(lpckS>lpbkS)?(lpckS-lpbkS):(lpbkS-lpckS);
double HSUB=(lpckH>lpbkH)?(lpckH-lpbkH):(lpbkH-lpckH);
if(ISUB>20)
	{
	sumS=(SSUB-averS)*(SSUB-averS)+sumS;	
	sumH=(HSUB-averH)*(HSUB-averH)+sumH;	
	}
}
sS=sqrt(sumS/Scnt);
sH=sqrt(sumH/Hcnt);
double yS=averS+0.1*sS;
double yH=averH+0.1*sH;
CString kk;
kk.Format("avers=%f,sS=%f,averH=%f,sH=%f",averS,sS,averH,sH);
AfxMessageBox(kk);
for( i=1;i<lHeight-1;i++)
{
	for(int j=1;j<lWidth-1;j++)
		{
			int ISUB=abs(IC[lWidth*i+j]-IB[lWidth*i+j]);
			BYTE* lpbkI=IB+lWidth*i+j;
			BYTE* lpckI=IC+lWidth*i+j;
		double lpbkS=*(SB+lWidth*i+j);
		double lpckS=*(SC+lWidth*i+j);
			double lpbkH=*(HB+lWidth*i+j);
			double lpckH=*(HC+lWidth*i+j);
			double SSUB=(lpckS>lpbkS)?(lpckS-lpbkS):(lpbkS-lpckS);
		   double HSUB=(lpckH>lpbkH)?(lpckH-lpbkH):(lpbkH-lpckH);
			double ratI[9];
			//double ratH[9];
			//double ratS[9];
			int k=0;

				for(int u=-1;u<=1;u++)
					{
						 for(int v=-1;v<=1;v++)
						{
							 ratI[k]=((double)*(lpbkI+lWidth*u+v))/(*(lpckI+lWidth*u+v));
							 //ratS[k]=(*(lpbkS+lWidth*u+v))/(*(lpckS+lWidth*u+v));
							 //ratH[k]=(*(lpbkH+lWidth*u+v))/(*(lpckH+lWidth*u+v));
							k++;
						}
           

					}
       

			double sumI=0;
			//double sumH=0;
			//double sumS=0;
			for(int y=1;y<8;y++)
			{
				sumI=sumI+ratI[y];
				//sumH=sumH+ratH[y];
				//sumS=sumS+ratS[y];		
			}
			double averI=sumI/7;
			//double averH=sumH/7;
			//double averS=sumS/7;

			double sI=0;
			//double sH=0;
			//double sS=0;
			for(y=1;y<8;y++)
				{sI=sI+(ratI[y]-averI)*(ratI[y]-averI);
				 //sH=sH+(ratH[y]-averH)*(ratH[y]-averH);
				 //sS=sS+(ratS[y]-averS)*(ratS[y]-averS);
				}
			sI=sI/7;
			sI=sqrt(sI);
			//sH=sH/7;
			//sH=sqrt(sH);
			//sS=sS/7;
			//sS=sqrt(sS);

if(ISUB<20)
lpData[lWidth*i+j]=255;
else
{if(HSUB<yH && SSUB<yS && sI<0.3 )
lpData[lWidth*i+j]=255;
else
lpData[lWidth*i+j]=0;
}
}
//
}
AfxMessageBox("DDD");
delete IC;
delete IB;
delete SC;
delete SB;
delete HC;
delete HB;

   }
   else
   {
	if(m_dib->GetBitCount()==8 && GetBitCount()==24)
ChangeToGray(WEIGHT_GRAY);	
	if(m_dib->GetBitCount()==24 && GetBitCount()==8)
m_dib->ChangeToGray(WEIGHT_GRAY);
 LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
	LPBYTE lpData = FindDIBBits(lpDIB);
    LPBYTE lpbkData=m_dib->GetBitsPtr();
    GlobalUnlock(m_hDib);


	dif(lpData,lpbkData,GetWidth(),GetHeight());
   }
return UpdateInternal();
}
//我设计的腐蚀算法函数
BOOL CDib::MyFushi()
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
LPBYTE lpData = FindDIBBits(lpDIB);
 GlobalUnlock(m_hDib);
MYFUSHIDIB(lpData,GetWidth(),GetHeight());
return UpdateInternal();
}

//船舶变化数检测函数
/*BOOL CDib::BoatNumDetect(CDib* m_dib,CDib* bjdib,int minsize,CString& str)
{
	LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

	LPBYTE lpDibbit = FindDIBBits(lpDIB);
	long len=GetWidth()*GetHeight();
	LPBYTE lpData=new BYTE[len];
	memcpy(lpData,lpDibbit,len);
 
      int structure[3][3];
        structure[0][0]=0;
		structure[0][1]=0;
		structure[0][2]=0;
		structure[1][0]=0;
		structure[1][1]=0;
		structure[1][2]=0;
		structure[2][0]=0;
		structure[2][1]=0;
		structure[2][2]=0;
    LPBYTE lpbkData=m_dib->GetBitsPtr();
	LPBYTE lpbejinData=bjdib->GetBitsPtr();
	LPBYTE lpbjData=new BYTE[len];
	memcpy(lpbjData,lpbejinData,len);
    BYTE* lpSrc;
    BYTE* lpDIBBitscopy=new BYTE[len];//当前图像备份
    
    memcpy(lpDIBBitscopy,lpData,len);
    LONG	lWidth=GetWidth();
    LONG	lHeight=GetHeight();
    FLOAT	m_fpArray[25];

float	m_fTempC  = (FLOAT) (1.0 / 16.0);
	
	// 设置模板元素
	m_fpArray[0] = 1.0;
	m_fpArray[1] = 2.0;
	m_fpArray[2] = 1.0;
	m_fpArray[3] = 0.0;
	m_fpArray[4] = 0.0;
	m_fpArray[5] = 2.0;
	m_fpArray[6] = 4.0;
	m_fpArray[7] = 2.0;
	m_fpArray[8] = 0.0;
	m_fpArray[9] = 0.0;
	m_fpArray[10] = 1.0;
	m_fpArray[11] = 2.0;
	m_fpArray[12] = 1.0;
	m_fpArray[13] = 0.0;
	m_fpArray[14] = 0.0;
	m_fpArray[15] = 0.0;
	m_fpArray[16] = 0.0;
	m_fpArray[17] = 0.0;
	m_fpArray[18] = 0.0;
	m_fpArray[19] = 0.0;
	m_fpArray[20] = 0.0;
	m_fpArray[21] = 0.0;
	m_fpArray[22] = 0.0;
	m_fpArray[23] = 0.0;
	m_fpArray[24] = 0.0;
Template(lpData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);//高斯平滑
Template(lpbkData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);//高斯平滑
Template(lpbjData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);
    //MedianFilter(lpbjData,lWidth,lHeight,3,3,1,1);
  
    tr* trsu=new tr[1000];

	dif(lpData,lpbkData, lWidth,lHeight);//消除阴影运动目标检测
    

	
    int k1=TraceFillDIB(lpData, lWidth,lHeight,trsu);//开始填充处理
	if(k1>0)
	{//ifk1
	int k2=TraceFillDIB(lpData, lWidth,lHeight,trsu);
    
	if(k2!=k1)
	{int k3=TraceFillDIB(lpData, lWidth,lHeight,trsu);
	    if(k3!=k2)
		{
	 int k4=TraceFillDIB(lpData, lWidth,lHeight,trsu);
		if(k4!=k3)
			{
	int k5=TraceFillDIB(lpData, lWidth,lHeight,trsu);
			}
		}
	}
//DilationDIB(lpData, lWidth,lHeight,2 , structure);
//DilationDIB(lpData, lWidth,lHeight,2 , structure);
//ErosionDIB(lpData, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), 2 , structure);
//ErosionDIB(lpData, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), 2 , structure);
k1=TraceFillDIB(lpData, lWidth,lHeight,trsu);
k2=TraceFillDIB(lpData, lWidth,lHeight,trsu);
	if(k2!=k1)
	{int k3=TraceFillDIB(lpData, lWidth,lHeight,trsu);
	    if(k3!=k2)
		{
	 int k4=TraceFillDIB(lpData, lWidth,lHeight,trsu);
		if(k4!=k3)
			{
	int k5=TraceFillDIB(lpData, lWidth,lHeight,trsu);
			}
		}
	}//结束填充处理
	}//ifk1
 int num=TraceDIB(lpData, lWidth,lHeight,minsize,trsu);//符合要求轮廓个数检测
  tr* trsu1=new tr[1000];
 // RobertDIB(lpbkData,lWidth,lHeight);//参考图像边缘检测图
  dif(lpbkData,lpbjData,lWidth,lHeight);
  //TraceFillDIB(lpbkData, lWidth,lHeight,trsu1);//参考图像边缘扩张
  int oldnum=0;
  int newnum=0;
  for(int i=0;i<num;i++)//开始检测属于参考图像的轮廓
  {int bnum=0;
		for(int u=trsu[i].low; u<=trsu[i].up;u++)
		{
		for(int j=trsu[i].left; j<=trsu[i].right;j++)
			{
			lpSrc = lpbkData +GetWidthBytes()*u+j;
			  if(*lpSrc==0)
				  bnum++;
			}
	    	    
		}
	 if(bnum>30)
		 oldnum++;
  }//结束检测属于参考图像的轮廓
   
//	RobertDIB(lpDIBBitscopy,lWidth,lHeight);//当前图像边缘检测
   dif(lpDIBBitscopy,lpbjData,lWidth,lHeight);
DilationDIB(lpDIBBitscopy, lWidth,lHeight,2 , structure);
DilationDIB(lpDIBBitscopy, lWidth,lHeight,2 , structure);
DilationDIB(lpDIBBitscopy, lWidth,lHeight,2 , structure);
ErosionDIB(lpDIBBitscopy, lWidth, lHeight, 2 , structure);
ErosionDIB(lpDIBBitscopy, lWidth, lHeight, 2 , structure);
ErosionDIB(lpDIBBitscopy, lWidth, lHeight, 2 , structure);
TraceFillDIB(lpDIBBitscopy, lWidth,lHeight,trsu);
TraceFillDIB(lpDIBBitscopy, lWidth,lHeight,trsu1);//开始检测属于当前图像的轮廓
 int num2=TraceDIB(lpDIBBitscopy, lWidth,lHeight,minsize,trsu1);

	int  cindex[300];
   for(i=0;i<num;i++)
   {int bnum=0;
		for(int u=trsu[i].low; u<=trsu[i].up;u++)
		{
		for(int j=trsu[i].left; j<=trsu[i].right;j++)
			{
			lpSrc = lpDIBBitscopy+GetWidthBytes()*u+j;
			  if(*lpSrc==0)
				  bnum++;
			}
	    	    
		}
	 if(bnum>30)
	 {cindex[newnum]=i;
		 newnum++;
	 }
  }//结束属于当前图像的轮廓


delete trsu1;
trsu1=NULL;	

delete lpbjData;
int numdif=newnum-oldnum;//两者的差就为运动轮廓

str.Format("发现%d只船cu=%d,la=%d,num2=%d",numdif,newnum,oldnum,num2);
	
delete lpData;
lpData=NULL;
delete lpDIBBitscopy;
lpDIBBitscopy=NULL;



	for(i=0; i<newnum;i++)
	{	for(int j=trsu[cindex[i]].left; j<=trsu[cindex[i]].right;j++)
		{
		 lpSrc = lpDibbit +GetWidthBytes()*trsu[cindex[i]].low+j;
	       *lpSrc=(BYTE)255;
		lpSrc = lpDibbit +GetWidthBytes()*trsu[cindex[i]].up+j;
		*lpSrc=(BYTE)255;
		}
	     for(j=trsu[cindex[i]].low; j<=trsu[cindex[i]].up;j++)
		{
		 lpSrc = lpDibbit +GetWidthBytes()*j+trsu[cindex[i]].left;
	     *lpSrc=(BYTE)255;
		lpSrc = lpDibbit +GetWidthBytes()*j+trsu[cindex[i]].right;
		*lpSrc=(BYTE)255;
		}
	}
 GlobalUnlock(m_hDib);
 UpdateInternal();


delete trsu;
trsu=NULL;	

return numdif;
}*/

BOOL CDib::bjdetect(CDib* m_dib,CString &message)
{
LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

	LPBYTE lpData = FindDIBBits(lpDIB);
	long len=GetWidth()*GetHeight();
	
    LPBYTE lpbjData=m_dib->GetBitsPtr();  
	LPBYTE lpbkData=new BYTE[len];
	memcpy(lpbkData,lpbjData,len);
    
    LONG	lWidth=GetWidth();
    LONG	lHeight=GetHeight();
FLOAT	m_fpArray[25];

float	m_fTempC  = (FLOAT) (1.0 / 16.0);
	
	// 设置模板元素
	m_fpArray[0] = 1.0;
	m_fpArray[1] = 2.0;
	m_fpArray[2] = 1.0;
	m_fpArray[3] = 0.0;
	m_fpArray[4] = 0.0;
	m_fpArray[5] = 2.0;
	m_fpArray[6] = 4.0;
	m_fpArray[7] = 2.0;
	m_fpArray[8] = 0.0;
	m_fpArray[9] = 0.0;
	m_fpArray[10] = 1.0;
	m_fpArray[11] = 2.0;
	m_fpArray[12] = 1.0;
	m_fpArray[13] = 0.0;
	m_fpArray[14] = 0.0;
	m_fpArray[15] = 0.0;
	m_fpArray[16] = 0.0;
	m_fpArray[17] = 0.0;
	m_fpArray[18] = 0.0;
	m_fpArray[19] = 0.0;
	m_fpArray[20] = 0.0;
	m_fpArray[21] = 0.0;
	m_fpArray[22] = 0.0;
	m_fpArray[23] = 0.0;
	m_fpArray[24] = 0.0;
Template(lpData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);//高斯平滑
Template(lpbkData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);//高斯平滑
	dif(lpData,lpbkData,lWidth,lHeight);
	tr* trsu=new tr[1000];

      int structure[3][3];
        structure[0][0]=0;
		structure[0][1]=0;
		structure[0][2]=0;
		structure[1][0]=0;
		structure[1][1]=0;
		structure[1][2]=0;
		structure[2][0]=0;
		structure[2][1]=0;
		structure[2][2]=0;
DilationDIB(lpData, lWidth,lHeight,2 , structure);
DilationDIB(lpData, lWidth,lHeight,2 , structure);
DilationDIB(lpData, lWidth,lHeight,2 , structure);
ErosionDIB(lpData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpData, lWidth, lHeight, 2 , structure);
TraceFillDIB(lpData, lWidth,lHeight,trsu);
int num2=TraceDIB(lpData, lWidth,lHeight,100,trsu);
//message.Format("发现%d个目标",num2);
delete trsu;
delete lpbkData;
return UpdateInternal();

}
BOOL CDib::BoatNumDetect(CDib* m_dib,CDib* bjdib,int minsize,CString& str)
{
	LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

	LPBYTE lpDibbit = FindDIBBits(lpDIB);
	long len=GetWidth()*GetHeight();
    LPBYTE lpData=new BYTE[len];
    memcpy(lpData,lpDibbit,len);
 
      int structure[3][3];
        structure[0][0]=0;
		structure[0][1]=0;
		structure[0][2]=0;
		structure[1][0]=0;
		structure[1][1]=0;
		structure[1][2]=0;
		structure[2][0]=0;
		structure[2][1]=0;
		structure[2][2]=0;
    LPBYTE lpbkData=m_dib->GetBitsPtr();//参考图像
	LPBYTE lpbejinData=bjdib->GetBitsPtr();
	for(int l=0;l<len;l++)
	{int dif=abs(lpbejinData[l]-lpData[l]);
	  if(dif<20)
       lpbejinData[l]=lpData[l];
	}//更新背景

	LPBYTE lpbjData=new BYTE[len];//背景图像
	memcpy(lpbjData,lpbejinData,len);//背景图像
    BYTE* lpSrc;
   
 
    LONG	lWidth=GetWidth();
    LONG	lHeight=GetHeight();
    FLOAT	m_fpArray[25];

float	m_fTempC  = (FLOAT) (1.0 / 16.0);
	
	// 设置模板元素
	m_fpArray[0] = 1.0;
	m_fpArray[1] = 2.0;
	m_fpArray[2] = 1.0;
	m_fpArray[3] = 0.0;
	m_fpArray[4] = 0.0;
	m_fpArray[5] = 2.0;
	m_fpArray[6] = 4.0;
	m_fpArray[7] = 2.0;
	m_fpArray[8] = 0.0;
	m_fpArray[9] = 0.0;
	m_fpArray[10] = 1.0;
	m_fpArray[11] = 2.0;
	m_fpArray[12] = 1.0;
	m_fpArray[13] = 0.0;
	m_fpArray[14] = 0.0;
	m_fpArray[15] = 0.0;
	m_fpArray[16] = 0.0;
	m_fpArray[17] = 0.0;
	m_fpArray[18] = 0.0;
	m_fpArray[19] = 0.0;
	m_fpArray[20] = 0.0;
	m_fpArray[21] = 0.0;
	m_fpArray[22] = 0.0;
	m_fpArray[23] = 0.0;
	m_fpArray[24] = 0.0;
Template(lpData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);//高斯平滑
Template(lpbkData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);//高斯平滑
Template(lpbjData,lWidth,lHeight,3,3,1,1,m_fpArray,m_fTempC);//高斯平滑
bjdif(lpData,lpbkData,lpbjData,lWidth,lHeight);
/*DilationDIB(lpData, lWidth,lHeight,2 , structure);
DilationDIB(lpData, lWidth,lHeight,2 , structure);
DilationDIB(lpData, lWidth,lHeight,2 , structure);
ErosionDIB(lpData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpData, lWidth, lHeight, 2 , structure);*/
 tr* trsu=new tr[1000];
 tr* trsu1=new tr[1000];
  //int num1=TraceDIB(lpData, lWidth,lHeight,100,trsu);
//int oldnum=0;
  int newnum=0;
  /*for(int i=0;i<num1;i++)//开始检测属于参考图像的轮廓

⌨️ 快捷键说明

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