📄 code backup.txt
字号:
CArray<double,double&> fsim;
CArray<int,int> psim;
CBmpProc *pDestBmp;
CString comp_pic_path;
fsim.SetSize(m_pset->GetRecordCount(),32);
psim.SetSize(m_pset->GetRecordCount(),32);
HWND hWnd=::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB);
CDC* pDC=CDC::FromHandle(::GetDC(hWnd));
if(!m_pset->IsOpen())
m_pset->Open();
//double fsim[15];//15张待比较的目标图片与用户输入图片的相似度存放的数组
//int psim[15];//与fsim想对应的图片编号数组,以便显示
if(m_pset->GetRecordCount()>0)
{
m_pset->MoveFirst();
int comp_pic=1;
while(!m_pset->IsEOF())
{
comp_pic_path=(CString)m_pset->m_picAddr;
comp_pic_path.Format("image%d.bmp",comp_pic);
char* compic=comp_pic_path.GetBuffer(comp_pic_path.GetLength());
CPicture pic;
pic.ShowPic(compic,AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB);
bmp.LoadFromFile((LPCTSTR)(CString)(m_pset->m_picAddr));// 从库中读入位图
pDestBmp = new CBmpProc;//用new分配类目标
pDestBmp->LoadFromObject(bmp,&CRect(0,0,128,128));
//从bmp中的指定区域读入图像,以便图片匹配的进行
pDestBmp->CalculateColor(pDC);//计算目标图片的颜色直方图
int x1,x2,y1,y2,x3,x4,y3,y4;
x1=0;x2=(bmp.Width())/4;x3=2*(bmp.Width())/4;x4=3*(bmp.Width())/4;
y1=0;y2=(bmp.Height())/4;y3=2*(bmp.Height())/4;y4=3*(bmp.Height())/4;
//用户输入的对象所在子块(既用户选定的4个子块)的坐标
double sim[4][4];//子块之间的相似度数组
int ccount[4][4];//有过统计的颜色数目记录数组
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
sim[i][j]=0;
ccount[i][j]=0;
}
//以下两个for按公式计算两幅图像的各对应子块之间的相似度
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int k=0;k<256;k++){
if((pDestBmp->Color[i][j][k]>=pBmp->Color[i][j][k])&&pDestBmp->Color[i][j][k]!=0){
sim[i][j]+=(1-((fabs((long double)(pDestBmp->Color[i][j][k]-pBmp->Color[i][j][k])))/(pDestBmp->Color[i][j][k])));
ccount[i][j]++;
}
if((pDestBmp->Color[i][j][k]<pBmp->Color[i][j][k])&&pBmp->Color[i][j][k]!=0){
sim[i][j]+=(1-((fabs((long double)(pDestBmp->Color[i][j][k]-pBmp->Color[i][j][k])))/(pBmp->Color[i][j][k])));
ccount[i][j]++;
}
}
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
sim[i][j]=sim[i][j]/ccount[i][j];
}
//计算两图像最终的相似度结果
double final_sim=0;
for(i=0;i<4;i++)
for(int j=0;j<4;j++){
//对用户指定的块设置权重为1
if((i==x1&&j==y1)||(i==x2&&j==y2)||(i==x3&&j==y3)||(i==x4&&j==y4))
final_sim+=sim[i][j];
else
//其他块降低权重为0.7,提高对对象匹配的精确度
final_sim+=(sim[i][j]*0.7);
}
//将15幅被比较图像与用户输入源图像的最后计算出来的相似度结果记录在数组中
fsim.SetAt((comp_pic-1),final_sim);
delete pDestBmp;
comp_pic++;
m_pset->MoveNext();
}
}
m_pset->Close();
int count=15;double tempf;int tempp;
for(int l=0;l<15;l++){
psim.SetAt(l,(l+1)); //设定编号数组
}
//将15个相似度从大到小排列,并且改变次序的时候编号数组和跟着改变
for(int i=count;i>0;i--)
for(int j=0;j<i-1;j++){
if(fsim.GetAt(j)<fsim.GetAt(j+1)){
tempp=psim.GetAt(j);
tempf=fsim.GetAt(j);
fsim.SetAt(j,fsim.GetAt(j+1));
psim.SetAt(j,psim.GetAt(j+1));
fsim.SetAt((j+1),tempf);
psim.SetAt((j+1),tempp);
}
}
int disp=0;
int space=-128;
//将相似度最大的的两张图片显示出来
for(int disp_pic=1;disp_pic<=2;disp_pic++){
comp_pic_path.Format("image%d.bmp",psim.GetAt(disp_pic));
bmp.LoadFromFile(comp_pic_path); // 从库中读入位图
pDestBmp = (CBmpProc*)new(CBmpProc); // 用new分配类目标
pDestBmp->LoadFromObject(bmp, &CRect(0,0,128,128)); // 从bmp中的指定区域读入图像
disp++;
space+=128;
pDC->Rectangle(10+space-1,190-1,138+space+1,318+1);
pDestBmp->Draw(*pDC, &CRect(10+space,190,138+space,318));
// 将pBmp中的图像绘入DC的指定区域
space+=6;
}
delete pBmp; // 删除类目标,delete会自动调用类的析构函数。
pBmp=NULL;
delete pDC;
pDC=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -