pcl中ransac提取直线_复杂场景中的一个图像配准思路

在很多时候,我们可能需要使用到图像的识别与配准工作,来判断某个特征或者是划出某个特定特征的位置。现在的深度学习已经能够比较好地解决这个问题,比如常见的YOLO,可以利用几行设定代码就能够划出所需要识别的位置。但是精准度可能会有所偏差,因为在训练过程中使用的样例往往是被经过卷积处理学习的,许多特征点在这过程中可能会消失,并且池化之后以另一种方式进行学习和识别。也就是说许多模式识别的方法重在识别,所以在细节匹配上可能不太适用(例如通过匹配LOGO上的某一点来推算出其位置)。而本文所分享的是一种较为精确的配准方式,可以通过先验条件来推导诸如LOGO在场景中的具体坐标等问题。

关键词:机器视觉 机器学习 图像配准

1 类模型的构建思路

1.1      图像特征的提取算子

目前常用的三种提取特征的方法有surf算子,fast算子和sift算子,在目前版本的opencv中还集成了orb算子,但是这种算子主要是对fast算法的一种优化版本,所以不再讨论。其中论运算速度而言,fast>surf>sift,但是sift算子的提取特性最好,能拥有比较好的尺度一致性和旋转一致性,能够较好的保留特征,但是在很多情况下作为sift算法的改良版本surf算法也可以替代sift,以提高运算效率。但是为了实现思路的可行性验证,先使用了效果最好的SIFT算法进行项目的运用。

Sift算法的核心是构建了比例空间(Scalespace),来保证了尺度一致性,这也是它提取特征优于别的算法,运行速度相对较慢的主要原因。而它所运用的尺度空间是通过构造高斯金字塔来进行构造的,通过对比金字塔上下左右的像素块来进行特征像素的提取,并且运用了泰勒展开的来进行插值拟合真正的特征像素值和位置。随后去除不稳定的边缘响应,最后对于每一个特征点都存在有八个方向的梯度大小,利用尺度空间和高斯分布提取到特征点在其他尺度空间的八个方向的梯度大小,组成了一个描述子,这个描述子为4*4*8 = 128个数字向量。

SIFT的详细原理可以参考博客:

https://blog.csdn.net/u010440456/article/details/81483145

作为SIFT的优化算法,SURF的原理可以参考博客:

https://blog.csdn.net/dcrmg/article/details/52601010

1.2      图像特征的配准

在配准中所使用的算法在opencv中也有集成,常用的主要有Brute Force,又称为暴风算法,以及FLANN算法,即最邻近寻找法。

暴风算法是将两幅图中所有的描述子都尽可能地进行比对,选出最具接近的两个描述子进行配对,但是这样的做法会更慢。FLANN算法是SIFT算法的提出者Lowe提出的,FLANN算法则是找出与描述子最接近的两个描述子进行比对,当次近距离大于最近距离的某个比例阈值时,则认为其中最近的描述子与原图描述子配对成功,并且在进行开发的时候,这种算法更具有可操作性,能够修改阈值或者是调用源码来与其他函数进行交互。所以在项目中使用了FLANN作为核心的匹配算法。

FLANN的核心在于聚类,聚类是机器学习中一个比较重要的领域。而FLANN所用到的聚类则是基于随机k-d树,和kmeans方法。K-d树在于随机将描述子进行划分,而kmeans则在于将描述子与最近的节点进行归类,这种方法相较于单纯的kmeans而言会更加具有效率。

关于FLANN算法的具体原理和基础使用可以参考博客:

https://blog.csdn.net/cshilin/article/details/52107580

1.3 类模型的描述

这里所说的类模型指的是用于作为匹配的原图LOGO,也就是说,在项目中会使用该模型与场景相比对,来匹配出场景中的LOGO。这个机器学习的思路参考论文:《Logo localization and recognition in natural images using homographic class graphs》

