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

📄 dib.cpp

📁 无线图象监控系统(用VC++编程)用数据库ACCESS存储图象
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  {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 = lpbjData +GetWidthBytes()*u+j;
			  if(*lpSrc==0)
				  bnum++;
			}
	    	    
		}
	 if(bnum>30)
		 oldnum++;
  }//结束检测属于参考图像的轮廓*/
DilationDIB(lpbkData, lWidth,lHeight,2 , structure);
DilationDIB(lpbkData, lWidth,lHeight,2 , structure);
DilationDIB(lpbkData, lWidth,lHeight,2 , structure);
ErosionDIB(lpbkData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpbkData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpbkData, lWidth, lHeight, 2 , structure);

int num1=TraceDIB(lpbkData, lWidth,lHeight,100,trsu);	
  int  cindex[300];
   for(int i=0;i<num1;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 = lpData+GetWidthBytes()*u+j;
			  if(*lpSrc==0)
				  bnum++;
			}
	    	    
		}
	 if(bnum>50)
	 {cindex[newnum]=i;
		 newnum++;
	 }
  }//结束属于当前图像的新增轮廓*/

DilationDIB(lpbjData, lWidth,lHeight,2 , structure);
DilationDIB(lpbjData, lWidth,lHeight,2 , structure);
DilationDIB(lpbjData, lWidth,lHeight,2 , structure);
ErosionDIB(lpbjData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpbjData, lWidth, lHeight, 2 , structure);
ErosionDIB(lpbjData, lWidth, lHeight, 2 , structure);
int num3=TraceDIB(lpbjData, lWidth,lHeight,100,trsu1);


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);
//memcpy(lpDibbit,lpbkData,len);
UpdateInternal();
 delete trsu;
 delete trsu1;
 delete lpData;
 delete lpbjData;
str.Format("新增目标%d个,当前背景差%d个,前帧背景差%d个",newnum,num1,num3);
 //str.Format("当前背景差%d个,前帧背景差%d个",num2,num3);
int numdif= num1-num3;
 return numdif;

}


BOOL CDib::AlarmDetect(CDib* m_dib,UINT level)
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

	LPBYTE lpData = FindDIBBits(lpDIB);
	long len=GetWidth()*GetHeight();
	
    LPBYTE lpbkData=m_dib->GetBitsPtr();  
    
    LONG	lWidth=GetWidth();
    LONG	lHeight=GetHeight();
    //MedianFilter(lpData,lWidth,lHeight,3,3,1,1);
    //MedianFilter(lpbkData,lWidth,lHeight,3,3,1,1);  
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);//消除阴影运动目标检测
	int sum=0;
	for(int i=0;i<len;i++)
	{if(lpData[i]==0)
	  sum++;
	}
switch (level)
{case 1:{if(sum>0.008*len)
            return TRUE;
           else
			   return FALSE;//最低灵敏度
		}
case 2:{if(sum>0.02*len)
		    return TRUE;
	         else
			return FALSE;//中等灵敏度
	   }
case 3:{if(sum>0.04*len)
		    return TRUE;
	         else
			return FALSE;//高灵敏度
	   }
default: return FALSE;
}
return FALSE;
}





BOOL CDib::rectange(int k,tr* trsu)
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
    BYTE* lpSrc;
	LPBYTE lpData = FindDIBBits(lpDIB);
    GlobalUnlock(m_hDib);
	for(int i=0; i<k;i++)
	{	for(int j=trsu[i].left; j<=trsu[i].right;j++)
		{
		 lpSrc = lpData +GetWidthBytes()*trsu[i].low+j;
	       *lpSrc=(BYTE)0;
		lpSrc = lpData +GetWidthBytes()*trsu[i].up+j;
		*lpSrc=(BYTE)0;
		}
	     for(j=trsu[i].low; j<=trsu[i].up;j++)
		{
		 lpSrc = lpData +GetWidthBytes()*j+trsu[i].left;
	     *lpSrc=(BYTE)0;
		lpSrc = lpData +GetWidthBytes()*j+trsu[i].right;
		*lpSrc=(BYTE)0;
		}
	}
return UpdateInternal();
}

BOOL CDib::Robetedge()
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

LPBYTE lpData = FindDIBBits(lpDIB);
	
	RobertDIB(lpData,GetWidth(),GetHeight());
GlobalUnlock(m_hDib);
	return UpdateInternal();
}

BOOL CDib::Cannyedge()
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

