?? myinterfacedlg.cpp
字號(hào):
void CMyInterfaceDlg::OnBnClickedSearchfromlib()//統(tǒng)計(jì)灰度直方圖
{
// TODO: 在此添加控件通知處理程序代碼
HWND hWnd=m_hWnd;
BOOL c=lplas.Get("c:\\gray.bmp");
if(c==FALSE)
return;
lplas.Histogram(hWnd,AfxGetApp()->m_hInstance);
}
void CMyInterfaceDlg::OnBnClickedFind()//搜索相似的圖片
{
// TODO: 在此添加控件通知處理程序代碼
/*CAllFunction allFunc;
allFunc.DoModal();*/
intSD=0;
if(picInput==TRUE)
{
UpdateData(TRUE);
CDC *pDC=GetDlgItem(IDC_PIC_LIB)->GetDC();
//pDC->TextOut(10,168,"檢索結(jié)果:");
CBmpProc* pDestBmp;//目標(biāo)圖
CBmpProc bmp;
int totalReNum;
//double fsim[15];//與15張圖相比較的相似度存放數(shù)組
//int psim[15];//與fsim向?qū)?yīng)的圖片編號(hào)數(shù)組,以便顯示
if(!m_pset->IsOpen())
m_pset->Open();
if(m_pset->GetRecordCount()>0)
{
m_pset->MoveFirst();
while(!m_pset->IsEOF())
{
m_pset->MoveNext();
}
totalReNum=(int)m_pset->GetRecordCount();
}
else
totalReNum=0;
CArray<double,double> fsim;
fsim.SetSize(totalReNum,32);
CArray<long,long> psim;
psim.SetSize(totalReNum,32);
if(m_pset->GetRecordCount()>0)
{
m_pset->MoveFirst();
int picnum=0;
m_ColorGraphSubmit.EnableWindow(FALSE);
while(!m_pset->IsEOF())
{
CLapls lplas;
BOOL b=lplas.Get((char*)(LPCSTR)(CString)m_pset->m_picAddr);
if(b==FALSE)
return;
HBITMAP hBitmap=lplas.ColortoGrayScale(NULL);
bmp.LoadFromHbmp(hBitmap);
//bmp.LoadFromFile((CString)m_pset->m_picAddr);
pDestBmp=(CBmpProc*)new CBmpProc;
pDestBmp->LoadFromObject(bmp);
CSize objsize=pDestBmp->Size();
int isize=(objsize.cx>objsize.cy)?objsize.cx:objsize.cy;
pDestBmp->CalculateColor(pDC,isize);
int x1,x2,y1,y2,x3,x4,y3,y4;
x1=m_x1;x2=m_x2;x3=m_x3;x4=m_x4;
y1=m_y1;y2=m_y2;y3=m_y3;y4=m_y4;
double sim[4][4];//子塊之間的相似度數(shù)組
int ccount[4][4];//有過統(tǒng)計(jì)的顏色數(shù)目記錄數(shù)組
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
sim[i][j]=0;
ccount[i][j]=0;
}
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]++;
}
else 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])))/(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];
//計(jì)算兩圖像最終的相似度結(jié)果
double final_sim=0;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if((i==x1&&j==y1)||(i==x2&&j==y2)||(i==x3&&j==y3)||(i==x4&&j==y4))
final_sim+=sim[i][j];
else
final_sim+=sim[i][j]*0.7;
final_sim=final_sim/16;
fsim.SetAt(picnum,final_sim);
psim.SetAt(picnum,m_pset->m_id);
delete pDestBmp;
m_pset->MoveNext();
picnum++;
}
m_ColorGraphSubmit.EnableWindow(TRUE);
double tempf;
long tempp;
for(int i=m_pset->GetRecordCount();i>0;i--)
for(int j=0;j<i-1;j++)
{
if(fsim.GetAt(j)<fsim.GetAt(j+1))
{
tempp=psim[j];
tempf=fsim[j];
fsim[j]=fsim[j+1];
psim[j]=psim[j+1];
fsim[j+1]=tempf;
psim[j+1]=tempp;
}
}
//搜索出最相似的一張圖片
if(totalReNum>0)
{
if(fsim.GetAt(0)>=(m_valve-0.000000000000004))
{
long pp=psim.GetAt(0);
/*CString strSql;
strSql.Format("select * from pic where id=%f",pp);
m_pset->m_pDatabase->ExecuteSQL(strSql); */
m_pset->MoveFirst();
while(m_pset->m_id!=pp)
m_pset->MoveNext();
bmp.LoadFromFile((CString)m_pset->m_picAddr);
pDest=new CBmpProc;
pDest->LoadFromObject(bmp,NULL);
CRect rect;
::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB),&rect);
pDest->Draw(*pDC,&rect);
picShow=TRUE;
m_valve=fsim.GetAt(0);
UpdateData(FALSE);
}
else
{
/*if(pBmp!=NULL)
{
delete pBmp;
pBmp=NULL;
}*/
m_pset->Close();
AfxMessageBox("圖片庫(kù)沒有與原圖相似的圖片!");
return;
}
}
}
else
{
/*if(pBmp!=NULL)
{
delete pBmp;
pBmp=NULL;
}*/
m_pset->Close();
AfxMessageBox("圖片庫(kù)為空!!");
return;
}
m_pset->Close();
//delete pBmp;
}
else
{
/*if(pBmp!=NULL)
{
delete pBmp;
pBmp=NULL;
}*/
AfxMessageBox("請(qǐng)輸入原圖!!");
return;
}
}
void CMyInterfaceDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知處理程序代碼
m_ListPic.ResetContent();
if(!m_pset->IsOpen())
m_pset->Open();
m_pset->AddNew();
CString strSql;
strSql.Format("insert into pic(picaddr) values('%s')",SourcePic);
m_pset->m_pDatabase->ExecuteSQL(strSql);
m_pset->Requery();
m_pset->MoveLast();
//去掉路徑只取文件名
//CString strPic=(CString)(m_pset->m_picAddr);
//int i=strPic.ReverseFind('\\');
//strPic=strPic.Mid(i+1,strPic.GetLength()-i);
m_ListPic.AddString(SourcePic);
m_ListPic.SetCurSel(0);
m_pset->Close();
}
void CMyInterfaceDlg::OnBnClickedButton8()//設(shè)置參數(shù)和閥值
{
// TODO: 在此添加控件通知處理程序代碼
if(picInput==TRUE)
{
UpdateData(TRUE);
if(m_x1==-1&&m_x2==-1&&m_x3==-1&&m_x4==-1&&m_y1==-1&&m_y2==-1&&m_y3==-1&&m_y4==-1)
{
AfxMessageBox("請(qǐng)輸入一個(gè)適當(dāng)?shù)淖訅K!");
m_x1=1;m_y1=1;
m_x2=1;m_y2=2;
m_x3=2;m_y3=1;
m_x4=2;m_y4=2;
UpdateData(FALSE);
return;
}
CDC* pDC=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC))->GetDC();
CBmpProc bmp;
CString string(SourcePic);
CLapls lplas;
BOOL b1=lplas.Get((char*)(LPCSTR)string);
if(b1==FALSE)
return;
HBITMAP hBitmap=lplas.ColortoGrayScale(NULL);
bmp.LoadFromHbmp(hBitmap);
//bmp.LoadFromFile(string);
if(m_left==0&&m_right==0&&m_top==0&&m_bottom==0)
{
CSize objsize=bmp.Size();
m_left=m_top=0;
m_right=objsize.cx;
m_bottom=objsize.cy;
UpdateData(False);
}
if(pBmp!=NULL)
{
delete pBmp;
pBmp=NULL;
pBmp=new CBmpProc;
}
else
pBmp=new CBmpProc;
BOOL b=pBmp->LoadFromObject(bmp,&CRect(m_left,m_top,m_right,m_bottom));
if(b==FALSE)
{
AfxMessageBox("輸入坐標(biāo)不合法!");
return;
}
CDC* dcPic;
CRect rect;
dcPic=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC))->GetDC();
::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC),&rect);
CSize objsize=pBmp->Size();
int isize=(objsize.cx>objsize.cy)?objsize.cx:objsize.cy;
pBmp->CalculateColor(pDC,isize); //計(jì)算原圖的顏色直方圖
if(m_x1!=-1&&m_y1!=-1)
pBmp->CalculateColorPair(m_x1,m_y1);
if(m_x2!=-1&&m_y2!=-1)
pBmp->CalculateColorPair(m_x2,m_y2);
if(m_x3!=-1&&m_y3!=-1)
pBmp->CalculateColorPair(m_x3,m_y3);
if(m_x4!=-1&&m_y4!=-1)
pBmp->CalculateColorPair(m_x4,m_y4);//其實(shí)在以上的4部計(jì)算中,已經(jīng)形成了初步的顏色對(duì)表,在此只不過是將表中的數(shù)據(jù)從大到
//小排列出來并且祛除差值小于某一域值的顏色對(duì),形成顏色對(duì)表
pBmp->SortColorPair(); //顏色對(duì)表計(jì)算出來,表中的數(shù)據(jù)既是用戶輸入的該圖像的代表特征
CPicture picshow;
picshow.ShowPic((char*)(LPCSTR)string,m_hWnd,IDC_PIC);
//pBmp->Draw(*dcPic,&rect);
}
else
{
AfxMessageBox("請(qǐng)輸入原圖!");
return;
}
}
void CMyInterfaceDlg::OnBnClickedButtoncolorpair()//顏色對(duì)法搜索圖片
{
// TODO: 在此添加控件通知處理程序代碼
intSD=0;
UpdateData(TRUE);
if(pBmp==NULL)
{
AfxMessageBox("原圖未被載入");
return;
}
if(picInput==TRUE)
{
CDC *pDC=GetDlgItem(IDC_PIC_LIB)->GetDC();
//UpdateData(TRUE);
CBmpProc bmp;
CBmpProc* pDestBmp;
int totalReNum;
if(!m_pset->IsOpen())
m_pset->Open();
if(m_pset->GetRecordCount()>0)
{
m_pset->MoveFirst();
while(!m_pset->IsEOF())
{
m_pset->MoveNext();
}
totalReNum=(int)m_pset->GetRecordCount();
}
else
totalReNum=0;
CArray<int,int> fsim;
fsim.SetSize(totalReNum,32);
CArray<long,long> psim;
psim.SetSize(totalReNum,32);
if(m_pset->GetRecordCount()>0)
{
m_ColorPairSubmit.EnableWindow(FALSE);
double ave=0;//確定匹配時(shí)候不能使用精確匹配,所以需要一個(gè)差值小于某一域值時(shí)的域值
for(int s=0;s<pBmp->pair_count;s++)
{
ave+=pBmp->pair[s].o_dis;
}
ave=ave/pBmp->pair_count;
ave=ave*0.02;//確定誤差小于2%的顏色對(duì)均屬于這個(gè)域值
m_pset->MoveFirst();
int picnum=0;
while(!m_pset->IsEOF())
{
CLapls lplas;
BOOL b=lplas.Get((char*)(LPCSTR)(CString)m_pset->m_picAddr);
if(b==FALSE)
return;
HBITMAP hBitmap=lplas.ColortoGrayScale(NULL);
bmp.LoadFromHbmp(hBitmap);
//bmp.LoadFromFile((CString)m_pset->m_picAddr);
pDestBmp=(CBmpProc*)new CBmpProc;
pDestBmp->LoadFromObject(bmp);
CSize objsize=pDestBmp->Size();
int isize=(objsize.cx>objsize.cy)?objsize.cx:objsize.cy;
pDestBmp->CalculateColor(pDC,isize);
int match=0;
int pairflag[128];//顏色對(duì)匹配標(biāo)志數(shù)組,即某一顏色對(duì)如果在目標(biāo)圖像中找到,下一次就不能再匹配
for(int t=0;t<128;t++)
pairflag[t]=-1;
for(int i=0;i<4;i++)//按順序計(jì)算目標(biāo)圖像中一子塊與其周圍子塊的顏色對(duì),然后在用戶輸入的圖像的顏色對(duì)表中查詢計(jì)算出
{
for(int j=0;j<4;j++)//來的顏色對(duì)
{
pDestBmp->CalculateColorPair(i,j);
pDestBmp->SortColorPair();
for(int comp=0;comp<pDestBmp->pair_count;comp++)//差值小于某域值,則匹配到
for(int count=0;count<pBmp->pair_count;count++)
{
if((pairflag[count]!=0)&&(fabs(pBmp->pair[count].o_dis-pDestBmp->pair[comp].o_dis)<ave))
{
pairflag[count]=0;//標(biāo)識(shí)了原圖中被匹配到的歐氏值
match++;
break;
}
}
}
for(int re=0;re<pDestBmp->pair_count;re++)
pDestBmp->pair[re].o_dis=-1;
}
fsim.SetAt(picnum,match);
psim.SetAt(picnum,m_pset->m_id);
delete pDestBmp;
m_pset->MoveNext();
picnum++;
}
m_ColorPairSubmit.EnableWindow(TRUE);
int tempf;
long tempp;
for(int i=m_pset->GetRecordCount();i>0;i--)
for(int j=0;j<i-1;j++)
{
if(fsim[j]<fsim[j+1])
{
tempp=psim[j];
tempf=fsim[j];
fsim[j]=fsim[j+1];
psim[j]=psim[j+1];
fsim[j+1]=tempf;
psim[j+1]=tempp;
}
}
int ff=fsim[0];
if(fsim[0]>=(pBmp->pair_count)*m_valve)
{
long pp=psim[0];
m_pset->MoveFirst();
while(m_pset->m_id!=pp)
m_pset->MoveNext();
bmp.LoadFromFile((CString)m_pset->m_picAddr);
pDest=new CBmpProc;
pDest->LoadFromObject(bmp,NULL);
CRect rect;
::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB),&rect);
pDest->Draw(*pDC,&rect);
picShow=TRUE;
m_valve=((double)fsim.GetAt(0))/((double)pBmp->pair_count);
UpdateData(FALSE);
}
else
{
m_pset->Close();
AfxMessageBox("圖片庫(kù)沒有與原圖相似的圖片!");
return;
}
}
else
{
m_pset->Close();
AfxMessageBox("圖片庫(kù)為空!!");
return;
}
m_pset->Close();
}
else
{
AfxMessageBox("請(qǐng)輸入原圖!!");
return;
}
}
void CAboutDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知處理程序代碼
OnOK();
}
LRESULT CMyInterfaceDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加專用代碼和/或調(diào)用基類
CRect windowRect;
GetWindowRect(&windowRect);
switch(message)
{
case WM_CREATE:
case WM_SETFOCUS:
case WM_SIZE:
case WM_KILLFOCUS:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MOVE:
case WM_NCPAINT:
case WM_NCACTIVATE:
case WM_NOTIFY:
InvalidateRect(&windowRect,TRUE);
break;
case WM_PAINT:
{
CDC* dc = GetWindowDC();
if (dc)
DrawTitleBar(dc);
if(picInput==TRUE&&pBmp!=NULL)//原圖重畫
{
/*HWND hWnd = ::FindWindow(NULL,"MyInterface");
CPicture pic;
pic.ShowPic(SourcePic,hWnd,IDC_PIC);*/
/*CDC* dcPic;
CRect rect;
dcPic=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC))->GetDC();
::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC),&rect);
pBmp->Draw(*dcPic,&rect);*/
CPicture pic;
pic.ShowPic(SourcePic,m_hWnd,IDC_PIC);
}
if(pDest!=NULL&&picShow==TRUE)
{
CDC* dcPic;
CRect rect;
dcPic=CWnd::FromHandle(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB))->GetDC();
::GetClientRect(::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PIC_LIB),&rect);
pDest->Draw(*dcPic,&rect);
}
if(DestPic!=NULL&&intSD==2)//目的圖重畫
{
HWND hWnd = m_hWnd;
CPicture pic;
pic.ShowPic(DestPic,hWnd,IDC_PIC_LIB);
}
if(charlap!=NULL&&intSD==1&&hBitmap!=NULL)//邊緣檢測(cè)重畫
{
HWND hWnd = m_hWnd;
CPicture pic;
pic.ShowPic(hBitmap,hWnd,IDC_PIC_LIB);
}
if(charlap!=NULL&&intSD==3&&hBitmap!=NULL)//灰度圖重畫
{
HWND hWnd = m_hWnd;
CPicture pic;
pic.ShowPic(hBitmap,hWnd,IDC_PIC_LIB);
}
if(charlap!=NULL&&intSD==4&&hBitmap!=NULL)//去噪后重畫
{
HWND hWnd = m_hWnd;
CPicture pic;
pic.ShowPic(hBitmap,hWnd,IDC_PIC_LIB);
}
ReleaseDC(dc);
}
break;
default:break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -