⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgmeasure.cpp

📁 基于视觉的道路识别技术的智能小车导航源代码
💻 CPP
字号:
// DlgMeasure.cpp : implementation file
//

#include "stdafx.h"
#include "AGV.h"
#include "DlgMeasure.h"
#include "DlgIntensity.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgMeasure dialog


CDlgMeasure::CDlgMeasure(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgMeasure::IDD, pParent)
	, m_palDIB(NULL)//一定要初始化
	,m_hDIB(NULL)
{
	//{{AFX_DATA_INIT(CDlgMeasure)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CDlgMeasure::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgMeasure)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgMeasure, CDialog)
	//{{AFX_MSG_MAP(CDlgMeasure)
	ON_WM_PAINT()
	ON_COMMAND(ID_HOLE_DETECT, OnHoleDetect)
	ON_COMMAND(ID_PROCFILE_SAVE, OnProcfileSave)
	ON_COMMAND(ID_PROCFILE_OPEN, OnProcfileOpen)
	ON_COMMAND(ID_TO_GRAY, OnToGray)
	ON_COMMAND(ID_INTENSITY, OnIntensity)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgMeasure message handlers

CScrollBar* CDlgMeasure::GetScrollBarCtrl(int nBar) const
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CDialog::GetScrollBarCtrl(nBar);
}



BOOL CDlgMeasure::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}





void CDlgMeasure::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CWnd *pWnd=GetDlgItem(IDC_SHOWFRAME);
	CDC *pDC=pWnd->GetDC();
	pWnd->Invalidate ();
	pWnd->UpdateWindow ();
    if(m_hDIB!=NULL)
 	{
 		LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL)m_hDIB);
 		
 	// 获取DIB宽度
 	int cxDIB = (int) m_clsDIB.DIBWidth(lpDIB);
 		
 		// 获取DIB高度
 		int cyDIB = (int) m_clsDIB.DIBHeight(lpDIB);
 
 		::GlobalUnlock((HGLOBAL)m_hDIB);
 		
 	    CRect rcDIB;
    	rcDIB.top = rcDIB.left = 0;
 		rcDIB.right = cxDIB;
 		rcDIB.bottom = cyDIB;
 	   	CRect rcDest;
 		rcDest=rcDIB;
 		m_clsDIB.PaintDIB(pDC->m_hDC,&rcDest,m_hDIB,&rcDIB,m_palDIB);
 	}

}

void CDlgMeasure::InitDIBData()
{
if (m_palDIB != NULL)
	{
		// 删除调色板对象                                                                                    
		delete m_palDIB;

		// 重置调色板为空
		m_palDIB = NULL;
	}
	
	// 如果DIB对象为空,直接返回
	if (m_hDIB == NULL)
	{
		// 返回
		return;
	}
	
	LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) m_hDIB);
	
	// 判断图像是否过大(INT_MAX:2,147,483,647)
	if (m_clsDIB.DIBWidth(lpDIB) > INT_MAX || m_clsDIB.DIBHeight(lpDIB) > INT_MAX)
	{
		// 解锁DIB对象	// 释放DIB对象
		::GlobalUnlock((HGLOBAL) m_hDIB);
		
		// 释放DIB对象
		::GlobalFree((HGLOBAL) m_hDIB);
		
		// 设置DIB为空
		m_hDIB = NULL;
		
		CString strMsg;
		strMsg = "BMP图像太大!";
		
		// 提示用户
		MessageBox(strMsg,"系统提示",MB_ICONINFORMATION|MB_OK);
		
		// 返回
		return;
	}
}





BOOL CDlgMeasure::Create()
{
	return CDialog::Create(CDlgMeasure::IDD);
}

void CDlgMeasure::OnHoleDetect() 
{
		
  /*
	HDIB htemp=m_clsDIB.XTo256(m_hDIB);
	// 解锁DIB对象	
	::GlobalUnlock((HGLOBAL)m_hDIB);
    // 释放DIB对象
	::GlobalFree ((HGLOBAL)m_hDIB);
	m_hDIB=(HDIB)m_clsDIB.CopyHandle((HGLOBAL)htemp);

    if(m_hDIB==NULL)
	{
		AfxMessageBox("转换失败!");
		return;
	}


	::GlobalUnlock(htemp);
    ::GlobalFree ((HGLOBAL)htemp);
    
	//创建点处理CPointPro类对象m_hDIB
	CGrayProc PointOperation;
	
	BeginWaitCursor();
  if(  PointOperation.HoleDetect(m_hDIB)==FALSE)
	  AfxMessageBox("holedetect is false!");
	EndWaitCursor();
    Invalidate();
	UpdateWindow();
*/
	
}



void CDlgMeasure::OnProcfileSave() 
{
    CString strPathName;
	CFile file;
    CString strSaveFileType = "位图文件 (*.bmp;*.dib)|*.bmp; *.dib|All Files (*.*)|*.*||";
    CFileDialog FileDlg(FALSE, "*.bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strSaveFileType);

	if( FileDlg.DoModal() == IDOK )
	{
	   strPathName = FileDlg.GetPathName();
	   
	     // 打开文件
	    file.Open(strPathName, CFile::modeCreate|CFile::modeWrite);
	
		// 尝试调用ReadDIBFile()读取图像 
		BOOL bSuccess=m_clsDIB.SaveDIB(m_hDIB, file);
		if (!bSuccess)
		{
		// 保存失败,可能是其它格式的DIB,可以读取但是不能保存
		// 或者是SaveDIB函数有误

		// 提示出错
		AfxMessageBox("cannot create the file to save");
		return;
		}
	    file.Close();
 
	}	
}

void CDlgMeasure::OnProcfileOpen() 
{
    CString strPathName;
	CFile file;
    char szFilter[] = "位图文件(*.BMP)|*.BMP|";

	CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter );

	if( FileDlg.DoModal() == IDOK )
	{
		 strPathName = FileDlg.GetPathName();
	   
	     // 打开文件
	     file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite, NULL);
	
		// 尝试调用ReadDIBFile()读取图像 
		m_hDIB = m_clsDIB.ReadDIBFile(file);
	    // 初始化DIB
        InitDIBData();
	
	}
    //刷新
	Invalidate();
	UpdateWindow();	
}

void CDlgMeasure::OnToGray() 
{
	CGrayProc PointOperation;
	BeginWaitCursor();
    PointOperation.ToGray(m_hDIB);
	EndWaitCursor();
    Invalidate();
	UpdateWindow();
}

void CDlgMeasure::OnIntensity() 
{
// 循环变量
	int i;
	// 各颜色分量的灰度分布密度[256]
	int* fPs_Y;
	// 计算灰度分布密度
	 CGrayProc clsGrayProc;
	fPs_Y=clsGrayProc.GetIntensity(m_hDIB) ;
	
	
	CDlgIntensity dlg;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_Y[i];

	// 显示面板
	
		//显示对话框
	if ( dlg.DoModal() != IDOK)
		return;

	delete [] fPs_Y;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -