📄 dib.cpp
字号:
{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 + -