?? 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 + -