图像处理中的特征选择和匹配是很重要的,它关系到你的整个系统的性能,具体的那种匹配算法较快较好,各大牛们都有自己的改进算法,本次的记录内容主要是将怎样将两幅图片中的对应点进行连线的问题,此问题虽不大但也困扰了我一会,先将其记录如下,已给需要的人些许指点:
1.首先通过特征的选择和匹配,我已经在两幅图片中标记出了匹配的关键点,如图所示
2.接下来的任务式将两幅图中相对应的关键点进行连线,来考察匹配的准确度,匹配代码如下:
//特征点连线
CClientDC dc(this);
CPoint point1 ;
CPoint Point2 ;
CRect rectL,rectR;
GetDlgItem(IDC_SHOW_IMAGE1)->GetWindowRect(rectL);//获取控件的相对于屏幕的位置
//转换为对话框上的的相对位置
ScreenToClient(rectL);
GetDlgItem(IDC_SHOW_IMAGE2)->GetWindowRect(rectR);
ScreenToClient(rectR);
CPen *pPenRed = new CPen(); //创建画笔对象
pPenRed->CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); //红色画笔
CGdiObject *pOldPen =dc.SelectObject(pPenRed);//选中当前画笔,并保存以前的画笔
代码解释
1>首先要获得当前对话框的设备,
CClientDC dc(this);
2>我定义了两个暂存的 CPoint类型的变量,用于获取两幅图像中对应点的坐标,
3>下面就是活的图片控件的顶点的坐标,并且将其转换为用户坐标即是在对话框中的坐标,那么在图像1中的点加上左顶点的坐标就是它在对话框界面中的坐标了,同理,图片2中的点的坐标加上图片2的左顶点坐标,就得到他在全局的坐标,代码如下
for( int index = 0 ; index < matchs.size() ; index++ )
{
int i = matchs[index].i ;
int j = matchs[index].j ;
//绘制图像1中的关键点方形
SIFT::DrawMatch( GetDlgItem(IDC_SHOW_IMAGE1)->GetDC(), descriptors1[i].x(), descriptors1[i].y() ) ;
SIFT::DrawMatch( GetDlgItem(IDC_SHOW_IMAGE2)->GetDC(), descriptors2[j].x(), descriptors2[j].y() ) ;
point1.x = descriptors1[i].x();
point1.y = descriptors1[i].y();
Point2.x = descriptors2[j].x();
Point2.y = descriptors2[j].y();
//绘制匹配特征点的连线
dc.MoveTo(Point2+ rectR.TopLeft());
dc.LineTo(point1 + rectL.TopLeft());
}
连线效果如图: