目前的AR需求(想要达到的目标)

公司目前的需求是要能够指定一个物体开始追踪,将一张预先准备好的图像覆盖在被追踪的物体上,

然后镜头偏转缩放各类操作,再转回来仍然可以识别到,并且同样依旧覆盖图片到先前的位置上来。

有点类似Google Camera 里内置的AR Stickers功能:

但是我们的需求不是在移动终端上实现,而是在PC上后置视频,所以不能像手机那样获取到各类陀螺仪、加速度仪和指北针等Sensors进行惯性定位式的追踪。

所以这个需求只能考虑只能依靠图像识别来实现之。

目标追踪算法

OpenCV内置提供的追踪算法有很多种,我大概把它分为三大类:

目标追踪算法、稠密(密集)光流算法、稀疏光流算法

每一类里面又有很多种算法。

1. Kalman(很古老的算法,卡尔曼滤波)
http://en.wikipedia.org/wiki/Kalman_filter

2. Meanshift(均值偏移算法)
https://en.wikipedia.org/wiki/Mean_shift

3. Camshift(是MeanShift算法的改进,称为连续自适应的MeanShift算法)
https://docs.opencv.org/4.6.0/d7/d00/tutorial_meanshift.html

4. Boosting(HAAR级联,相当于AdaBoost的在线版本,抖动很厉害,不建议使用)

5. MIL(比Boosting好,但是有遮挡不佳)
http://vision.ucsd.edu/~bbabenko/project_miltrack.shtml

6. KCF(比Boosting和MIL都要快,但是有遮挡时不佳)
http://www.robots.ox.ac.uk/~joao/publications/henriques_tpami2015.pdf
http://www.cvl.isy.liu.se/research/objrec/visualtracking/colvistrack/index.html

7. CSRT(速度比KCF慢一些,但是比KCF精确)
Lukezic_IJCV2018 Discriminative Correlation Filter

