INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析

2023-05-16

文章目录

  • 一.OpencCV 4.0 新特性介绍
          • 首先是OpenCV完全支持了C++ 11
          • DNN(深度神经网络)模块是目前OpenCV更新最重要的模块
          • G-API 为算法的硬件优化加速提供计算图支持
          • Objdetect新增 QR 码的检测和解码
          • 实现了流行的 Kinect Fusion 算法
          • 非常高效且高质量的 DIS 密集光流算法已经从 opencv_contrib 转移到 opencv/video 模块
  • 二.Opencv 4.0 安装
  • 三.DIS 光流
          • 1.DIS光流介绍
          • 2.DIS光流调用流程
          • 3.Dis光流结果
          • INDEMIND双目视觉惯性模组运行DIS光流算法
  • 四.关于INDEMIND

在OpenCV 3.0发布至今三年半的时间中,经过 Alpha、Beta、RC等版本的打磨,OpenCV 4.0终于正式来袭,为我们带来很多新特性。这些新特性具体会为OpenCV带来怎样的提升?在实际使用情况下表现如何?INDEMIND在接下来的一段时间中将带大家一一解析,如有不实之处,敬请指正。

一.OpencCV 4.0 新特性介绍

首先是OpenCV完全支持了C++ 11

由于OpenCV 最开始开发时的语言是 C,导致许多模块无法利用 C++ 11 的良好特性,OpenCV 4.0 版本的一个重要使命就是去除 C 语言风格的接口,使其完全支持 C++ 11。

  1. 大量从 OpenCV 1.x 遗留的 C 语言风格的 API 接口被删掉,主要影响的模块是 objdetect, photo, video, videoio, imgcodecs, calib3d。

  2. 在 core 模块中的持久化(在 XML,YAML 或 JSON 中存储和加载结构化数据)已完全用 C ++ 重新实现,并去除了相应的 C 风格的接口。 目前,base64 支持尚未完成(仅支持加载 base64 编码的 XML 和 YAML,还未支持编码)。 现在,存储在 FileNode 中的序列的随机访问是 O(N) 操作; 使用 cv :: FileNodeIterator 能够更快地进行顺序访问, 速度上,FileStorage 的加载比以前的实现少了 3-6 倍的内存!

DNN(深度神经网络)模块是目前OpenCV更新最重要的模块
  1. 增加 Mask-RCNN 模型支持。

  2. 集成 ONNX 解析器。 支持多个流行的分类网络。 部分支持 YOLO 对象检测网络(YOLO 的 ONNX 版本缺少一些提供矩形列表的最终图层)。

  3. 通过引入 Intel DLDT 改进 DNN 模块速度。

  4. API 更改:默认情况下,blobFromImage 方法不会交换 R 和 B 通道,也不会对输入图像进行裁剪。 而且,此 API 更改也已添加到 OpenCV 3.4 分支。

  5. 为不支持 OpenCL 而支持 Vulkan 的硬件平台添加了实验性质的 Vulkan 后端(还在开发中!不建议大家使用)。

  6. 为 OpenCV 支持的最流行的深度学习网络添加了快捷方式。 可以通过指定模型的别名,跳过预处理参数甚至模型的路径!

  7. 修复了 AMD 和 NVIDIA GPU 上的 OpenCL 加速。 现在,可以为模型启用 DNN_TARGET_OPENCL,开启 OpenCL 支持。 请注意,DNN_TARGET_OPENCL_FP16 仅在英特尔 GPU 上进行测试,因此仍需要额外的 flags。

G-API 为算法的硬件优化加速提供计算图支持

opencv_gapi 是全新添加的模块,它是非常有效的图像处理引擎。开发者可以在程序中定义多个图像处理步骤组成的图,执行的时候进行优化,使得 fast and portable。

Objdetect新增 QR 码的检测和解码

这个功能在移动端几乎成为 APP 的标配了

实现了流行的 Kinect Fusion 算法

并针对 CPU 和 GPU(OpenCL)进行了优化,集成到 opencv_contrib / rgbd 模块中。
为了使实时采集处理更高效,在 opencv / videoio 模块中更新了 Kinect 2 支持。 在 4.0 beta
版本中,iGPU 的代码已经加速,在高分辨率的情况下(512x512x512 integration volume),性能提升了 3 倍。

非常高效且高质量的 DIS 密集光流算法已经从 opencv_contrib 转移到 opencv/video 模块

本次光流模块的更新是个亮点,毕竟之前OpenCV的光流模块相比学术界的最新成果实在显得太弱了。[1]

新版OpenCV 4.0更加聚焦图像处理基础功能和深度学习模块,尤其是DIS光流算法的更新,算是补足了光流算法落后的短板,然而DIS算法表现怎么样,我们不妨让事实说话。

注:本次DIS光流算法分析基于OpenCV测试集以及INDEMIND双目视觉惯性模组运行DIS算法实测。

二.Opencv 4.0 安装

首先,我们要安装OpenCV 4.0,具体操作如下:https://opencv.org/releases.html

  1. 下载最新的opencv 4.0.0地址如下:
    如图所示,选择Sources

  2. 解压下载的压缩包。从源码安装opencv4.0.0

a)安装openv依赖性。

 sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

b) Cmake 配置opencv,运行命令如下:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

初次安装opencv可以选择/usr/local,对于电脑中已经有opencv的,可以选择其他安装目录。

c) 运行Make 和 Make install

三.DIS 光流

1.DIS光流介绍

光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”。光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的“运动”。研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。

光流法的前提假设:

(1)相邻帧之间的亮度恒定;

(2)相邻视频帧的取帧时间连续,或者,相邻帧之间物体的运动比较“微小”;

(3)保持空间一致性;即,同一子图像的像素点具有相同的运动 [2]

DIS 光流算法是Dense Inverse Search-basedmethod的简称,于2016年由Till Kroeger等人提出的一种在光流质量和计算时间中取得平衡的算法。

主要包含3个方面:

(1)基于块对应关系的逆搜索
(2)沿着多尺度做图像块的聚合从而获得稠密的光流场
(3)精细化搜索。精细化搜索。

DIS算法最大的优点在于运算速度的提升,在单核cpu上,1024*436分辨率可以达到300Hz-600Hz运行速率;包含图像预处理,例如平滑,缩放,梯度计算等运行速度能达到42/46 Hz,完全满足实时的需求。

运行时间及效果对比图如下:

图片摘自《Fast Optical Flow Using Dense InverseSearch》
Figure 1: Our DIS method runs at 10Hz up to 600Hz on a single coreCPUforanaverageend-pointpixelerrorsmallerorsimilarto top opticalflow methods at comparable speed. This plot excludes preprocessing time for all methods. Details in§3.1,3.3.
在这里插入图片描述
[4] Figure 18: Exemplary results on Sintel (training) and error maps. In each block of 2 × 6 images. Top row, left to right: Our method for operating points (1)-(4), Ground Truth. Bottom row: Error heat maps scaled from blue (no error) to red (maximum ground truth flow magnitude), Original Image.[3]

具体详细信息,请查看《Fast Optical Flow Using Dense Inverse Search》原论文。

2.DIS光流调用流程

Dis光流算法在OpenCV 4.0中被集成到video模块中。

调用

Ptr<DenseOpticalFlow> algorithm = DISOpticalFlow::create(DISOpticalFlow::PRESET_MEDIUM);
algorithm->calc(prevgray, gray, flow);

流程图如下:


在这里插入图片描述

3.Dis光流结果

说明:将光流场转换到HSV空间中显示,光流的数值用不同颜色来区分,色斑颜色深浅代表运动速率,白色代表物体无运动。

图像说明:左侧彩图为原始图像,白色背景图像为HSV空间显示,蓝色背景图像为HSV空间显示叠加原始图像。

为了充分测试DIS光流算法,我们对比了Farneback 光流算法在不同的纹理和光照下的结果。

本次的demo所用的测试集为:opencv 中的samples/data/vtest.avi。这个demo前景和背景的纹理都较为丰富。

在这里插入图片描述
如上图所示,Dis光流算法背景纯白无光斑,说明算法对纹理丰富的背景区域或无运动区域处理的更好。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在光流算法中,图像中的同一移动物体的速度应该一致,对应的色斑应是一致或平滑渐变,而Farneback 光流算法光斑却出现了突变,证明DIS光流算法对图像运动物体处理更精确。
在这里插入图片描述
如图,图像中行人路过路灯时,Farneback 光流算法将路灯识别成了移动物体,DIS光流算法并未出现类似错误,证明DIS光流算法对移动物体于固定物体叠加状态处理更精准迅速。

总结:

在纹理丰富场景,OpenCV 4.0中DIS光流算法对运动物体检测精准流畅,行人色斑一致顺畅,复杂场景(运动与固定物体重叠)无明显错误,达到了实用标准,比Farneback 光流算法表现更好。

INDEMIND双目视觉惯性模组运行DIS光流算法

说明:本Demo演示Dis光流算法与Farneback 光流算法在前景和背景纹理都较弱(天空部分无纹理),效果如下:

在这里插入图片描述
从Demo中可以看出, DIS光流算法对天空无文理、地面弱文理等场景支持不足,出现了大量混乱光斑,实用效果不及Farneback 光流算法。建议各位在使用OpenCV 4.0应对弱纹理场景时,使用Farneback 光流算法。

关于DIS光流算法的介绍到这里先告一段落,接下来INDEMIND将为大家带来更多OpenCV 4.0的新特性解析验证,敬请关注。

四.关于INDEMIND

INDEMIND是一家专注于计算机视觉技术研发与嵌入式计算平台研发的人工智能公司,行业领先的计算机视觉方案提供商。研发团队结合自身在计算机视觉技术上的优势,研发了包含空间感知、环境语义、多传感器融合等算法的软硬件全栈技术方案,推出了双目视觉惯性模组、环境感知视觉前端计算平台,以满足智能摄像头、机器人及穿戴计算等行业的感知计算需求。

