www.pudn.com > phase_relation.rar > phase_relationDoc.cpp, change:2006-04-21,size:9695b


// phase_relationDoc.cpp : implementation of the CPhase_relationDoc class 
// 
 
#include "stdafx.h" 
#include "phase_relation.h" 
 
#include "phase_relationDoc.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPhase_relationDoc 
 
IMPLEMENT_DYNCREATE(CPhase_relationDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CPhase_relationDoc, CDocument) 
	//{{AFX_MSG_MAP(CPhase_relationDoc) 
	ON_COMMAND(ID_FILE_OPEN1, OnFileOpen1) 
	ON_COMMAND(ID_FILE_SAVE, OnFileSave) 
	ON_COMMAND(ID_FILE_OPEN2, OnFileOpen2) 
	ON_COMMAND(ID_FILE_phase_relation, OnFILEphaserelation) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CPhase_relationDoc construction/destruction 
 
CPhase_relationDoc::CPhase_relationDoc() 
{ 
	// TODO: add one-time construction code here 
   m_pBitmap=NULL; 
   m_pBitmap1=NULL; 
   m_pBitmap2=NULL; 
   flag=0; 
 
} 
 
CPhase_relationDoc::~CPhase_relationDoc() 
{ 
	m_pBitmap=NULL; 
    m_pBitmap1=NULL; 
    m_pBitmap2=NULL; 
    flag=0; 
} 
 
BOOL CPhase_relationDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CPhase_relationDoc serialization 
 
void CPhase_relationDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPhase_relationDoc diagnostics 
 
#ifdef _DEBUG 
void CPhase_relationDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CPhase_relationDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CPhase_relationDoc commands 
 
void CPhase_relationDoc::OnFileOpen1()  
{ 
	// TODO: Add your command handler code here 
	CFileDialog dlg(TRUE,"bmp","*.bmp"); 
	int result=dlg.DoModal(); 
	if(result==IDOK) 
	{ 
		CString path=dlg.GetPathName(); 
		 
		//m_pBitmap=new CDib(path); 
         
		m_pBitmap1=new CDib(path); 
        m_pBitmap=new CDib(path); 
			 
		if(m_pBitmap1->IsValid()) 
		   SetTitle(path); 
		else 
			DeleteContents(); 
	} 
	flag=1; 
	UpdateAllViews(0); 
	 
} 
 