8. MedicamFlow(提供跟踪评分机制,跳动太快速可能会失效
http://www.aonsquared.co.uk/node/5

9. TLD(误报多,需跟踪、学习、检测,可解决遮挡问题,但不适合坐多行人下的跟踪)
TLD (Tracking, learning and detection)

10. MOSSE(速度块,准确性较高,遮挡下效果也还能接受)
MOSSE (Minimum Output Sum of Squared)

11. GOTURN(基于深度学习,处理遮挡效果不佳,需要提前训练好caffe模型文件)
http://davheld.github.io/GOTURN/GOTURN.pdf
https://github.com/davheld/GOTURN#train-the-tracker
https://github.com/Auron-X/GOTURN_Training_Toolkit

12. DaSiamRPN(基于深度学习,需要提前训练好onnx模型文件)
跟GOTURN类似,就是模型文件格式支持的不同。

稠密(密集)光流算法

1. Farneback(Gunnar Farneback's algorithm)

2. Variational optical flow refinement

3. DIS(Dense Inverse Search (DIS) optical flow algorithm)

稀疏光流算法

1. SparsePyrLK(Lucas-Kanade optical flow algorithm)

小试牛刀

上一章节既然说是AR,那我就用OpenCV里面提供的AR模块,来试试看能做到哪一步。

AR模块叫ArUco模块,它提供导出一些固定用于识别标定(标记)的函数。

cv::aruco::getPredefinedDictionary()

再使用cv::aruco::drawMarker()加入不同ID参数和想要生成图片的特定宽高的形态各不相同的二维码图片。

如下图所示:

我们将它用打印机打印出来,以便于在现实中镜头中识别。

将视频载入到识别程序中来,然后调用cv::aruco::drawDetectedMarkers()函数,它的作用就是内置了一个将所有识别出来的aruco生成的标定图自动画个框,一般用于调试。

将会得到类似下图这样:

编号左上角为1,右上角为2,右下角为3,左下角为4。

既然准确的将识别到的aruco标定图框出来了,那剩下来的当然好办了。

取一张要覆盖的照片:

将识别到的上下左右四个标定图的四个角找到(图1的左上角和图2的右上角和图3的右下角和图4的左下角)

然后使用透视变换将图片扭曲拉伸缩放透视变换到上一步四个角位置,

主要用到的函数有:cv::findHomography()  cv::warpPerspective()   cv::fillConvexPoly()

第一个函数cv::findHomography()是根据两组离散的点计算出透视变换矩阵。

第二个函数cv::warpPerspective()是使用上一步计算出来的透视变换矩阵去将图片矩阵变换成需要的样子。

第三个函数cv::fillConvexPoly()用指定颜色(白色)颜色填充多边形区域,是为了覆盖透视变换后的图片到原视频帧上需要的掩码图所做的准备的。

如下图所示:

将上一步透视变换的图片覆盖到视频帧上:

视频效果:(未加入任何追踪的版本)

改进纯aruco标定识别

上面的演示效果视频,如果您看了肯定会觉得在被遮挡的时候,效果会很差,因为四张标定图如果缺了某一张就可能会乱飞。

所以我考虑了并实作了用稀疏光流法追踪法去辅助上面的单纯的标定识别法,

在四张标定图有任意一个没有识别到的情况下,就用稀疏光流追踪法去预测当前帧应该的位置,

参考关键点就从视频帧中的整张图上去选。

要使用 稀疏光流追踪主要就几个步骤:

第一步:针对要追踪的物体或者背景识别角点(关键点),关于这部分,我上一篇博客有介绍过角点检测的11种算法。

第二步:将前后两帧的统计出来的角点进行对比(cv::calcOpticalFlowPyrLK()),得到两帧的图像中物体的变换矩阵。

第三步:用这个变换矩阵去影响aruco标定法中未被识别到的矩阵点。

可以看下有加入稀疏光流追踪的改良版本视频效果:

结合物件追踪算法

本来想法是既然物件追踪算法OpenCV提供了12种,各有优劣,觉得一定有一种是最适合自己场景的。

我就逐一尝试了下各类内置的物件追踪算法,每一帧都来追踪,比较一下各类追踪算法追踪效果:

实际上发现追踪效果并不尽人意(视频只显示了4种算法,实际上我尝试了8种追踪算法,当时的视频没保存)。

基本上都不会完全达到需求中所说的移出镜头视角范围再移回来能持续被追踪,甚至未移出镜头视角范围内有些追踪算法都会跟丢。。。

这样的话不但起不到辅助的作用,甚至还会带偏原本稀疏光流法追踪和aruco的结果。

稀疏光流法的骚操作

尝试了很多追踪算法,都觉得不尽人意,为什么不死磕在稀疏光流法上呢?

既然它这么好用,如果被追踪的物体移出了镜头,想想为什么不在脱离镜头视角范围之外的瞬间改成环境的光流追踪,类似上一篇文章视频防抖那样,

然后一直将变换矩阵应用到脱离视角前最后一帧时的位置开始持续应用变换矩阵,使其在视角范围之外也能持续追踪,即使是在可见坐标范围外也一样能work。

既然想到了就这么实现了:

下图为追踪键盘上的品牌logo,调焦距放大镜头,使其键盘logo脱离视角范围外,再焦距回来,仍然可以接着原来的位置。

下图为追踪键盘上的Page Down按键

总结这种方法的缺点:

1. 被追踪的物体是允许移动的,并且移动在一定条件下也是可以持续被追踪到的,

但是要注意到的是移动的时必须在镜头视角范围内移动,如果是在背后视角外私底下动就没办法了。

2. 如果被追踪的物体移出镜头视角范围太长时间,视频移动太远距离,抖动太剧烈,也会不准确的。

OpenCV简单实现AR需用到的算法函数介绍的更多相关文章

  1. 如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可

    如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某几个角(小于4)为圆角而别的不变时 ...

  2. 一款非常好用的万能本地离线激活工具,支持Office2016、Office2015、Win7、Win8/8.1/10、Win2008/2012/R2系统,全自动安装且无需联网状态即可全部激活,它由国外网友heldigard制作,小巧、简单,只需运行而不用去管它自动激活,能自动激活为180天无限循环,欢迎大家下载使用

    office2016激活工具(KMS)是一款非常好用的万能本地离线激活工具,支持Office2016.Office2015.Win7.Win8/8.1/10.Win2008/2012/R2系统,全自动 ...

  3. iview简单使用+按需加载组件的方法(全局和局部)

    1,简单使用 vue项目中使用iview非常简单: 首先安装依赖: $ npm install iview --save 会安装最新版本的依赖,安装完成后package.json会出现如下图配置 表示 ...

  4. OpenCV:二值图像连通区域分析与标记算法实现

    http://blog.csdn.net/cooelf/article/details/26581539?utm_source=tuicool&utm_medium=referral Open ...

  5. OPENCV图像特征点检测与FAST检测算法

    前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...

  6. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  7. 简单地说, cpp中的纯虚函数就是抽象类的具体实现

    简单地说, cpp中的纯虚函数就是抽象类的具体实现.包含了纯虚函数的类就是抽象类.

  8. 总结几个简单好用的Python人脸识别算法

    原文连接:https://mp.weixin.qq.com/s/3BgDld9hILPLCIlyysZs6Q 哈喽,大家好. 今天给大家总结几个简单.好用的人脸识别算法. 人脸识别是计算机视觉中比较常 ...

  9. opencv 简单、常用的图像处理函数(2)

    opencv的项目以来配置和环境变量的配置都很简单,对于我这个没有c++基础的来说,复杂的是opencv的api和一些大部分来自国外没有翻译的资料,以及一些常见的编码问题. 资料 opencv 中文a ...

  10. openCV 简单实现身高测量(未考虑相机标定,windows)

    (一) OpenCV3.1.0+VS2015开发环境配置 下载OpenCV安装包(笔者下载3.1.0版本) 环境变量配置(opencv安装路径\build\x64\vc14\bin,注意的是x64文件 ...

随机推荐

  1. seaJS简介

    所有版本的 zip 包请在这里下载:seajs/tags 解压后,目录说明如下: dist -- sea.js 等压缩好的文件,直接可用 docs -- 使用文档 lib -- 给 Node.js 用 ...

  2. 力扣495(java)-提莫攻击(简单)

    题目: 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和提莫攻击的中 ...

  3. 13_总结Vue数据监测

    总结: Vue监视数据的原理:         1.vue会监视data中所有层次的数据         2.如何监视对象中的数据?             通过setter实现监视,且要在new V ...

  4. 力扣436(java&python)-寻找右区间(中等)

    题目: 给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 . 区间 i 的 右侧区间 可以记作区间 j ,并满 ...

  5. NICA 校际交流赛#2 游记

    \(1\!:\!15\) 到达考场,检测好网络和电脑. 分配任务,sxshm 打前 \(5\) 题,tcy01_QAQ_ 打 \(6,\!7\) 两题,我打后面的题. \(1\!:\!30\) 显得无 ...

  6. 技术揭秘:从双11看实时数仓Hologres高可用设计与实践

    ​简介:本文将会从阿里巴巴双11场景出发,分析实时数仓面临的高可用挑战以及针对性设计. 2021年阿里巴巴双11完美落下为帷幕,对消费者来说是一场购物盛宴,对背后的业务支撑技术人来说,更是一场年度大考 ...

  7. 大模型 RAG 是什么

    大模型 RAG(Retrieval-Augmented Generation)是一种结合了检索(Retrieval)与生成(Generation)能力的先进人工智能技术,主要用于增强大型语言模型(LL ...

  8. [GPT] php查询mongo,触发了 operation exceeded time limit

      "operation exceeded time limit"错误通常意味着查询所需的时间超过了MongoDB实例配置的操作超时限制. 这可以是由于查询需要处理大量数据或没有正 ...

  9. [FAQ] Error occured while trying to proxy to: xx.xx.x.xx:xx/xx

    遇到这种情况,要知道证明访问并未到达指定的服务地址. 可能原因有未启动.端口占用 等等,请逐一排查. Tool:ChatAI Refer:Proxy_Error Link:https://www.cn ...

  10. dotnet C# 通过 Vortice 使用 Direct2D 特效入门

    本文将告诉大家如何通过 Vortice 使用 D2D 的特效 本文属于 DirectX 系列博客,更多 DirectX 和 D2D 以及 Vortice 库的博客,请参阅我的 博客导航 上一篇: Di ...