在这个思路中,我们需要训练处这样一个类模型。在这之中,训练集主要来源于视频中截取下来的logo或者是线下拍摄的logo,并且注意要从不同角度进行拍摄以提供学习,同时注意在拍摄过程中,相邻角度不宜变化太大,也就是说当想要拍摄小角度时,需要从大角度的视角多采集几组图片变化到小角度,否则会影响到学习的效率。

根据不同的两张图片,它们之间从理论上而言,存在有一个透视矩阵将其连接起来,并且理想情况下,它们的相互变换的两个透视矩阵应互相为逆矩阵,将一张图片映射到另一张图片上的透视矩阵称为单应性矩阵(homograph matrix),这个矩阵为一个3×3的矩阵,对应着旋转、平移和透视,并且右下脚的元素为1,所以在进行透视变换的时候需要有四对点来进行单应性矩阵的求解。而这四对点则主要是通过FLANN成功配对的四对点,而为了降低错误匹配带来的误差,同时使用了RANSAC算法来进行矩阵的求解,同时进一步筛选掉FLANN中错误的点。

RANSAC为随机一致性采样,核心在于迭代随机选择4对特征点来进行直接的线性变化(DLT)来确定单应性矩阵,通过不断地迭代,将FLANN所匹配出来的点分为内点和外点。拿二维采样变量x,y来举例子,RANSAC相当于不停地对x,y进行拟合,最后拟合出一条直线,并且将远离直线的点判断为外点,贴近直线的点为内点。

RANSAC的原理可以参考博客:

https://blog.csdn.net/weixin_43795395/article/details/90751650?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

在匹配训练模型的时候,将匹配阈值设置得小一些,以匹配出更具有代表性的点。利用两两图片之间的单应性矩阵,可以判断出两张图片之间是否相连,也就是是否能够互相进行投影变换,在进行程序操作之后,有可能出现两张图片之间不存在单应性矩阵的情况。将图片进行两两连接,保证每张图都能够相互连接上之后,绘制出logo之间的互连图,选取连接数最多的图像作为中心图像,然后找出各个图像离中心图像的最短路径,并且需要遍历所有logo,以确定所有的logo都与中心图像能够直接或者间接的连接(注意路径不宜太长,否则会累计误差,在测试中的最长路径为3,此时已经产生了较大的误差)。

将经过RANSAC之后被确定为的内点称为‘好点’,将‘好点’通过路径映射到中心图像上,构成类模型,同时注意要将这些‘好点’的描述子进行统计和综合。

最后的匹配结果如下:

e59f65f88dc15c7b59cd22b8c146d8f6.png69c7bd7b88227fffc3be81a93442abfc.png

在视频中的某帧表现:

4da8f1816b59fa3d3985437b210c5019.png

可以看见这种方式对匹配确实有着较好的效果,同时在调试过程中发现,训练过程中LOGO越大,训练效果越好,描述子更清晰,特征更明显;匹配过程中,场景图像的尺寸越大,匹配效果越好,能够匹配更清晰的特征。同时当角度太小或者光照弱时,很可能无法配对成功,会出现误匹配。

同时在光照很弱的时候,对比度不清晰的时候,需要对logo区域进行图像增强处理,在调试过程中主要尝试了线性变换、直方图正规化、伽马变化、全局直方图均衡、自适应直方图均衡化和拉普拉斯图像锐化,其中使用直方图正规化结合线性变换的效果最好,并且能够进行循环处理。

2 官方logo模型

除了自己拍摄的一些图像之外,利用一些较为准确的官方LOGO图像,能够更加精确地算出logo上的匹配点到边框的距离,能够更精准地换算出机器人的位置。

同时参考上述训练的思路,利用官方LOGO进行各种角度的透视变换,能够减少由于路径长度而导致单应性矩阵误差累积的情况,对于不同模型上的映射点能够更准确地投射到中心模型上,而此处的中心模型选用所提供的官方LOGO正视图。

