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

时间:2024-03-26 18:38:47

在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地址如下:
    INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析

  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,完全满足实时的需求。

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

INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析
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.
INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析
[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);

流程图如下:


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

3.Dis光流结果

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

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

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

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

INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析
如上图所示,Dis光流算法背景纯白无光斑,说明算法对纹理丰富的背景区域或无运动区域处理的更好。

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

INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析
在光流算法中,图像中的同一移动物体的速度应该一致,对应的色斑应是一致或平滑渐变,而Farneback 光流算法光斑却出现了突变,证明DIS光流算法对图像运动物体处理更精确。
INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析
如图,图像中行人路过路灯时,Farneback 光流算法将路灯识别成了移动物体,DIS光流算法并未出现类似错误,证明DIS光流算法对移动物体于固定物体叠加状态处理更精准迅速。

总结:

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

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

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

INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析
从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