亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dlgreg.cpp

?? 《Visual C++數字圖像獲取 處理及實踐應用》一書的源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// DlgReg.cpp : implementation file
//

#include "stdafx.h"
#include "ImageProcessing.h"
#include "ImageProcessingDoc.h"
#include "GlobalApi.h"
#include "DlgReg.h"
#include "DlgAftReg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgReg dialog


CDlgReg::CDlgReg(CWnd* pParent /*=NULL*/, CImageProcessingDoc* pDoc)
	: CDialog(CDlgReg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgReg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// 獲取文檔類指針
	m_pDoc = pDoc;

	// 設置計算圖象位置標志位位FALSE
	m_bCalImgLoc = FALSE;

	// 設置基準圖象為原始打開的圖象
	m_pDibInit = pDoc->m_pDibInit;

	// 設置待配準圖象
	m_pDibSamp = new CDib;

	// 設置選取特征點的數目初始值
	m_nChsFeatureNum = 0;

	// 設置選取特征點的標志位為FALSE
	m_bChoseFeature = FALSE;
}


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


BEGIN_MESSAGE_MAP(CDlgReg, CDialog)
	//{{AFX_MSG_MAP(CDlgReg)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_REG_OPEN, OnRegOpen)
	ON_BN_CLICKED(IDC_REG_REG, OnRegReg)
	ON_BN_CLICKED(IDC_REG_CHOSE_FEATURE, OnRegChoseFeature)
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgReg message handlers

void CDlgReg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// 如果還沒有計算圖象的位置,則進行計算
	if(!m_bCalImgLoc){
		CalImageLocation();
	}

	CSize sizeDisplay;
	CPoint pointDisplay;
	
	// 顯示基準圖象
	if(!m_pDibInit->IsEmpty()){
		sizeDisplay.cx=m_pDibInit->m_lpBMIH->biWidth;
		sizeDisplay.cy=m_pDibInit->m_lpBMIH->biHeight;
		pointDisplay.x = m_rectInitImage.left;
		pointDisplay.y = m_rectInitImage.top;
		m_pDibInit->Draw(&dc,pointDisplay,sizeDisplay);		
	}
	
	// 顯示待配準圖象
	if(!m_pDibSamp->IsEmpty()){
		sizeDisplay.cx=m_pDibSamp->m_lpBMIH->biWidth;
		sizeDisplay.cy=m_pDibSamp->m_lpBMIH->biHeight;
		pointDisplay.x = m_rectResltImage.left;
		pointDisplay.y = m_rectResltImage.top;
		m_pDibSamp->Draw(&dc,pointDisplay,sizeDisplay);		
	}

	// 顯示特征點與配準的特征點
	DrawFeature(&dc);	
}

/*************************************************************************
 *
 * \函數名稱:
 *   CalImageLocation()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數設置對話框中的控件位置和大小,并設置顯示圖象的位置。默認的圖象大小為352×288,如果圖象小于
 *此大小,則控件大小設置為352×288,并將圖象放置在控件中間。
 *
 *************************************************************************
 */