8c15958b4860b5d3c5e54922a8a48fa2.png

得到类模型如下:

05946134532cde380fecf0da4a0942be.png

最后将上图中不同LOGO图片中检测到的特征点整合到了官方的LOGO图上,得到了官方logo模型。但是这个模型上特征点太多,容易出现场景的误匹配。可以在检测的时候对于每个LOGO的图片都只保留特征最明显的前几个点来减少模型上的特征点。

3      场景区域检测范围优化

在匹配过程中会发现,对场景的检测会很慢,主要是摄取场景的清晰度高、尺寸大、特征点较多,而框选出一定的区域来进行检测和匹配能够大幅提升特征检测速度和匹配速度。

可以根据卡尔曼滤波或者是其他方式来综合修正矩形框的位置,或者是改变所截取的模板,例如做出灰度直方图来将除框选出来的范围外,填充上框内的平均灰度值以降低框的边缘对于检测的影响,也可以增加匹配的准确率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员必知的10个C语言技巧

点击蓝字关注我们硬件设计师最常见的工作内容,就是通过写代码来测试硬件。这10个C语言技巧(C语言仍然是常见的选择)可以帮助设计师避免因基础性错误而导致某些缺陷的产生,并造成维护方面的困扰。为了成功的推出一个产品&#xff0…

一万字详解C语言中长度为零的数组