LPBYTE lpData = FindDIBBits(lpDIB);
CannyDib(lpData,GetWidth(),GetHeight(),0.4, 0.4, 0.79);
GlobalUnlock(m_hDib);
	return UpdateInternal();
}

/*阈值分割和robet边缘检测想结合*/
BOOL CDib::Robetedgefix()
{
	LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

LPBYTE lpData = FindDIBBits(lpDIB);
GlobalUnlock(m_hDib);
long len=GetWidthBytes()*GetHeight();
BYTE* lpthresh=new BYTE[len];
BYTE* lpsrc;
BYTE* lpdst;
memcpy(lpthresh,lpData,len);
ThresholdDIB(lpthresh,GetWidth(),GetHeight());
int structure[3][3]={{0,0,0},{0,0,0},{0,0,0}};
for(int q=0;q<6;q++)
{
DilationDIB(lpthresh,GetWidth(),GetHeight(),2,structure);
}
for(q=0;q<6;q++)
{
ErosionDIB(lpthresh,GetWidth(),GetHeight(),2,structure);
}

RobertDIB(lpData,GetWidth(),GetHeight());

for(int i=1; i<GetHeight()-1;i++)
	{for(int j=1;j<GetWidth()-1;j++)
		{lpsrc=lpData+GetWidthBytes()*i+j;
         lpdst=lpthresh+GetWidthBytes()*i+j;
		 if(*lpdst==0)
		 { int jug=0;
		   int fzhu=0;
		 for(int l=-1;l<=1;l++)
				{
				 for(int k=-1;k<=1;k++)
					{BYTE* temp1=lpdst+GetWidthBytes()*l+k;
				     BYTE* temp2=lpsrc+GetWidthBytes()*l+k;
					 int t=*temp2-255;
					 jug=jug+t;
					 fzhu=*temp1+fzhu;
					}
				}
		 if(jug==0 && fzhu==0)
			 *lpdst=(BYTE)255;
			}
		}
	}
/*for(long ii=0; ii<len;ii++)
   {BYTE temp=(BYTE)*(lpData+ii);
	   if(temp<240)
		   *(lpData+ii)=(BYTE)0;
	     else
			*(lpData+ii)=255;
   }*/
memcpy(lpData,lpthresh,len);
delete lpthresh;
return UpdateInternal();

	


}
/*背景补偿*/
int CDib::fix(int k,tr* trsu)
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
   BYTE* lpSrc;
	LPBYTE lpData = FindDIBBits(lpDIB);
    GlobalUnlock(m_hDib);
	int sum=0;
	for(int i=0; i<k;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 = lpData +GetWidthBytes()*u+j;
			  if(*lpSrc==0)
				  bnum++;
			}
	    	    
		}
	 if(bnum<20)
		 sum=sum-2;
	}
return 	sum;
}

int  CDib::egefenge()
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
LPBYTE lpData = FindDIBBits(lpDIB);
GlobalUnlock(m_hDib);

LONG len=GetWidthBytes()*GetHeight();
LONG edgepointsum=0;


BYTE* lpnewdata=new BYTE[len];


tr* trsu=new tr[100];
int cnt=TraceDIB(lpData,GetWidth(),GetHeight(),30,trsu);
for(int i=0;i<len;i++)
{if(lpData[i]==0)
edgepointsum++;
}
memset(lpnewdata,255,len);
//int cnt=TraceDIB(lpnewdata,GetWidth(),GetHeight(),30,trsu);
AfxMessageBox("zhenchang");
LONG blockpoint=0;
BYTE* lpsrc;
int objeccnt=0;

for(i=0;i<cnt;i++)
{	int blockcnt=0;
	for(int u=trsu[i].low; u<=trsu[i].up;u++)
		{
		for(int j=trsu[i].left; j<=trsu[i].right;j++)
		{lpsrc = lpData +GetWidthBytes()*u+j;
		  if(*lpsrc==0)
			  blockcnt++;		  
		}      
		}
	   for(u=trsu[i].low; u<=trsu[i].up;u++)
		{lpsrc = lpnewdata +GetWidthBytes()*u+trsu[i].left;
           *lpsrc=0;
         lpsrc = lpnewdata+GetWidthBytes()*u+trsu[i].right;
           *lpsrc=0;
		}
  
			for(int j=trsu[i].left; j<=trsu[i].right;j++)
			{lpsrc = lpnewdata +GetWidthBytes()*trsu[i].low+j;
			*lpsrc=0;
			lpsrc = lpnewdata +GetWidthBytes()*trsu[i].up+j;
			*lpsrc=0;
			}

   blockpoint=blockpoint+blockcnt;
   objeccnt++;
	  if(blockpoint>0.5*edgepointsum)
		i=cnt;

	}