参考资料:
[1] 周强.千呼万唤始出来!OpenCV 4.0正式发布!.2018-11-22
[2] jobbofhe.光流法简单介绍.2018-5-25
[3]Kroeger,T&R.Timofte&D.X.Dai&L.V. Gool. Fast Optical Flow Using Dense Inverse Search [J] .2016-09-17
[4]Kroeger,T&R.Timofte&D.X.Dai&L.V. Gool. Fast Optical Flow Using Dense Inverse Search [J] .2016-09-17

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析 的相关文章

  • (超详细)零基础如何学习操作系统---操作系统书籍推荐

    直接先给出路线书籍 编码 隐匿在计算机软硬件背后的语言 汇编语言 x86从实模式到保护模式 操作系统导论 操作系统真象还原 查漏补缺 1 编码 隐匿在计算机软硬件背后的语言 对于完全不懂计算机的朋友 xff0c 这本书可以让你对计算机有一个
  • 多种形式ICP问题的ceres实例应用

    一家之言 xff0c 仅作分享 xff0c 如有不合理或需要改进的地方 xff0c 欢迎各位讨论 ICP方法主要解决空间点云3D 3D的运动估计问题 xff0c 已知 xff1a t 1 t 1 t 1 和
  • git配置以及git-cola使用教程

    git安装 打开终端 xff0c 输入sudo apt get install git git配置 配置用户名 git config global user name 34 user name 34 配置邮箱 git config glob
  • C++ 手撸简易服务器

    本文使用上一期写的反射类 xff0c 另外我发现 lt WinSock2 h gt 这个头文件里有RegisterClass 这个结构 xff0c 还有typedef RegisterClass RegisterClassW这句话 这都能重
  • STM32CubeMX实战教程(一)——软件入门

    软件入门 前言新建工程界面简介MCU外设配置时钟树工程设置工具生成代码代码分析main cgpio cstm32f4xx it c 程序下载现象 结语 前言 STM32Cube 是一个全面的软件平台 xff0c 包括了ST产品的每个系列 平
  • STM32F4 | 定时器中断实验

    文章目录 一 STM32F429 通用定时器简介二 硬件设计三 软件设计四 实验现象五 STM32CubeMX 配置定时器更新中断功能 这一章介绍如何使用 STM32F429 的通用定时器 xff0c STM32F429 的定时器功能十分强
  • 相机标定和ORBSLAM2/VINS测试

    目录 一 相机标定1 1 标定目的1 2 常见模型介绍1 2 1 相机模型1 2 2 畸变模型 1 3 双目标定1 3 1 常见标定工具及对应使用场景1 3 2 Kalibr标定1 3 3 opencv双目标定1 3 4 basalt标定
  • matlab安装教程

    MATLAB xff08 矩阵实验室 xff09 是MATrix LABoratory的缩写 xff0c 是一款由美国The MathWorks公司出品的商业数学软件 MATLAB是一种用于算法开发 数据可视化 数据分析以及数值计算的高级技
  • 软件工程结构化分析

    需求分析的概念 需求分析是软件定义时期的最后一个阶段 xff0c 它的基本任务是准确的回答 系统必须做什么 这个问题 也就是对目标系统提出完整 准确 清晰 具体的要求 在需求分析阶段结束之前 xff0c 系统分析员应该写出软件需求规格说明书
  • 树莓派忘记密码 vnc登陆显示‘No configured security type is supported by 3.3 viewer’的问题解决办法

    树莓派忘记密码以及部署VNC 1 修改密码 需求你的树莓派有屏幕 xff0c 没有屏幕的可以百度其他解决方案了一把键盘 树莓派吃灰了很久 xff0c 最近由于有新的需求 xff0c 就拿出来玩耍一下 首先是第一个问题 xff0c 如何查看i
  • imx6ull 正点原子设备树适配韦东山的开发板 (一)顺利启动,配置led,button

    设备树在公司经常用到 有时候很多驱动编写也就是替换设备树 所以拿韦老师的板子练手设备树 这次尝试直接拿正点的设备书改成韦老师的板子能用 对比 正点原子的设备树结构图 韦东山的设备树结构图 从因为蓝色的是开发板厂商对开发板自己的优化 所以我们
  • 一文了解目标检测边界框概率分布

    一文了解目标检测边界框概率分布 概率建模 众所周知 xff0c CNN的有监督学习通常是建立在给定训练数据集之上的 xff0c 数据集的标签 也称为GT xff0c 决定了人类期望模型学习的样子 它通过损失函数 优化器等与CNN模型相连 因
  • Kalibr安装教程

    系统 xff1a Ubuntu18 04 首先 xff0c 需要安装好gcc g 43 43 cmake ros xff0c 如果没有 xff0c 可使用如下命令一键安装 sudo apt get install gcc g 43 span
  • 程序员:每一份不忘初心的情怀, 都是对技术的追求

    1 真正的情怀 xff0c 是从不矫情 这几年 情怀 大约快成了贬义 创业讲情怀 xff0c 产品讲情怀 xff0c 好像没点情怀都不好意思出门见人 我们曾经充满热情 xff0c 是一位开源软件倡导者 xff0c 我们崇尚全栈工程师才有未来
  • HTML代码简写方法

    原文链接 xff1a HTML代码简写方法 大写的E代表一个HTML标签 1 E 代表HTML标签 2 E id 代表id属性 3 E class 代表class属性 4 E attr 61 foo 代表某一个特定属性 5 E foo 代表
  • Git远程分支

    远程分支 远程分支是位于远程仓库的分支 xff0c 我们通常会用远程分支来更新本地分支 xff0c 然后在本地进行修改 xff0c 最后将修改的结果同步到远程分支上 除此之外 xff0c 我们还需要搞清楚远程跟踪分支和跟踪分支的概念 远程跟
  • STM32F4 | PWM输出实验

    文章目录 一 PWM 简介二 硬件设计三 软件设计四 实验现象五 STM32CubeMX 配置定时器 PWM 输出功能 上一章 xff0c 我们介绍了 STM32F429 的通用定时器 TIM3 xff0c 用该定时器的中断来控制 DS1
  • 基于大疆RM3508电机的串级PID(角度环+速度环)

    1 前言 最近参加ROBOCON xff0c 我负责编写传球机器人 xff0c 由于传球机构需要一个电机转固定角度来带动球 xff0c 所以便用大疆3508电机通过串级PID来实现 xff0c 不得不说3508电机还是真的强 xff0c 先
  • ROS三种通信方式之服务通信

    一 服务通信的理论模型 服务通信也是ROS中一种极其常用的通信模式 xff0c 服务通信是基于请求响应模式的 xff0c 是一种应答机制 也即 一个节点A向另一个节点B发送请求 xff0c B接收处理请求并产生响应结果返回给A 就像是服务器
  • 滑模控制理论(SMC)

    滑模控制理论 Sliding Mode Control SMC 滑膜控制理论是一种建立在现代控制理论基础上的控制理论 xff0c 其核心为李雅普诺夫函数 xff0c 滑膜控制的核心是建立一个滑模面 xff0c 将被控系统拉倒滑模面上来 xf