点击蓝字关注我们零长度数组概念:众所周知, GNU/GCC 在标准的 C/C 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下:struct Packet {int state…

app访问java web_Java Web App体系结构

app访问java web我曾经利用Servlet,JSP,JAX-RS,Spring框架,Play框架,带有Facelets的JSF和一些Spark框架。 以我的拙见,所有这些解决方案都远非面向对象和优雅的。 它们都充满了静态方法,不可测试…

电路中滤波电容和退耦电容_详解电源滤波电路中的高频滤波电容电路

图2-12所示是电源滤波电路中的高频滤波电路。电路中,一个容量很大的电解电容C1(2200F)与一个容量很小的电容C2(0.01F)并联,C2是高频滤波电容,用来进行高频成分的滤波,这种一大一小两个电容相并联的电路在电源电路中十分常见。1.高…

计算机驱动空间不够,Win8.1系统如何释放驱动器空间解决可用空间不足问题

现在越来越多用户安装升级win8.1系统,在操作使用过程中难免遇到一些奇奇怪怪的问题。相信有很多win8.1系统用户会遇到电脑的可用空间不足的提示,用户感到很疑惑,自己的电脑又没装什么软件怎么会这么提示。有什么办法可以解决此问题&#xff0…

C/C++ 中公认的三个难点

点击蓝字关注我们C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块“难啃的硬骨头”几乎是公认级别的。0x01 指针指针公认最难理解的概念,也是让很多初学者选择放弃的直接原因。指针之所以难理解,因…

python 字符串分割_如何使用python语言split方法对不同字符串分割

在JavaScript中,可以使用split()将字符串分割成字符串数组;而在python语言中,split()方法也可以将字符串进行分割,分割之后的结果放置在列表中。下面利用几个实例说明split()方法的用法,操作如下:工具/原料…

java 拼图_功能项目拼图将Java 9引入

java 拼图因此,拼图项目...我们已经对此颇为了解,但尚未看到计划如何兑现其承诺的细节。 这篇文章将精确地做到这一点,并介绍项目的核心概念和功能。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序(不同于…

win7 蓝牙4.0 ble驱动_初识物联网无线通信技术之蓝牙4.0BLE协议栈

[本文属原创,转载请附上原文出处链接。]一、需要的软件工具1、BLE协议栈(BLE-CC254x-1.4.0)2、IAR开发软件(IAR Embedded Workbench8.20.2)注:1.4.0协议栈使用8.20.2的iar版本,1.3.2协议栈等使用的是8.10.4的iar版本。二、BLE协议栈安装目录下…

C语言:谈谈指针!

点击蓝字关注我们指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针?指针解决了一些编程…

C/C++ 中的 #pragma once 作用是什么?

点击蓝字关注我们1、#pragma once有什么作用?为了避免同一个头文件被包含(include)多次,C/C中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。在能够支持这两种方式的编译器上,…

python做大数据的框架_Python+大数据计算平台,PyODPS架构手把手教你搭建

原文链接:http://click.aliyun.com/m/13965/ 在2016年10月的云栖社区在线培训上,来自阿里云大数据事业部的秦续业分享了《双剑合壁——Python和大数据计算平台的结合实战》。他主要介绍了数据分析和机器学习的方法、DataFrame整体架构以及基础API、前端、…

武魂觉醒s系列服务器,[多线]星河斗罗——新服开荒丨高程度剧情还原丨3D坐骑丨魂环丨武魂觉醒[1.12.2]...

[服务器介绍]星河斗罗 全新原创开荒斗罗大陆服务器前言:超高还原小说真实性,独特的武魂贴图,魂兽建模,坐骑建模,开放性冒险地图,让您更加体验斗罗大陆的真实性。进服送新手大礼包:装备&#xff…

C++ 的万能头文件,你知道多少?

点击蓝字关注我们C 中万能头文件 bits/stdc.h 的介绍很多小伙伴估计看有的代码会碰见没有多余的其它头文件比如 algorithm、cmath、iostream 而是用了一行 #include<bits/stdc.h> 这样的头文件并感到诧异&#xff0c;想这是什么。其实这是一个包含了 C 所有头文件的一个头…

pytorch dataset读取数据流程_高效 PyTorch :如何消除训练瓶颈

加入极市专业CV交流群&#xff0c;与 10000来自港科大、北大、清华、中科院、CMU、腾讯、百度 等名校名企视觉开发者互动交流&#xff01;同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总&#xff0c;行业技术交流。关注 极市平台 公众号 &#xff0c;回复 加群&…

APP 文档服务器,app服务器

app服务器 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。调用接口出错后&#xff0c;将不会返回结果数据。调用方可根据每个接口对…

需求最高的8种编程语言

点击蓝字关注我们在过去的 8 个月时间里&#xff08;从 2021 年 10 月到 2022 年 6 月&#xff09;&#xff0c;DevJobsScanner 分析了超过 700 万份开发者工作需求&#xff0c;得出了目前行业需求量最高的 8 种编程语言。需要注意的是&#xff0c;在这 700 万份工作需求中&…

java面包屑实现_在Java中实现过滤器和面包店锁

java面包屑实现为了了解锁的工作原理&#xff0c;实现自定义锁是一种好方法。 这篇文章将展示如何在Java上实现Filter和Bakery锁&#xff08;自旋锁&#xff09;&#xff0c;并将它们的性能与Java的ReentrantLock进行比较。 过滤器锁和面包房锁满足互斥并且也是无饥饿算法&…

postman 怎么调试pos_SpringBoot|第十五章:基于Postman的RESTful接口测试

前言从上一章节开始&#xff0c;接下来的几个章节会讲解一些开发过程中配套工具的使用。俗话说的好&#xff0c;工欲善其事&#xff0c;必先利其器。对于开发人员而言&#xff0c;有个好用的工具&#xff0c;也是一件事半功倍的事&#xff0c;而且开发起来也很爽&#xff0c;效…

这几个C语言关键字你真的得懂(深度解剖)

点击蓝字关注我们1、什么是语句&#xff0c;表达式&#xff1f; 在C语言中 &#xff0c;凡是以分号隔开的就是一条语句&#xff1a;printf("hello world\n");a 1 2; ; (空语句)什么是表达式呢&#xff1f;C语言中&#xff0c;用各种操作符把变量连起来&#xff0c;…