memcpy(lpData,lpnewdata,len);
delete trsu;
trsu=NULL;
delete lpnewdata;
lpnewdata=NULL;
UpdateInternal();
return objeccnt;
}

BOOL CDib::colrsubgray(CDib* ci)
{
abssub(ci);
return ChangeToGrayscale(MAXIMUM_GRAY);

}


BOOL CDib::Threshold()
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

LPBYTE lpData = FindDIBBits(lpDIB);
	
	ThresholdDIB(lpData,GetWidth(),GetHeight());
GlobalUnlock(m_hDib);
	return UpdateInternal();
}

BOOL CDib::YUZHI(BYTE th)
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

LPBYTE lpData = FindDIBBits(lpDIB);
	GlobalUnlock(m_hDib);
   long len=GetHeight()*GetWidthBytes();
   for(long i=0; i<len;i++)
   {BYTE temp=(BYTE)*(lpData+i);
	   if(temp<th)
		   *(lpData+i)=(BYTE)0;
	     //else
			//*(lpData+i)=0;
   }
return UpdateInternal();
}

BOOL CDib::fushi(int nMode , int structure[3][3])
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}

LPBYTE lpData = FindDIBBits(lpDIB);
	GlobalUnlock(m_hDib);
ErosionDIB(lpData,GetWidth(),GetHeight(),nMode,structure);
return UpdateInternal();
}

BOOL CDib:: penzhang(int nMode , int structure[3][3])
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
LPBYTE lpData = FindDIBBits(lpDIB);
	GlobalUnlock(m_hDib);
DilationDIB(lpData,GetWidth(),GetHeight(),nMode,structure);
return UpdateInternal();
}

int CDib::Trace(int th,tr* trsu)
{LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
LPBYTE lpData = FindDIBBits(lpDIB);
int k=TraceDIB(lpData ,GetWidth(),GetHeight(),th,trsu);
UpdateInternal();
return k;
}

BOOL CDib::MedianFilterDib( int iFilterH, int iFilterW, 
						 int iFilterMX, int iFilterMY)
	{
	LPBYTE lpDIB = (LPBYTE)GlobalLock(m_hDib); 
    if (! lpDIB) 
	{
		GlobalUnlock(m_hDib);
		return NULL;
	}
LPBYTE lpData = FindDIBBits(lpDIB);
MedianFilter(lpData ,GetWidth(),GetHeight(),iFilterH,iFilterW,iFilterMX,iFilterMY);
return UpdateInternal();
	}

BOOL CDib::MedianFilterD()
{
	if (IsEmpty())
		return FALSE;

	if (! MedianFilterDIB(m_hDib))
		return FALSE;

	// return
	return UpdateInternal();
}

BOOL CDib::IsRequireDither(CDC* pDC)
{
	// if device can not display DIB color, dithering DIB
	if (GetBitCount() > 8 && 
		pDC->GetDeviceCaps(BITSPIXEL) <= 8)
		return TRUE;

	return FALSE;
}

BOOL CDib::DitherDisplay(CDC* pDC, CRect rcDest, CRect rcSrc, DWORD dwRop)
{
	return DitherDisplayDIB(pDC->GetSafeHdc(), 
							rcDest, 
							m_hDib, 
							rcSrc, 
							dwRop);
}

BOOL CDib::AdjustColor(int nColorModel, int v1, int v2, int v3)
{
	if (! AdjustDIBColor(m_hDib, nColorModel, v1, v2, v3))
		return FALSE;

	return UpdateInternal();
}

BOOL CDib::AdjustBrightness(int v)
{
	if (! AdjustDIBBrightness(m_hDib, v))
		return FALSE;

	return UpdateInternal();
}

BOOL CDib::AdjustContrast(int v)
{
	if (! AdjustDIBContrast(m_hDib, v))
		return FALSE;

	return UpdateInternal();
}

BOOL CDib::SeparateRGB(int nIndex)
{
	HDIB hNewDib = SeparateRGBfromDIB(m_hDib, nIndex);
	if (! hNewDib)
		return FALSE;

⌨️ 快捷键说明

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