www.pudn.com > OPENBITMAP1.rar > OPENBITMAPDlg.cpp
// OPENBITMAPDlg.cpp : implementation file // #include "stdafx.h" #include "OPENBITMAP.h" #include "OPENBITMAPDlg.h" #include#include "math.h" #include "GrayShow.h" #include "nrutil.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COPENBITMAPDlg dialog COPENBITMAPDlg::COPENBITMAPDlg(CWnd* pParent /*=NULL*/) : CDialog(COPENBITMAPDlg::IDD, pParent) { //{{AFX_DATA_INIT(COPENBITMAPDlg) m_dCorrelation = 0.0; m_dEntropy = 0.0; m_dInertiaQuadrature = 0.0; m_dLocalCalm = 0.0; m_dEnergy = 0.0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void COPENBITMAPDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(COPENBITMAPDlg) DDX_Text(pDX, IDC_EDIT_CORRELATION, m_dCorrelation); DDX_Text(pDX, IDC_EDIT_ENTROPY, m_dEntropy); DDX_Text(pDX, IDC_EDIT_INERTIA_QUADRATURE, m_dInertiaQuadrature); DDX_Text(pDX, IDC_EDIT_LOCAL_CALM, m_dLocalCalm); DDX_Text(pDX, IDC_EDIT_ENERGY, m_dEnergy); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COPENBITMAPDlg, CDialog) //{{AFX_MSG_MAP(COPENBITMAPDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDFILEOPEN, OnFileopen) ON_BN_CLICKED(IDDRAW1, OnDraw1) ON_BN_CLICKED(IDDRAW2, OnDraw2) ON_BN_CLICKED(IDSOURCE, OnSource) ON_BN_CLICKED(IDSEARCH1, OnSearch1) ON_BN_CLICKED(IDDISDOWM, OnDisdowm) ON_BN_CLICKED(IDDISUP, OnDisup) ON_BN_CLICKED(IDDRAW3, OnWenLi) ON_BN_CLICKED(IDSEARCH2, OnSearch2) ON_BN_CLICKED(IDCANCEL, OnOK) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COPENBITMAPDlg message handlers BOOL COPENBITMAPDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here // CWnd *pWnd0= GetDlgItem(IDC_BMPSHOW); // pDCShow = pWnd0->GetDC(); pDCShow =NULL; m_pMainDib = new CDib(); m_tOriPixelArray = NULL; m_tResPixelArray = NULL; for(int c=0;c GetWindow()); if(m_pResMap!=NULL) delete m_pResMap; m_pResMap=new CBitmap(); m_pResMap->CreateCompatibleBitmap(&ClientDC,m_nWndWidth,m_nWndHeight); CDC dc; dc.CreateCompatibleDC(&ClientDC); dc.SelectObject(m_pResMap); for(int i=0; i m_pDibBits; RGBQUAD * bmiColors; bmiColors=(RGBQUAD *)pDib->BmiColors(); int byteBitCount = pDib->GetBiBitCount()/8; int getBiBitCount=pDib->GetBiBitCount(); //////////////////判断位图是否为8位或24位 if(pDib->GetBiBitCount()<8) { MessageBox("Error ! GetBiBitCount less than 8 !","ERROR !",MB_OK); FileOpen=false; return; } FileOpen=true; m_tOriPixelArray = new RGBQUAD*[m_nWndHeight]; m_tResPixelArray = new RGBQUAD*[m_nWndHeight]; for(int l=0 ; l GetBiBitCount()==8) //////////////////////////位图为8位时 { int count = 0; for(int i=m_nWndHeight-1; i>=0; i--) { for(int j=0; j =0; i--) { for(int j=0; j GetDC(); CFileDialog FileDlg(TRUE, "", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ENABLESIZING , "BMP人脸图像(*.bmp)|*.bmp|", AfxGetMainWnd()); if (FileDlg.DoModal () != IDOK) return; POSITION pos =FileDlg.GetStartPosition(); strFile = FileDlg.GetNextPathName(pos); m_pMainDib->Open(strFile); m_nWndWidth = m_pMainDib->GetWidth(); m_nWndHeight= m_pMainDib->GetHeight(); m_sFileName = strFile; SetCursor(LoadCursor(NULL,IDC_WAIT)); //获取像素的值 LoadOriPixel(m_pMainDib); Search=false; MakeBitMap(); SetCursor(LoadCursor(NULL,IDC_ARROW)); LoadMapPixel(m_pMainDib); //////////////////////装载直方图数据 LoadMainPixel(m_pMainDib); //////////////////////装载关键直方图数据 for(int a=0;a<3;a++) for(int b=0;b<256;b++) { count3[a][b]=count2[a][b]; count5[a][b]=count4[a][b]; } for(int b=0;b<5;b++) count6[b]=0; } //////////////////////////////////////////////////////////////////////////////// // 画图 //////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::MyDraw() { CRect rc; pDCShow->GetWindow()->GetClientRect(&rc); pDCShow->Rectangle(&rc); CDC dc; CBitmap *pOldBitmap; dc.CreateCompatibleDC(pDCShow); pOldBitmap=dc.SelectObject(m_pResMap); if((220.0/m_nWndWidth)>(180.0/m_nWndHeight)) pDCShow->StretchBlt((220-m_nWndWidth*(180.0/m_nWndHeight))/2,0,m_nWndWidth*(180.0/m_nWndHeight),180,&dc,0,0,m_nWndWidth,m_nWndHeight,SRCCOPY); else pDCShow->StretchBlt(0,(180-m_nWndHeight*(220.0/m_nWndWidth))/2,220,(m_nWndHeight*(220.0/m_nWndWidth)),&dc,0,0,m_nWndWidth,m_nWndHeight,SRCCOPY); dc.SelectObject(pOldBitmap); dc.DeleteDC(); } //////////////////////////////////////////////////////////////////////////////// // 显示检索结果 //////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::MyDraw1() { CRect rc; pDCShow->GetWindow()->GetClientRect(&rc); pDCShow->Rectangle(&rc); CDC dc; CBitmap *pOldBitmap; dc.CreateCompatibleDC(pDCShow); pOldBitmap=dc.SelectObject(m_pResMap); if((140.0/m_nWndWidth)>(130.0/m_nWndHeight)) pDCShow->StretchBlt((140-m_nWndWidth*(130.0/m_nWndHeight))/2,0,m_nWndWidth*(130.0/m_nWndHeight),130,&dc,0,0,m_nWndWidth,m_nWndHeight,SRCCOPY); else pDCShow->StretchBlt(0,(130-m_nWndHeight*(140.0/m_nWndWidth))/2,140,(m_nWndHeight*(140.0/m_nWndWidth)),&dc,0,0,m_nWndWidth,m_nWndHeight,SRCCOPY); dc.SelectObject(pOldBitmap); dc.DeleteDC(); } //析构函数 COPENBITMAPDlg::~COPENBITMAPDlg() { } /////////////////////////////////////////////////////////////////////// //显示颜色直方图 /////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::OnDraw1() { // TODO: Add your control notification handler code here if(FileOpen==false) ///////////判断文件是否被打开 { MessageBox("Choose bmp files first !","Error !",MB_OK); return; } CWnd *pWnd0= GetDlgItem(IDC_ZHIFANGTU); /////////////申请窗口 pDCShow = pWnd0->GetDC(); ////////////////////////颜色直方图初始化为白色 for(int i1=m_nWndHeight-1; i1>=0; i1--) { for(int j=0; j =0; i--) { for(int j=0; j (m_nWndHeight-1)) n=m_nWndHeight-1; else n=(int)((count1[0][(m_tOriPixelArray[i][j].rgbBlue)]+=1)/10); if(n==0) n=1; m=(int)((m_tOriPixelArray[i][j].rgbBlue)*t); m_tResPixelArray[m_nWndHeight-n][m].rgbBlue=0; count2[0][(m_tOriPixelArray[i][j].rgbGreen)]+=1; if(((count1[0][m_tOriPixelArray[i][j].rgbGreen])/10)>(m_nWndHeight-1)) n=m_nWndHeight-1; else n=(int)((count1[0][(m_tOriPixelArray[i][j].rgbGreen)]+=1)/10); if(n==0) n=1; m=(int)((m_tOriPixelArray[i][j].rgbGreen)*t); m_tResPixelArray[m_nWndHeight-n][m].rgbGreen=0; count2[0][(m_tOriPixelArray[i][j].rgbRed)]+=1; if(((count1[0][m_tOriPixelArray[i][j].rgbRed])/10)>(m_nWndHeight-1)) n=m_nWndHeight-1; else n=(int)((count1[0][(m_tOriPixelArray[i][j].rgbRed)]+=1)/10); if(n==0) n=1; m=(int)((m_tOriPixelArray[i][j].rgbRed)*t); m_tResPixelArray[m_nWndHeight-n][m].rgbRed=0; } } } //////////////////////////////////////////////////////////////////////////////// //显示关键直方图 ///////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::OnDraw2() { // TODO: Add your control notification handler code here if(FileOpen==false) ///////////判断文件是否被打开 { MessageBox("Choose bmp files first !","Error !",MB_OK); return; } CWnd *pWnd0= GetDlgItem(IDC_ZHIFANGTU); /////////////申请窗口 pDCShow = pWnd0->GetDC(); ////////////////////////颜色直方图初始化为白色 for(int i1=m_nWndHeight-1; i1>=0; i1--) { for(int j=0; j =((m_nWndHeight-1)/3); i--) { for(int j=(m_nWndWidth/3); j<=(m_nWndWidth*2/3); j++) { count4[0][(m_tOriPixelArray[i][j].rgbBlue)]+=1; if(((count1[0][m_tOriPixelArray[i][j].rgbBlue])/2)>(m_nWndHeight-1)) n=m_nWndHeight-1; else n=(int)((count1[0][(m_tOriPixelArray[i][j].rgbBlue)]+=1)/2); if(n==0) n=1; m=(int)((m_tOriPixelArray[i][j].rgbBlue)*t); m_tResPixelArray[m_nWndHeight-n][m].rgbBlue=0; count4[0][(m_tOriPixelArray[i][j].rgbGreen)]+=1; if(((count1[0][m_tOriPixelArray[i][j].rgbGreen])/2)>(m_nWndHeight-1)) n=m_nWndHeight-1; else n=(int)((count1[0][(m_tOriPixelArray[i][j].rgbGreen)]+=1)/2); if(n==0) n=1; m=(int)((m_tOriPixelArray[i][j].rgbGreen)*t); m_tResPixelArray[m_nWndHeight-n][m].rgbGreen=0; count4[0][(m_tOriPixelArray[i][j].rgbRed)]+=1; if(((count1[0][m_tOriPixelArray[i][j].rgbRed])/2)>(m_nWndHeight-1)) n=m_nWndHeight-1; else n=(int)((count1[0][(m_tOriPixelArray[i][j].rgbRed)]+=1)/2); if(n==0) n=1; m=(int)((m_tOriPixelArray[i][j].rgbRed)*t); m_tResPixelArray[m_nWndHeight-n][m].rgbRed=0; } } } void COPENBITMAPDlg::OnSource() { // TODO: Add your control notification handler code here /////////////////////////////////////////浏览文件夹获取路径 filepathNum=0; BROWSEINFO bi={0}; bi.hwndOwner = this->GetSafeHwnd(); bi.pidlRoot = NULL; bi.lpszTitle = _T("请选择文件夹"); bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_EDITBOX; bi.lpfn = BrowseCallbackProc; CString m_strPath; //////////////////////得到的检索文件夹路径 bi.lParam = (LPARAM)m_strPath.GetBuffer(m_strPath.GetLength()); char* m_strTemplateInfoPath; LPITEMIDLIST pIdl; if((pIdl = SHBrowseForFolder(&bi)) != NULL) { TCHAR path[MAX_PATH]; SHGetPathFromIDList(pIdl,path); m_strTemplateInfoPath = path; } else return ; // MessageBox(m_strTemplateInfoPath); ////////////////////////////////////////////按文件夹路径检索文件夹获取子文件路径 TCHAR* sR=m_strTemplateInfoPath; func(sR); } //////////////////////////////////////////////////////////////////////////////////////////// // 用于浏览文件夹的回调函数 //////////////////////////////////////////////////////////////////////////////////////////// int CALLBACK COPENBITMAPDlg::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { if(uMsg==BFFM_SELCHANGED||uMsg==BFFM_INITIALIZED) { if(uMsg==BFFM_INITIALIZED) { ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE, LPARAM(lpData)); } } return 0; } //////////////////////////////////////////////////////////////////////////////////////////// //检索指定的文件夹 //////////////////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::func(LPTSTR fileName) { char sz[MAX_PATH]; lstrcpy(sz,fileName); WIN32_FIND_DATA wfd; HANDLE hFind; TCHAR szF[MAX_PATH]; lstrcpy(szF,sz); lstrcat(sz,"\\"); lstrcat(sz,"*.bmp"); hFind=FindFirstFile(sz,&wfd); if(hFind==INVALID_HANDLE_VALUE) { MessageBox("No bmp files found !","Please choose another directory !",MB_OK); return; } do { TCHAR szFn[MAX_PATH]; lstrcpy(szFn, szF); lstrcat(szFn,"\\"); lstrcat(szFn,wfd.cFileName); filepath[filepathNum][0]='\0'; lstrcpy(filepath[filepathNum++],szFn); // MessageBox(filepath[0]); }while( FindNextFile(hFind,&wfd) ); } ///////////////////////////////////////////////////////////////////////////// //按颜色直方图检索 //////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::OnSearch1() { // TODO: Add your control notification handler code here if(FileOpen==false) ///////////判断文件是否被打开 { MessageBox("Choose bmp files first !","Error !",MB_OK); displayOk=false; return; } if(filepathNum==0) ///////////判断检索文件库是否选中 { MessageBox("No bmp files found !","Please choose a directory !",MB_OK); displayOk=false; return; } ///////////////////////计算距离 double a=0.0; double b=0.0; for(int k=0;k 65534) MessageBox("overload "); } /////////////////////////////////排序 for(int p=0;p temp[d]) { e=temp[n]; temp[n]=temp[d]; temp[d]=e; d=d+1; } else { d=d+1; } }while(d Open(strFile); m_nWndWidth = m_pMainDib->GetWidth(); m_nWndHeight= m_pMainDib->GetHeight(); m_sFileName = strFile; SetCursor(LoadCursor(NULL,IDC_WAIT)); //////////////////////获取颜色直方图的值 LoadOriPixel(m_pMainDib); LoadMapPixel(m_pMainDib); SetCursor(LoadCursor(NULL,IDC_ARROW)); } //////////////////////////////////////////////////////////////////////////////////// //读取库函数关键颜色直方图信息 ////////////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::ReadFileMain(LPTSTR fileName3) { CString strFile; strFile = fileName3; m_pMainDib->Open(strFile); m_nWndWidth = m_pMainDib->GetWidth(); m_nWndHeight= m_pMainDib->GetHeight(); m_sFileName = strFile; SetCursor(LoadCursor(NULL,IDC_WAIT)); //////////////////////获取关键颜色直方图的值 LoadOriPixel(m_pMainDib); LoadMainPixel(m_pMainDib); SetCursor(LoadCursor(NULL,IDC_ARROW)); } //////////////////////////////////////////////////////////////////////////////////// //显示检索结果 //////////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::DisplayResult(int Num) { CWnd *pWnd0= GetDlgItem(IDCRESULT1+Num); /////////////申请窗口 pDCShow = pWnd0->GetDC(); CString strFile; strFile = filepath[temp[Num]]; m_pMainDib->Open(strFile); m_nWndWidth = m_pMainDib->GetWidth(); m_nWndHeight= m_pMainDib->GetHeight(); m_sFileName = strFile; SetCursor(LoadCursor(NULL,IDC_WAIT)); //获取像素的值 LoadOriPixel(m_pMainDib); Search=true; MakeBitMap(); SetCursor(LoadCursor(NULL,IDC_ARROW)); } //////////////////////////////////////////////////////////////////////////////////// //显示检索下一页结果 //////////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::DisplayResultDown(int Num) { CWnd *pWnd0= GetDlgItem(IDCRESULT1+Num); /////////////申请窗口 pDCShow = pWnd0->GetDC(); CString strFile; strFile = filepath[temp[Num+8]]; m_pMainDib->Open(strFile); m_nWndWidth = m_pMainDib->GetWidth(); m_nWndHeight= m_pMainDib->GetHeight(); m_sFileName = strFile; SetCursor(LoadCursor(NULL,IDC_WAIT)); //获取像素的值 LoadOriPixel(m_pMainDib); Search=true; MakeBitMap(); SetCursor(LoadCursor(NULL,IDC_ARROW)); } void COPENBITMAPDlg::OnDisdowm() { // TODO: Add your control notification handler code here if(displayOk==false||displayUp==false) return; //////////////////////////显示检索下一页结果 for(int Num=0;Num<8;Num++) { DisplayResultDown(Num); } displayUp=false; } void COPENBITMAPDlg::OnDisup() { // TODO: Add your control notification handler code here if(displayOk==false||displayUp==true) return; //////////////////////////显示检索上一页结果 for(int Num=0;Num<8;Num++) { DisplayResult(Num); } displayUp=true; } //////////////////////////////////////////////////////////////////////////////////// // 显示纹理特征 //////////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::OnWenLi() { LoadWenLi(strFile); UpdateData(false); count6[0]=dEnergy; count6[1]=dEntropy; count6[2]=dInertiaQuadrature; count6[3]=dCorrelation; count6[4]=dLocalCalm; } //////////////////////////////////////////////////////////////////////////////////// // 计算纹理特征 //////////////////////////////////////////////////////////////////////////////////// void COPENBITMAPDlg::LoadWenLi(CString strFile) { m_grayShow.LoadImage(strFile); // double dEnergy = 0.0; // double dEntropy = 0.0; // double dInertiaQuadrature = 0.0; // double dLocalCalm = 0.0; // double dCorrelation = 0.0; dEnergy = 0.0; dEntropy = 0.0; dInertiaQuadrature= 0.0; dLocalCalm = 0.0; dCorrelation = 0.0; coe_dEnergy =200.0; coe_dEntropy =40.0 ; coe_dInertiaQuadrature =10.0 ; coe_dLocalCalm =150.0 ; coe_dCorrelation =100.0; double dEnergy1 = 0.0; double dEntropy1 = 0.0; double dInertiaQuadrature1= 0.0; double dLocalCalm1 = 0.0; double dCorrelation1 = 0.0; unsigned char** arLocalImage; arLocalImage = cmatrix(0, m_grayShow.FilterWindowWidth-1, 0, m_grayShow.FilterWindowWidth-1); int rolltimeH = m_grayShow.ImageHeight/m_grayShow.FilterWindowWidth; int rolltimeW = m_grayShow.ImageWidth /m_grayShow.FilterWindowWidth; int i,j; int p,q; //将图像分成若干个窗口,计算其纹理均值 for(i=0; i< rolltimeH; i++) { for(j=0; j 65534) { temp1[k]=distance1[k]=65534; // MessageBox("overload "); // return; } } unsigned e=0; for(int n=0;n temp1[d]) { e=temp1[n]; temp1[n]=temp1[d]; temp1[d]=e; d=d+1; } else { d=d+1; } }while(d