随机推荐

  • ROS OpenRAVE 常用逆解库 ikfast (应用于UR机械臂)

    ArmKine cpp include 34 armKine h 34 include lt math h gt include lt stdio h gt include lt corecrt math defines h gt defi
  • Fast and High Quality Image Denoising via Malleable Convolution阅读笔记

    论文 xff1a Fast and High Quality Image Denoising via Malleable Convolution arXiv xff1a https arxiv org abs 2201 00392 Abst
  • 浅谈java继承机制——通过super调用父类方法

    最近在看代码的时候遇到一个天坑 xff0c 由于习惯性思维 xff0c 可能大部分人都会掉近这个坑 xff0c 所以拿出来记录一下 子类使用super调用的父类方法里 xff0c 再调用父类的方法 先来看一段代码 xff08 该段代码只是作
  • ORB_SLAM2运行KITTI数据集

    在前文我们已经安装运行了ORB SLAM2 xff0c 下载和编译 xff08 包括报错 xff09 在文章 xff1a ORB SLAM2下载编译及运行EuRoC数据集 浅梦语11的博客 CSDN博客 euroc数据集下载 并且我们使用运
  • 嵌入式学习札记(基于STM32L431) 一、ARM Cortex-M4微处理器

    ARM Cortex M4微处理器 写在前面ARM Cortex M4微处理器简介ARM Cortex M4微处理器内部结构概要位数总线结构中断控制存储器保护低功耗内部寄存器 寻址方式与机器码获取方法指令保留字简表与寻址方式指令保留字简表寻
  • 嵌入式 Linux平台 C程序 交叉编译技术

    嵌入式Linux平台C程序交叉编译技术 一 实验目的和任务 本实验要求复习和掌握Linux平台的C程序开发过程 本实验要求掌握嵌入式开发板的操作方法 本实验要求掌握Linux平台交叉编译方法和程序运行方法 二 实验设备介绍 B703实验室是
  • MapReduce编程综合应用

    MapReduce编程综合应用 实验环境 VMware虚拟机 xff08 CentOS 7系统 xff09 Hadoop 数据 现有一份汽车销售记录 xff0c 销售记录 包括时间 地点 邮政编码 车辆类型等信息 xff0c 每条记录信息包
  • MySQL报错1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 解决方法

    1 问题复现 xff1a 今天在进行数据迁移时 xff0c 使用Navicat连接数据库进行连接时 xff0c 由于 SQL语句中使用了 group by分组函数 xff0c 结果报了如下错误 xff1a 2 产生原因 产生原因说是 xff
  • deepin linux 安装配置

    开启root权限 span class token function sudo span span class token function su span root 开启root权限 linux安装curl span class toke
  • 解决Ubuntu1804安装后不能使用root用户远程登录

    解决Ubuntu1804安装后不能使用root用户远程登录 root用户密码正确无法远程 解决方法 1 为root用户设置密码 span class token function sudo span span class token fun
  • git 删除本地/远程分支

    1 删除本地分支 git branch d 本地分支名A 注意 xff1a 需要切换到其他分支下才能删除 xff0c 处于分支A的时候 xff0c 无法删除分支A 切换分支git checkout 本地分支名B 如果本地分支A下有未合并的更
  • RTD\RTK\PPK\PPP\DGPS\地基增强系统\星基增强系统

    xff08 一 xff09 RTD xff08 Real Time Differential xff09 xff1a 实时动态码相位差分技术 RTD计算的是伪距 xff0c 根据基准站已知坐标和各卫星的坐标 xff0c 求出每颗卫星每一时刻
  • NVIDIA JETSON TX2 介绍及上电、刷机全纪录

    一 TX2相关 1 1 图片 1 2 TX2介绍 xff1a NVIDIA Jetson TX2 嵌入式领域的AI超级电脑 它是一台基于NVIDIA Pascal 架构的AI单模块超级计算机 它性能强大 xff0c 外形小巧 xff0c 节
  • 小白控制算法之自抗扰调参经验总结

    最近做的项目用到了自抗扰 xff0c 尝试联系一些相关领域的老师 xff0c 无奈似乎有所保留 xff0c 只得自己从头研究起 讲道理 xff0c 无论是复杂的系统 xff0c 还是超过9个参数的调节 xff0c 整个调程序和调参的过程都不
  • DS001-测试冒泡排序的运行时间

    本程序演示如何测试一段程序的运行时间 以冒泡排序算法为例 include 34 time h 34 与时间相关的函数 include 34 stdlib h 34 rand 函数在此库中 include 34 stdio h 34 输入输出
  • 嵌入式开发,裸机开发,中断,按键控制蜂鸣器。

    0 前言 最近想体验一下面试 xff0c 真正收到公司通知又有点无从下手 xff0c 没有做准备 但是反手一想 xff0c 既然是想体验 xff0c 锻炼而已 xff0c 干就完了 推荐一首歌 Timber MattyBRaps xff0c
  • 到底什么是MCU、MPU、CPU,和芯片是什么关系?区别又是什么?

    目录 0 前言 1 芯片 2 CPU 3 MPU 4 MCU 5 总结 0 前言 更新的是有点慢 xff0c 从这周开始吧 xff0c 应该会快一点 推荐一首歌 你到底有没有爱过我 蓝波 xff0c 额 xff0c 怎么说呢 xff0c 大
  • 从SLAM到视觉识别、VIO,大牛分享!

    用户分享汇总目录 01 双目惯性模组的初探与实践02 通过驱动字写数据采集程序03 INDEMIND双目惯性相机运行MSCFK04 利用开源识别算法进行车牌检测05 双目惯性模组导航项目分享项目简介 xff1a 车体结构 xff1a 技术简
  • zxing的使用及优化

    二维码介绍 zxing项目是谷歌推出的用来识别多种格式条形码的开源项目 xff0c 项目地址为 https github com zxing zxing xff0c zxing有多个人在维护 xff0c 覆盖主流编程语言 xff0c 也是目
  • INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析

    文章目录 一 xff0e OpencCV 4 0 新特性介绍首先是OpenCV完全支持了C 43 43 11DNN xff08 深度神经网络 xff09 模块是目前OpenCV更新最重要的模块G API 为算法的硬件优化加速提供计算图支持O