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;
}