BOOL CPhase_relationDoc::OnFileSave()  
{ 
CString strSaveFileType = "位图文件 (*.bmp;*.dib)|*.bmp; *.dib|All Files (*.*)|*.*||"; 
	CFileDialog FileDlg(FALSE, "*.bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strSaveFileType); 
 
	CFile fileOpen ; 
	if( FileDlg.DoModal() == IDOK ) { 
		if(!fileOpen.Open( FileDlg.GetPathName() , CFile::modeCreate|CFile::modeWrite )){ 
			AfxMessageBox("cannot create the file to save"); 
			return FALSE; 
		} 
	UINT ColorTable=m_pBitmap->GetNumberOfColors(); 
 
	BITMAPFILEHEADER* m_pBitmapFileHeader=(BITMAPFILEHEADER*)m_pBitmap; 
    //BITMAPINFO* m_pBitmapInfo1=(BITMAPINFO*)(m_pBitmap-sizeof(BITMAPINFOHEADER)); 
	//BYTE* m_pData1=(BYTE*)(m_pBitmap-sizeof(BITMAPINFOHEADER)-sizeof(BITMAPINFO)); 
 
    
	    BYTE* pBitmapData = m_pBitmap->GetData(); 
        LPBITMAPINFO pBitmapInfo = m_pBitmap->GetInfo(); 
        int bitmapHeight = m_pBitmap->GetHeight(); 
        int bitmapWidth = m_pBitmap->GetWidth(); 
		int ImageSize=bitmapHeight*bitmapWidth; 
    
   //BITMAPFILEHEADER* pBitmapInfo1 = (BITMAPFILEHEADER *)(m_pBitmap-sizeof(BITMAPFILEHEADER)); 
 
    DWORD fileLength =m_pBitmapFileHeader->bfSize;     
    DWORD bitmapsize = fileLength - 
			sizeof(BITMAPFILEHEADER); 
	//DWORD numberofData=bitmapsize-sizeof(BITMAPINFOHEADER)-(DWORD)ColorTable; 
	DWORD numberofData=fileLength-m_pBitmapFileHeader->bfOffBits; 
		//bitmapsize-sizeof(BITMAPINFOHEADER)-sizeof(RGBQUAD) *(DWORD)ColorTable; 
	 
 
	BITMAPFILEHEADER bmfh; 
 
	// 设置文件头中文件类型为"BM" 
	bmfh.bfType = 0x4d42;   
 
	// 计算信息头和调色板的大小尺寸 
	int nSizeHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *(DWORD)ColorTable; 
	//BYTE* pBitmapData1 =(BYTE*) (m_pBitmap-sizeof(BITMAPFILEHEADER)-nSizeHdr); 
 
	// 设置文件头信息 
	bmfh.bfSize = fileLength; 
	bmfh.bfReserved1 = bmfh.bfReserved2 = 0; 
	bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 
			sizeof(RGBQUAD) *(DWORD)ColorTable;	 
	//UINT Bibmapheight=m_pBitmap->GetHeight(); 
	//UINT Bitmapwidth=m_pBitmap->GetWidth(); 
	 
	 
	// 进行写操作 
	try { 
		fileOpen.Write((LPVOID)&bmfh, sizeof(BITMAPFILEHEADER)); 
		fileOpen.Write((LPVOID)pBitmapInfo,  nSizeHdr); 
		fileOpen.Write((LPVOID)pBitmapData,ImageSize);//numberofData); 
	} 
 
	// 错误处理 
	catch(CException* pe) { 
		pe->Delete(); 
		AfxMessageBox("write error"); 
		return FALSE; 
	} 
 
	// 返回 
	return TRUE; 
			 
		fileOpen.Close(); 
	} 
	return TRUE;	 
} 
 
void CPhase_relationDoc::OnFileOpen2()  
{ 
CFileDialog dlg(TRUE,"bmp","*.bmp"); 
	int result=dlg.DoModal(); 
	if(result==IDOK) 
	{ 
		CString path=dlg.GetPathName(); 
		 
		//m_pBitmap=new CDib(path); 
        
		m_pBitmap2=new CDib(path); 
        m_pBitmap=new CDib(path); 
		flag=flag+1; 
				 
		if(m_pBitmap2->IsValid()) 
		   SetTitle(path); 
		else 
			DeleteContents(); 
	} 
	 
	UpdateAllViews(0);	 
} 
 
BOOL CPhase_relationDoc::OnFILEphaserelation()  
{ 
      LPSTR 	lpSrcleft; 
 
	//循环变量 
	//long i; 
	//long j; 
	long lWidthl,lHeightl; 
	lWidthl=m_pBitmap1->GetWidth(); 
	//temp=m_pBitmap1->GetHeight(); 
    lHeightl=m_pBitmap1->GetHeight(); 
 
	//像素值 
	//double resultl; 
	unsigned char pixell; 
 
 
 
 
//右边图像的信息的获取 
 
// 指向源右图像的指针 
	LPSTR	lpSrcright; 
	 
	 
 
	//循环变量 
	long i; 
	long j; 
	long lWidthr,lHeightr; 
	lWidthr=m_pBitmap2->GetWidth();//;*m_pBitmap->GetNumberOfColors()+31)/32*4; 
	//temp=m_pBitmap2->GetHeight(); 
    lHeightr=m_pBitmap2->GetHeight(); 
 
	//像素值 
	//double resultr; 
	unsigned char pixelr; 
 
 
//判断两幅图的大小,如果两幅图大小不同,则不符合立体匹配的要求 
	if(lWidthl=!lWidthr) 
        ::MessageBox(NULL,"图像的大小不等,不符合要求!!","操作出错",NULL); 
    if(lHeightl=!lHeightr) 
		::MessageBox(NULL,"图像的大小不等,不符合要求!!","操作出错",NULL); 
 
 
	long lWidth,lHeight; 
	lWidth=lWidthr; 
	lHeight=lHeightr; 
 
 
 
//为视差图准备一个存储空间 
	// 指向缓存图像的指针 
	LPSTR	lpDst; 
	 
	// 指向缓存DIB图像的指针 
	LPSTR	lpNewDIBBits; 
	HLOCAL	hNewDIBBits; 
 
	// 暂时分配内存,以保存新图像 
	hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight); 
 
	if (hNewDIBBits == NULL) 
	{ 
		// 分配内存失败 
		return FALSE; 
	} 
	 
	// 锁定内存 
	lpNewDIBBits = (char * )LocalLock(hNewDIBBits); 
 
	// 初始化新分配的内存,设定初始值为255 
	lpDst = (char *)lpNewDIBBits; 
	memset(lpDst, (BYTE)255, lWidth * lHeight); 
 
 
	//使用水平方向的结构元素进行腐蚀 
 
	int d1,d2;     //设定搜索匹配区域的范围 
	d1=-10; 
	d2=10; 
	int chang,kuan;   //设定匹配窗的大小 
	chang=7; 
	kuan=7; 
 
	int d; 
 
	int i1,j1;   //用来存放对窗口求和时的变量 
 
	double g1,g2;    //用来存放窗口中左右图像像素灰度值的总和 
	double g3,g4;    //用来存放窗口中左右图像像素灰度值的平均 
	g3=0; 
	g4=0; 
	g1=0; 
	g2=0; 
 
	int bestd;   //最佳的视差值 
	bestd=0; 
	double xishu_max;  //相关系数的值 
	xishu_max=0; 
	double xishu; 
 
	double xishufenzi;   //相关系数的分子 
    xishufenzi=0; 
 
//	double xishufenmu;   //相关系数的分子 
	 
 
	double f1,f2;       //左右图窗口中的灰度平方差 
	f1=0; 
	f2=0; 
 
 
	for(j = lHeight-1-(kuan-1)/2; j >=(kuan-1)/2; j--) 
	{ 
		for(i = (chang-1)/2-1+8;i <lWidth-1-(chang-1)/2-8; i++) 
		{ 
			//由于使用7×7的窗,为防止越界,所以不处理最下边和最右边的两列像素 
 
			// 指向源图像第j行,第i个象素的指针 
			xishu_max=0; 
             
			for(d=-10;d=10;d++) 
			{ 
                xishufenzi=0; 
				f1=0; 
				f2=0; 
				for(j1=j-(kuan-1)/2;j1=j+(kuan-1)/2;j1++) 
				{ 
					for(i1=i-(chang-1)/2;i1=i+(chang-1)/2;i1++) 
					{ 
						lpSrcleft = (char *)m_pBitmap1->GetData()+ lWidth * j1 + i1;  //指向左图像像素的指针 
						lpSrcright = (char *)m_pBitmap2->GetData()+ lWidth * j1 + i1+d;  //指向右图像像素的指针 
                        pixell=(unsigned char)*lpSrcleft; 
						pixelr=(unsigned char)*lpSrcright; 
 
						g1=g1+pixell; 
                        g2=g2+pixelr; 
					} 
				} 
				g3=g1/(double)(kuan*chang); 
				g4=g2/(double)(kuan*chang); 
 
				for(j1=j-(kuan-1)/2;j1=j+(kuan-1)/2;j1++) 
				{ 
					for(i1=i-(chang-1)/2;i1=i+(chang-1)/2;i1++) 
					{ 
						lpSrcleft = (char *)m_pBitmap1->GetData()+ lWidth * j1 + i1;  //指向左图像像素的指针 
						lpSrcright = (char *)m_pBitmap2->GetData()+ lWidth * j1 + i1+d;  //指向右图像像素的指针 
                        pixell=(unsigned char)*lpSrcleft; 
						pixelr=(unsigned char)*lpSrcright; 
 
						xishufenzi=xishufenzi+((double)pixell-g3)*((double)pixelr-g4); 
						f1=f1+((double)pixell-g3)*((double)pixell-g3); 
						f2=f2+((double)pixelr-g4)*((double)pixelr-g4); 
 
						 
					} 
				} 
				xishu=xishufenzi/(sqrt(f1)*sqrt(f2)); 
				//tempxishu 
 
 
				if(xishu<0) 
				{ 
					xishu=-xishu; 
				} 
                if(xishu>xishu_max) 
				{ 
					xishu_max=xishu; 
				bestd=d; 
				} 
			} 
 
 
 
			// 指向目标图像第j行,第i个象素的指针			 
			lpDst = (char *)lpNewDIBBits + lWidth * j + i; 
 
			*lpDst = (unsigned char)(((double)255/10)*bestd+10); 
		//	*lpDst = 125; 
		 
		} 
	} 
 
	// 复制腐蚀后的图像 
	memcpy(m_pBitmap->GetData(), lpNewDIBBits, lWidth * lHeight); 
 
	// 释放内存 
	LocalUnlock(hNewDIBBits); 
	LocalFree(hNewDIBBits); 
 
	// 返回 
	 
	UpdateAllViews(0); 
SetModifiedFlag(TRUE); 
	return TRUE;		 
}