void CDlgReg::CalImageLocation()
{
	// 獲得控件IDC_REG_INIT_IMAGE的句柄,并獲得控件的初始位置信息
	CWnd* pWnd=GetDlgItem(IDC_REG_INIT_IMAGE);
	WINDOWPLACEMENT *winPlacement;
	winPlacement=new WINDOWPLACEMENT;
	pWnd->GetWindowPlacement(winPlacement);
	
	// 圖象寬度
	int nImageWidth;
	nImageWidth = m_pDibInit->m_lpBMIH->biWidth;

	// 圖象高度
	int nImageHeight;
	nImageHeight = m_pDibInit->m_lpBMIH->biHeight;

	
	// 調整控件IDC_REG_INIT_IMAGE的大小位置,并同時設置顯示基準圖象的位置
	if(nImageHeight > 352){
		winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;	
		m_rectInitImage.bottom = winPlacement->rcNormalPosition.bottom;
		m_rectInitImage.top    = winPlacement->rcNormalPosition.top;		
	}
	else{
		winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 352;
		m_rectInitImage.bottom = winPlacement->rcNormalPosition.top + 176 + nImageHeight/2;
		m_rectInitImage.top    = winPlacement->rcNormalPosition.top + 176 - nImageHeight/2;
	}
	if(nImageWidth > 288){
		winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
		m_rectInitImage.right = winPlacement->rcNormalPosition.right;
		m_rectInitImage.left  = winPlacement->rcNormalPosition.left;			
	}
	else{
		winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 288;
		m_rectInitImage.right = winPlacement->rcNormalPosition.left + 144 + nImageWidth/2;
		m_rectInitImage.left  = winPlacement->rcNormalPosition.left + 144 - nImageWidth/2;
	}

	// 設置IDC_REG_INIT_IMAGE控件的大小位置
	pWnd->SetWindowPlacement(winPlacement);	
			
	// 獲得顯示基準圖象控件的右邊位置,以便確認顯示待配準圖象控件的位置
	int nIniImgRight;
	nIniImgRight = winPlacement->rcNormalPosition.right;
	
	int  nIniImgLeft;
	nIniImgLeft   = winPlacement->rcNormalPosition.left;

	// 獲得IDC_REG_INIT_IMAGE控件的下邊位置,以便調整其他控件的位置
	int nIniImgBottom;
	nIniImgBottom = winPlacement->rcNormalPosition.bottom;

	// 獲得控件IDC_REG_RESLT_IMAGE的句柄,并獲得初始位置信息
	pWnd=GetDlgItem(IDC_REG_RESLT_IMAGE);
	pWnd->GetWindowPlacement(winPlacement);
	
	// 如果還未打開待配準圖象,則設置待配準圖象大小和基準圖象大小相等
	if(!m_pDibSamp->IsEmpty()){
		nImageWidth  = m_pDibSamp->m_lpBMIH->biWidth;
		nImageHeight = m_pDibSamp->m_lpBMIH->biHeight;
	}
	
	// 調整控件IDC_REG_RESLT_IMAGE的大小位置,并同時設置顯示待配準圖象的位置

	// 先調整控件的左邊位置,和IDC_REG_INIT_IMAGE控件相隔15個象素
	winPlacement->rcNormalPosition.left = nIniImgRight + 15;

	if(nImageHeight > 352){		
		winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + nImageHeight;	
		m_rectResltImage.bottom = winPlacement->rcNormalPosition.bottom;
		m_rectResltImage.top    = winPlacement->rcNormalPosition.top;		
	}
	else{
		winPlacement->rcNormalPosition.bottom = winPlacement->rcNormalPosition.top + 352;
		m_rectResltImage.bottom = winPlacement->rcNormalPosition.top + 176 + nImageHeight/2;
		m_rectResltImage.top    = winPlacement->rcNormalPosition.top + 176 - nImageHeight/2;
	}
	if(nImageWidth > 288){
		winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + nImageWidth;
		m_rectResltImage.right = winPlacement->rcNormalPosition.right;
		m_rectResltImage.left  = winPlacement->rcNormalPosition.left;			
	}
	else{
		winPlacement->rcNormalPosition.right = winPlacement->rcNormalPosition.left + 288;
		m_rectResltImage.right = winPlacement->rcNormalPosition.left + 144 + nImageWidth/2;
		m_rectResltImage.left  = winPlacement->rcNormalPosition.left + 144 - nImageWidth/2;
	}

	// 設置IDC_REG_RESLT_IMAGE控件的大小位置
	pWnd->SetWindowPlacement(winPlacement);
	
	if(nIniImgBottom < winPlacement->rcNormalPosition.bottom)
		nIniImgBottom = winPlacement->rcNormalPosition.bottom;


	nIniImgBottom = winPlacement->rcNormalPosition.bottom;
	
	nIniImgRight  = winPlacement->rcNormalPosition.right;
	
	// 設置控件IDOK的位置大小
	pWnd=GetDlgItem(IDOK);
	pWnd->GetWindowPlacement(winPlacement);
	winPlacement->rcNormalPosition.top = nIniImgBottom +15;
	winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
	pWnd->SetWindowPlacement(winPlacement);
	
	// 設置控件IDCANCEL的位置大小
	pWnd=GetDlgItem(IDCANCEL);
	pWnd->GetWindowPlacement(winPlacement);
	winPlacement->rcNormalPosition.top = nIniImgBottom +15;
	winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
	pWnd->SetWindowPlacement(winPlacement);

	// 設置控件IDC_REG_OPEN的位置大小
	pWnd=GetDlgItem(IDC_REG_OPEN);
	pWnd->GetWindowPlacement(winPlacement);
	winPlacement->rcNormalPosition.top = nIniImgBottom +15;
	winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
	pWnd->SetWindowPlacement(winPlacement);
	
	// 設置控件IDC_REG_REG的位置大小
	pWnd=GetDlgItem(IDC_REG_REG);
	pWnd->GetWindowPlacement(winPlacement);
	winPlacement->rcNormalPosition.top = nIniImgBottom +15;
	winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
	pWnd->SetWindowPlacement(winPlacement);
	
	
	// 設置控件IDC_REG_CHOSE_FEATUR的位置大小
	pWnd=GetDlgItem(IDC_REG_CHOSE_FEATURE);
	pWnd->GetWindowPlacement(winPlacement);
	winPlacement->rcNormalPosition.top = nIniImgBottom +15;
	winPlacement->rcNormalPosition.bottom = nIniImgBottom + 60;
	pWnd->SetWindowPlacement(winPlacement);

	// 調整此對話框的大小
	//pWnd = GetDlgItem(IDD_DLG_REG);
	this->GetWindowPlacement(winPlacement);
	//winPlacement->rcNormalPosition.top = nIniImgBottom +15;
	winPlacement->rcNormalPosition.bottom = nIniImgBottom + 300;
	winPlacement->rcNormalPosition.left   = nIniImgLeft   - 20;
	winPlacement->rcNormalPosition.right  = nIniImgRight  + 20;
	this->SetWindowPlacement(winPlacement);

	// 釋放已分配內存
	delete winPlacement;

	// 設置計算圖象控件位置標志位為TRUE
	m_bCalImgLoc = TRUE;
}

