[ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法

这篇具有很好参考价值的文章主要介绍了[ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文只发布于利用OpenCV实现尺度不变性与角度不变性的特征找图算法和知乎

一般来说,利用OpenCV实现找图功能,用的比较多的是模板匹配(matchTemplate)。笔者比较喜欢里面的NCC算法。但是模板有个很明显的短板,面对尺度改变,角度改变的目标就无能为力了。因此本文旨在做到模板匹配做不到的这两点上。

当然也有人利用模板匹配实现上面的功能,但是方法之无语,效率之低下让我不禁想起了三体中的一句话:

“成吉思汗的骑兵,攻击速度与二十世纪的装甲部队相当;北宋的床弩,射程达一千五百米,与二十世纪的狙击步枪差不多;但这些仍不过是古代的骑兵与弓弩而已,不可能与现代力量抗衡。基础理论决定一切,未来史学派清楚地看到了这一点。而你们,却被回光返照的低级技术蒙住了眼睛。你们躺在现代文明的温床中安于享乐,对即将到来的决定人类命运的终极决战完全没有精神上的准备。”

本文并不涉及ORB或者BEBLID算法的具体实现,想了解的同学请移步论文。本文撰自一名非计算机系大一新生,有不到处还请见谅。

从特征匹配开始

特征匹配首先是需要获得特征点。通过特征检测算法,获得特征点后利用匹配器,或是计算汉明距离或是计算余弦距离,将两个图上的点连接在一起。

[ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法

看笔者往期文章浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件,在这篇文章中用的是SURF算法。但是这个算法并不支持角度不变性。

笔者在阅读OpenCV-mobilereadme的时候意外了解到ORB算法。简单查找一下资料,了解到ORB(Oriented FAST and Rotated BRIEF)算法满足以下特点

  • 支持尺度不变性和角度不变性
  • 速度很快,甚至比特征匹配(NCC)还快(i9 13900hx)
  • 开源,免费,无专利
  • 目前最快速稳定的特征点检测和提取算法

ORB = Oriented FAST(特征点) + Rotated BRIEF(特征描述)

From https://zhuanlan.zhihu.com/p/91479558

在2020年提出了一个效果更好也更快的特征描述算法Boosted Efficient Binary Local Image Descriptor(笔者不清楚他算法这有没有专利,但是这个算法在nonfree里,如果需要商业化请慎用,或者替换回BRIEF算法)

代码实现
cv::Ptr<cv::ORB> orb = cv::ORB::create(nKeypoints); //寻找nKeypoints个特征点
cv::Ptr<cv::xfeatures2d::BEBLID> beblid = cv::xfeatures2d::BEBLID::create(0.75f, cv::xfeatures2d::BEBLID::SIZE_256_BITS);//用256个比特来描述特征

std::vector<cv::KeyPoint> src_keypoints, target_keypoints;
cv::Mat src_descriptors, target_descriptors;

orb->detect(src_mat, src_keypoints);
orb->detect(target_mat, target_keypoints);

beblid->compute(src_mat, src_keypoints, src_descriptors);
beblid->compute(target_mat, target_keypoints, target_descriptors);

cv::BFMatcher matcher(cv::NORM_HAMMING, true);//利用汉明距离的匹配器

std::vector<cv::DMatch> matches;
matcher.match(target_descriptors, src_descriptors, matches);

std::vector<cv::Point2d> matched_target, matched_src;
for(auto &match : matches)
{
    if(match.distance > max_distance)
        break;
    
	matched_target.push_back(target_keypoints[match.queryIdx].pt);
	matched_src.push_back(src_keypoints[match.trainIdx].pt);
}

这里创建了ORB和BEBLID对象,并且对目标图片完成了匹配,将彼此能够匹配的点对应存放到了matched_targetmatched_src里。

从透视变换继续

虽然我们这里成功建立了模板图和目标图的特征点对点关系,然而,很多时候我们想要的是特征匹配提供的那种更为直接的反映在目标图里的坐标。

如何将离散的的点集转换为模板在目标图上的大致区域,成了我们需要解决的一个问题。这里我使用的方法是findHomographyperspectiveTransform

  • findHomography 计算多个二维点对之间的最优单映射变换矩阵H(3行3列)。使用最小均方误差或RANSAC方法。比较好解释的是最小均方误差方法,但是为了效果笔者用的是RANSAC方法。关于这个矩阵作用,大家可以去B站上看3blue1brown的系列视频《线性代数的本质》。我们获取到这个矩阵,就可以估计出模板图怎么变化到目标图上。同理模板的四个角的坐标也可以通过这个矩阵变换到目标图上的坐标,就得到了模板在目标图上的大致位置和边界。

  • perspectiveTransform 透视变换,就是完成坐标的变换过程。

代码实现
cv::Mat H = cv::findHomography(matched_src, matched_target, cv::RANSAC);

std::vector<cv::Point2f> obj_corners(4);
obj_corners[0] = cv::Point2f(0, 0);
obj_corners[1] = cv::Point2f((float)target_mat.cols, 0);
obj_corners[2] = cv::Point2f((float)target_mat.cols, (float)target_mat.rows);
obj_corners[3] = cv::Point2f(0, (float)target_mat.rows);

std::vector<cv::Point2f> buf_corners(4);

cv::perspectiveTransform(obj_corners, buf_corners, H);

效果展示

[ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法

缩放 压扁 旋转
[ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法 [ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法 [ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法

可以发现实现的效果非常好。

还能更强?

这里只实现了单个目标的检测匹配,事实上这个算法不止步于此,我们可以使用KMeans算法,实现对于一个图片上多个目标一次检测。也可以多个图片同时匹配。但是鉴于时间,和笔者不容乐观的数学分析成绩,以及即将到来的数论期中考试,为了不被踢出强基计划,下次有时间再说吧。文章来源地址https://www.toymoban.com/news/detail-746485.html

到了这里,关于[ORB/BEBLID] 利用OpenCV(C++)实现尺度不变性与角度不变性的特征找图算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV实战——尺度不变特征检测器

    特征检测的不变性是一个重要概念,虽然方向不变性(即使图像旋转也能检测到相同特征点)能够被简单特征点检测器(例如 FAST 特征检测器等)处理,但难以实现在图像尺度改变时特征保持不变。为了解决这一问题,在计算机视觉中引入了尺度不变特征的概念。 无论对象是在哪

    2023年04月20日
    浏览(30)
  • 基于opencv4.5多目标/多角度与多尺度模板匹配(含源码)

    在OpenCV中有个用于模板匹配的基本函数matchTemplate(),该函数使用某模板在搜索图像中进行搜索时,只能搜索到和模板完全一样的地方,一旦在搜索图像中要搜索的区域相较于模板是旋转了、放大缩小了或者部分遮掩了就无法匹配到结果了,实际项目应用不太友好. 本文主要介绍

    2024年02月02日
    浏览(46)
  • Opencv特征检测之ORB算法原理及应用详解

    特征是图像信息的另一种数字表达形式。一组好的特征对于在指定 任务上的最终表现至关重要。 视觉里程 (VO) 的主要问题是如何根据图像特征来估计相机运动。但是,整幅图像用来计算分析通常比较耗时,故而转换为分析图像中的特征点的运动。 计算机视觉领域的研究者

    2024年02月12日
    浏览(36)
  • python opencv orb特征点提取匹配然后图像拼接

    opencv 基于ORB特征点图像拼接_特征点 warpperspective-CSDN博客 图像用这儿的 右边多出了一部分黑色的,应该是重复部分的宽

    2024年01月19日
    浏览(33)
  • 利用OpenCV光流算法实现视频特征点跟踪

            光流(optical flow)是运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。通常将二维图像平

    2024年02月12日
    浏览(25)
  • Opencv 之ORB特征提取与匹配API简介及使用例程

    ORB因其速度较快常被用于视觉SLAM中的位姿估计、视觉里程、图像处理中的特征提取与匹配及图像拼接等领域 本文将详细给出使用例程及实现效果展示 创建 检测 计算 检测与计算 绘制特征点 绘制匹配点对 讲述特征点提取与描述子计算,实现如下: 暴力匹配实现: 其效果如

    2024年02月13日
    浏览(30)
  • opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)

    在计算机视觉领域,从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是 ORB(Oriented FAST and Rotated Brief)特征检测器和描述符。ORB 由 Ethan Rublee 等人开发,结合了两种现有技术的优势——FAST(加速分段测试特征

    2024年02月11日
    浏览(25)
  • 特征点的检测与匹配(ORB,SIFT,SURFT比较)[opencv-python]

    本文旨在总结opencv-python上特征点的检测和匹配。 1、特征点的检测(包括:ORB,SIFT,SURFT) 2、特侦点匹配方法 (包括:暴力法,FLANN,以及随机抽样一致性优化RANSAC算法) 注:由于SURF专利问题,所以opencv官方包目前不支持SURF但支持ORB和SIFT,安装opencv-contrib-python包就可以解决 一

    2024年02月06日
    浏览(35)
  • CoTracker 环境配置&与ORB 特征点提取结合实现视频特征点追踪

    Meta 新开源 CoTracker :跟踪任意长视频中的任意多个点,并且可以随时添加新的点进行跟踪!并且性能上直接超越了谷歌的 OmniMotion 。 我所做的项目是对相机捕获的图像进行实时追踪。当时没有研究过这个网络,所以想着配一下环境,看看后续可不可以应用在相机上。 但是:

    2024年02月03日
    浏览(27)
  • 多尺度模板匹配(openCV实现find_scaled_shape_model)

            一直在写基于形状的模板匹配(仿照halcon,cognex),我们知道任意的二维仿射变换可以分解为以下几种变换:缩放变换(用不同比例因子分别对图像X轴Y轴进行缩放)、倾斜变换(X轴保持固定的情况下,Y轴相对于X轴旋转角度θ)、旋转变换(X轴Y轴同时旋转角度Φ)

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包