图像特征点匹配之两幅图像中的对应关键点连线

图像处理中的特征选择和匹配是很重要的,它关系到你的整个系统的性能,具体的那种匹配算法较快较好,各大牛们都有自己的改进算法,本次的记录内容主要是将怎样将两幅图片中的对应点进行连线的问题,此问题虽不大但也困扰了我一会,先将其记录如下,已给需要的人些许指点:

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

连线效果如图:



  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值