/*************************************************************************
 *
 * \函數名稱:
 *   DrawFeature()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數根據類的成員變量確定特征點的數目和位置,并在圖象中進行顯示。
 *
 *************************************************************************
 */
void CDlgReg::DrawFeature(CDC* pDC)
{
	// 循環變量
	int i;

	// 臨時變量
	CPoint pointTemp;

	// 半徑
	int nRadius;
	nRadius = 5;

	// 設置畫圖類型
	pDC->SelectStockObject(HOLLOW_BRUSH);

	// 聲明畫筆
	CPen penWhite(PS_SOLID,1,RGB(255,255,255));
	CPen *pOldPen;

	// 將畫筆選入,并保存以前的畫筆
	pOldPen = pDC->SelectObject(&penWhite);

	for(i=0; i<m_nChsFeatureNum; i++){
		// 首先顯示特征點
		
		// 確定此點的顯示位置
		pointTemp.x = m_pPointSampl[i].x + m_rectResltImage.left;
		pointTemp.y = m_pPointSampl[i].y + m_rectResltImage.top ;		

		// 畫出此特征點,其中園的半徑為nRadius
		CRect rectSamp(pointTemp.x-nRadius , pointTemp.y-nRadius , 
			pointTemp.x+nRadius , pointTemp.y+nRadius);
		pDC->Ellipse(rectSamp);

		// 再顯示配準特征點
		// 確定此點的顯示位置
		pointTemp.x = m_pPointBase[i].x + m_rectInitImage.left;
		pointTemp.y = m_pPointBase[i].y + m_rectInitImage.top ;		

		// 畫出此特征點,其中園的半徑為nRadius
		CRect rectBase(pointTemp.x-nRadius , pointTemp.y-nRadius , 
			pointTemp.x+nRadius , pointTemp.y+nRadius);
		pDC->Ellipse(rectBase);
	}

	// 回復以前的畫筆
	pDC->SelectObject(pOldPen);
	penWhite.DeleteObject();
}

/*************************************************************************
 *
 * \函數名稱:
 *   OnRegOpen()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數打開待配準圖象,并將圖象存放在m_pDibSamp中。
 *
 *************************************************************************
 */
