一个量测同名点的程序是图像几何定向的必要准备,为此我们开发了ImageMeasuringApparatus(图1),它是一款用来进行双像立体量测的程序,其功能有:
1、 影像对的显示和漫游;
2、 显示缩略图,进行手动粗定位;
3、 载入已量测点、手动亚像素级刺点。
该程序源代码(VC++)和详细的开发说明文档(.doc)已经添加在了本人的资源里,可以下载查阅。
图 1. ImageMeasuringApparatus运行界面
下面我们阐述改程序的开发方法,通过学习本方法或许有助于加强对于MFC多视图图形界面程序开发的掌握:
本程序是基于MFC的单文档应用程序,布局上采用分割窗口形式。其中涉及的主要的类有CMainFrame,CImageMeasuringApparatusDoc,CMeasuringView,CPhotoView以及CPhotoView2,另外还有一些对话框用来接收参数,原理简单此处不予介绍。
CMainFrame类主要实现了主框架窗口的分割,分割方式如图2所示。
CImageMeasuringApparatusDoc 类用来存储影像和量测点数据。
CMeasuringView类用以显示缩略图,微调视图,并响应用户微调操作。
CPhotoView和CPhotoView2类用以显示原始影像,相应用户漫游刺点等操作。
图 2 窗口分割示意图
下面通过操作实例来分析各类的关系:
1、 打开影像,显示,漫游及粗定位。
①点击菜单或工具栏打开按钮,CImageMeasuringApparatusDoc类响应该消息,打开文件对话框接收用户输入的文件路径,利用OpenCV读取左右影像数据保存于m_img_l和m_img_r,并分别转换备份一个三通道影像m_l和m_r,以便后续处理。刷新视图。
②在CPhotoView和CPhotoView2的Ondraw函数中显示CImageMeasuringApparatusDoc保存的影像,注意转换坐标将其显示到视图中心。
③点击,就转换CMainFrame中保存的布尔型变量flag_drag的值为true,在CPhotoView和CPhotoView2中添加鼠标按下,拖放和释放的消息响应函数,在CMainFrame的flag_drag为true的情况下处理用户的漫游影像操作。
④在CMeasuringView的缩略图上按下左键,要将原始影像粗定位到相应位置。为此,在其LButtonDown中将按下点位置坐标转到原始影像,设置CPhotoView或CPhotoView2的offset变量,刷新视图,实现定位。
2、 载入像点,显示像点。
①点击菜单或工具栏载入像点按钮,CImageMeasuringApparatusDoc类响应该消息,打开文件对话框接收用户输入的文件路径,读取左右影像像点数据保存在m_pt_l,m_pt_r,同时保存点数m_ptl_num和m_ptr_num。
②在CPhotoView ,CPhotoView2和CMeasuringView的m_overview_l和m_overview_r控件上实现显示像点的功能。首先像点坐标转换到这三个视图的坐标,然后在该坐标处画十字丝即可。
3、 手动刺点,微调,保存所刺像点。
①点击刺点按钮,就转换CMainFrame中保存的布尔型变量flag_cross的值为true,在CPhotoView和CPhotoView2中添加鼠标按下,拖放和释放的消息响应函数,在CMainFrame的flag_drag为true的情况下处理用户的刺点操作。
②一旦触发刺点操作,就从原始影像上汲取触发点处为中心31*31范围的像素值保存在CMeasuringView的m_ptl_lpBits和m_ptr_lpBits中。
③CMeasuringView将m_ptl_lpBits和m_ptr_lpBits像素块显示在微调视图上,当用户点击微调按钮时调整offset_l和offset_r值,重绘微调视图上的图像。
④量点完毕,按下空格键时弹出输入点号对话框,输入点号后保存该点对于CImageMeasuringApparatusDoc的m_pt_l和m_pt_r.
⑤点击保存按钮,将保存CImageMeasuringApparatusDoc的m_pt_l和m_pt_r与当前文件夹下。