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