void CDlgReg::OnRegOpen() 
{
	// TODO: Add your control notification handler code here
	CFileDialog dlg(TRUE,"bmp","*.bmp");
	if(dlg.DoModal() == IDOK)
	{
 
	 	CFile file;
	 
	 	CString strPathName;
 
		strPathName = dlg.GetPathName();
 
		// 打開文件
		if( !file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite))
		{
			// 返回	
			return ;
		}

		// 讀入模板圖象
		if(!m_pDibSamp->Read(&file)){
			// 恢復光標形狀
			EndWaitCursor();

			// 清空已分配內存
			m_pDibSamp->Empty();

			// 返回
 			return;
		}
	}
	
	// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的模板配準,其它的可以類推)
	if(m_pDibSamp->m_nColorTableEntries != 256)
	{
		// 提示用戶
		MessageBox("目前只支持256色位圖!", "系統提示" , MB_ICONINFORMATION | MB_OK);

		// 清空已分配內存
		m_pDibSamp->Empty();

		// 返回
		return;
	}

	// 如果打開新的待配準文件,將圖象位置設置標志位設為FALSE,以便再次調整位置
	m_bCalImgLoc = FALSE;

	// 更新顯示
	this->UpdateData();
	this->Invalidate();
}



/*************************************************************************
 *
 * \函數名稱:
 *   OnRegChoseFeatureOnRegReg()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數設置選取特征點標志位,然后調用函數在待配準圖象中選取特征點,并
 *配準這些特征點。特征點的數目至少應該選取三個。
 *
 *************************************************************************
 */
void CDlgReg::OnRegChoseFeature() 
{
	// 如果待配準圖象尚未打開,則不能進行特征點選取工作
	if((m_pDibSamp->IsEmpty())){
		AfxMessageBox("尚未打開待配準圖象文件,請打開待配準圖象");
		return;
	}
	// 設置選取特征點標志位
	m_bChoseFeature = TRUE;	
	
	AfxMessageBox("請在待配準圖象中選取特征點");
}

/*************************************************************************
 *
 * \函數名稱:
 *   OnLButtonUp()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數根據鼠標所標定的位置設置特征點。然后調用特征配準函數配準此特征點。
 *特征點的數目至少應該選取三個。
 *
 *************************************************************************
 */
void CDlgReg::OnLButtonUp(UINT nFlags, CPoint point) 
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品小仙女| 国产日产亚洲精品系列| 久久久亚洲午夜电影| 亚洲人快播电影网| 狠狠色丁香婷婷综合久久片| 91麻豆精东视频| 久久婷婷久久一区二区三区| 同产精品九九九| 国产.欧美.日韩| 欧美一级精品大片| 亚洲一区免费在线观看| www.亚洲激情.com| 久久久激情视频| 麻豆高清免费国产一区| 欧美男人的天堂一二区| 亚洲在线中文字幕| 99久久精品国产观看| 久久久国产精华| 激情久久五月天| 日韩精品一区二| 日韩av一级片| 日韩欧美一区二区三区在线| 图片区小说区国产精品视频| 欧美日韩中文另类| 亚洲一区二区欧美激情| 色婷婷av一区二区三区软件| 国产精品久久久久影院老司| 国产jizzjizz一区二区| 国产亚洲欧美一区在线观看| 国内精品写真在线观看| 欧美电影免费观看高清完整版在 | 欧美午夜一区二区三区| 17c精品麻豆一区二区免费| 成人精品国产一区二区4080| 国产精品视频看| 成人高清视频在线| 亚洲人123区| 在线观看成人免费视频| 午夜在线成人av| 欧美一区日本一区韩国一区| 秋霞影院一区二区| 日韩视频免费观看高清完整版 | 欧美日韩精品一区二区三区蜜桃| 亚洲精品中文在线影院| 在线观看欧美黄色| 视频一区二区不卡| 日韩三级精品电影久久久 | 五月天亚洲精品| 欧美一区二区福利视频| 久久99国产精品尤物| 久久久久国产一区二区三区四区| 国产.欧美.日韩| 一区二区三区中文免费| 欧美一区二区三区免费在线看| 久久99精品久久久久久国产越南 | 色综合久久88色综合天天6| 一区二区三区免费| 欧美一级高清大全免费观看| 国精产品一区一区三区mba视频| 国产女主播一区| 在线观看日韩毛片| 久久精品国产亚洲高清剧情介绍 | 亚洲欧洲精品一区二区精品久久久| 色综合久久久久久久久| 久久精品国产99国产| 国产精品久久久久久久第一福利| 91国产丝袜在线播放| 久久国产尿小便嘘嘘尿| 中文字幕一区三区| 日韩视频在线你懂得| 99re6这里只有精品视频在线观看| 亚洲国产精品久久艾草纯爱| 久久久久亚洲综合| 欧美美女一区二区在线观看| 国产精品亚洲第一| 日韩av一区二| 亚洲精品国产a| 久久综合给合久久狠狠狠97色69| 91一区二区在线观看| 精品一区二区精品| 亚洲午夜免费福利视频| 国产精品丝袜一区| 日韩三级高清在线| 欧美日韩另类一区| 99久久国产免费看| 国内成人精品2018免费看| 亚洲一区二区在线视频| 国产欧美精品日韩区二区麻豆天美| 欧美日韩高清影院| 日本精品一级二级| 国产成人三级在线观看| 韩国理伦片一区二区三区在线播放| 一区二区三区欧美在线观看| 国产日产欧美一区二区三区| 欧美一区二区三区精品| 在线一区二区三区做爰视频网站| 福利一区在线观看| 极品少妇xxxx精品少妇| 婷婷综合在线观看| 亚洲国产一区二区三区青草影视| 中文字幕一区在线| 国产精品嫩草影院com| 日韩欧美你懂的| 欧美夫妻性生活| 欧美精品一级二级| 欧美自拍丝袜亚洲| 91免费视频观看| 99久久777色| 国产91对白在线观看九色| 国产精品亚洲第一| 大尺度一区二区| 国产一区二区调教| 国产乱国产乱300精品| 精品一区二区日韩| 国产在线精品一区二区夜色 | 久久综合网色—综合色88| 这里只有精品免费| 日韩欧美卡一卡二| 精品国产乱码久久久久久免费 | 国产真实乱对白精彩久久| 国内一区二区在线| 国产999精品久久久久久| 国产精品一区二区免费不卡 | 国内久久精品视频| 国产成人免费视频网站| 国产精品资源站在线| 福利一区二区在线| 91香蕉视频污在线| 欧美亚洲高清一区| 6080yy午夜一二三区久久| 欧美男女性生活在线直播观看| 91精品国产综合久久精品app | 欧美精品xxxxbbbb| 日韩免费观看高清完整版| 欧美极品美女视频| 亚洲夂夂婷婷色拍ww47| 免费高清视频精品| 成人三级在线视频| 欧美亚洲一区三区| 日韩欧美www| 中文字幕在线观看一区| 亚洲成人tv网| 另类小说一区二区三区| 国产成a人亚洲精| 91在线视频免费观看| 正在播放一区二区| 国产精品三级电影| 天堂成人国产精品一区| 国产成a人无v码亚洲福利| 色素色在线综合| 欧美成人性战久久| 一区二区三区在线观看网站| 奇米色一区二区| 91在线免费播放| 欧美大胆人体bbbb| 日韩美女啊v在线免费观看| 日韩精品一级二级| 成人午夜在线播放| 欧美一级久久久| 亚洲激情网站免费观看| 韩国理伦片一区二区三区在线播放| 99久久精品国产精品久久| 日韩三级免费观看| 亚洲一区精品在线| 成+人+亚洲+综合天堂| 91精品国产色综合久久久蜜香臀| 国产精品热久久久久夜色精品三区| 午夜视黄欧洲亚洲| 99久久综合精品| 久久综合国产精品| 日韩高清国产一区在线| 99国产精品久久久久久久久久 | 亚洲一区在线观看免费观看电影高清| 捆绑紧缚一区二区三区视频 | 国产亚洲一区二区在线观看| 午夜视频一区二区三区| 91蝌蚪国产九色| 日本一区二区三区在线不卡| 美女一区二区在线观看| 欧美三区免费完整视频在线观看| 中文无字幕一区二区三区| 紧缚奴在线一区二区三区| 欧美精品v日韩精品v韩国精品v| 国产精品护士白丝一区av| 韩日av一区二区| 欧美三级中文字幕在线观看| 自拍偷拍亚洲激情| 成人亚洲精品久久久久软件| 丁香婷婷综合激情五月色| 91精品在线免费| 亚洲精品成人在线| 成人av免费在线播放| 久久久久99精品国产片| 久国产精品韩国三级视频| 91精品国产欧美日韩| 天天爽夜夜爽夜夜爽精品视频| 91福利视频久久久久| 亚洲已满18点击进入久久| 色天使久久综合网天天| 国产毛片精品视频|