前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >opencv光流预测和remap重映射函数使用

opencv光流预测和remap重映射函数使用

原创
作者头像
languageX
修改于 2021-06-05 09:54:45
修改于 2021-06-05 09:54:45
5.8K0
举报
文章被收录于专栏:计算机视觉CV计算机视觉CV

光流

optical flow (光流) 表示的是相邻两帧图像中每个像素的运动速度和运动方向。

假设我们有如下光流的颜色空间表示:

光流颜色空间表示
光流颜色空间表示

再假设整个图片中物体均向左上移动,那么可以得到如下的光流图。

光流法

光流法就是通过检测图像像素点的强度随时间的变化进而推断出物体的光流的方法。

今天主要介绍opencv中计算光流接口cv2.calcOpticalFlowFarneback的使用,以及如果已知当前帧和预测光流,我们如何通过重映射cv2.remap得到预测图像的方法。

cv2.calcOpticalFlowFarneback函数

cv2.calcOpticalFlowFarneback是opencv中使用Gunnar Farneback算法计算稠密光流的函数。

算法论文:https://www.ida.liu.se/ext/WITAS-ev/Computer_Vision_Technologies/Papers/scia03_farneback.pdf

flow = cv2.calcOpticalFlowFarneback(prev, next, flow, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags)

函数参数:

  • prev:当前帧图像,单通道图像,彩色图像通常需要使用cv2.COLOR_BGR2GRAY
  • next:下一帧单通道图像,大小和prev一致
  • flow: 计算的光流图,和prev大小一致,CV_32FC2类型;
  • pyr_scale: 金字塔上下两层之间的尺度关系,该参数一般设置为pyrScale=0.5,表示图像金字塔上一层是下一层的2倍降采样
  • levels:图像金字塔的层数,levels = 1意味着不会创建额外的图层,只会使用原始图像。
  • winsize:平均窗口大小,winsize越大,算法对图像噪声越鲁棒,并且能提升对快速运动目标的检测效果,但也会引起运动区域模糊。
  • iterations:算法在图像金字塔每层的迭代次数
  • poly_n:用于在每个像素点处计算多项式展开的相邻像素点的个数。poly_n越大,图像的近似逼近越光滑,算法鲁棒性更好,也会带来更多的运动区域模糊。通常,poly_n=5 or 7
  • poly_sigma:用于平滑导数的高斯的标准偏差,用作多项式展开的基础,通常poly_n=5时,poly_sigma = 1.1;poly_n=7时,poly_sigma = 1.5
  • flags:可选参数值OPTFLOW_USE_INITIAL_FLOW 和 OPTFLOW_FARNEBACK_GAUSSIAN

函数使用:

代码语言:txt
AI代码解释
复制
i_t0 = cv2.imread("1_t0.jpg")
i_t1 = cv2.imread("1_t2.jpg")
g_i_t0 = cv2.cvtColor(i_t0, cv2.COLOR_BGR2GRAY)
g_i_t1 = cv2.cvtColor(i_t1, cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(g_i_t0, g_i_t1, None, 0.5, 3, 15, 3, 5, 1.1, 0)

这样就计算出flow01的光流,注意这里计算的是反向光流,光流方向:左正右负,上正下负。上面代码计算出是从t1到t0的光流,整体向右下运动,光流图橘色,对应光流值为负值。

假设我们得到了光流flow,就可以通过t0的图像和flow,来预测t1时刻的图像。这里需要使用remap重映射函数。

cv2.remap函数

cv2.remap是opencv的重映射函数

cv2.remap(src, map1, map2, interpolation, borderMode, borderValue )

  • src: 代表原始图像
  • map1:表示(x,y)点的一个映射点或者仅表示(x,y)点的x值
  • map2:如果map1表示(x,y)的映射值,map2为空,否者表示(x,y)点的y值
  • Interpolation: 插值方式
  • borderMode: 边界模式。当该值为 BORDER_TRANSPARENT时,表示目标图像内的对应源图像内奇异点( outliers)的像素不会被修改
  • borderValue: 代表边界值,默认为0

remap函数实际就是通过修改像素点的位置得到一幅新图像。我们要构建一个目标图像,就需要知道目标图像每个像素点在原始图像中的位置。由于map得到的是float,所以可能映射到多个坐标之间的位置,而且新图像的大小也可能变化,所以参数中有个插值方法。

remap在图像变形,图像扭曲等应用中都会用到。

在本文中,我们通过上文已经有前一帧的图像数据,又有了图像的光流数据,就可以得到map。再通过重映射就可以通过光流预测恢复出下一帧的数据。

使用代码:

代码语言:txt
AI代码解释
复制
def cv_warp(input, flow):
    h, w = flow.shape[:2]
    warp_grid_x, warp_grid_y = np.meshgrid(np.linspace(0, w-1, w), np.linspace(0, h-1, h))
    flow_inv = flow + np.stack((warp_grid_x, warp_grid_y), axis=-1)
    flow_inv = flow_inv.astype(np.float32)
    warped = cv2.remap(input, flow_inv, None, cv2.INTER_LINEAR)
    return warped

目前也有许多使用深度学习来预测光流的模型,后续有时间进行介绍。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
vue的mixins的使用[通俗易懂]
2.在组件中引入这个mixins对象,通过mixins:[xxx],使用mixins对象
全栈程序员站长
2022/09/21
3450
vue的mixins的使用[通俗易懂]
引入vuejs文件_引入vue文件
<script src=”https://cdn.jsdelivr.net/npm/vue/dist/vue.js”></script>
全栈程序员站长
2022/11/09
2.9K0
vue项目引入外部原生js文件_php引入文件的四个方法
在开发Vue项目的时候,有时需要使用一些非ES6格式的没有export的js库,可以有如下方法实现:
全栈程序员站长
2022/11/10
4.6K0
vue怎么实现分页_vue实现表格
下面就是我的JS代码了,我设置当页码数为一时,上一页按钮被禁用,页数达到最后一页是,下一页按钮被禁用。具体代码如下所示:
全栈程序员站长
2022/11/15
7080
vue怎么实现分页_vue实现表格
vue父子组件传值props_vue子组件调用父组件的方法并传参
在做项目的时候常常有这样的一个情况,这个页面的数据(比如:id号)要带到另一个页面去查询某个数据的详情等,传统的做法是在url上加参数,cookie或者是在H5的“sessionStorage”和“localStorage”上赋值,这是页面之间传递的方法。
全栈程序员站长
2022/11/15
1.2K0
vue父子组件传值props_vue子组件调用父组件的方法并传参
vue路由懒加载的实现方式_vue-router路由模式
当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效
全栈程序员站长
2022/11/10
8010
vue路由懒加载的实现方式_vue-router路由模式
oncontextmenu 兼容[通俗易懂]
公司的网站内容都是一些专业性很强的内容,而且内容都是花钱买来的,所以不想让别人轻而易举的复制过去,就尝试使用js控制一下,但是找了很多js代码,都是不支持firefox,如下
全栈程序员站长
2022/11/03
1.1K0
Vue(renren-fast_vue_master)项目目录结构[通俗易懂]
打算做一个请假管理OA项目Demo,后端采用renren-fast框架,后台管理系统采用renren-fast_vue_master项目,打算利用renren-fast-vue-master改造成一个简单的请假管理系统,包含注册、登陆、请假流程查看等等简单的展示即可,由于之前没做过Vue,现简单地介绍下项目目录结构:
全栈程序员站长
2022/11/17
6590
Vue(renren-fast_vue_master)项目目录结构[通俗易懂]
老男孩python课程_老男孩python课程[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/01
8120
Vue 分页器组件[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/14
6110
vue引入外部js文件并使用_为什么vue不使用ajax
在一个组件内部需要引入一个js文件,如果放在index.html,每个组件都会有这个js,所以需要在组件内单独引入。
全栈程序员站长
2022/11/10
2.7K0
vue引入外部js文件并使用_为什么vue不使用ajax
Vue.js – 引入外部 JS 文件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
41.6K1
vue.js单页应用_vue嵌入第三方页面
今天我们看看VUE怎么开发单页面应用,VUE提供了脚手架vue-cli,通过这个可以很轻松的创建VUE单页面应用,
全栈程序员站长
2022/11/04
1.4K0
vue.js单页应用_vue嵌入第三方页面
Vue引入外部Js文件并使用方法超级无敌详细的教程「建议收藏」
使用新的js文件里面的一个方法,提高复用性。 步骤: 1):在新的js文件中写入新方法,如:
全栈程序员站长
2022/11/09
8.9K0
vue如何引用外部js_引入外部js文件
在Vue中,通常我们引入一个js插件都是使用npm 方式下载然后import使用的。但是我现在本地有了js文件或者是一个远程js文件链接,我不想使用npm install xxx 的方式,有什么办法吗?
全栈程序员站长
2022/11/09
13.5K0
Thymeleaf contextPath(无废话)[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
4510
在网页文档中引入Vue.js的方法有哪些?_vue直接引入js文件没有用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
2.7K0
闪闪发光的文字特效代码[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/02
1.2K0
vue项目封装组件_前端组件封装
在使用vue进行日常开发的时候,组件的封装是一个很常规的操作,也可以从npm仓库下载别人封装好的组件来使用,比如iview,element ui等…但每个项目的应用场景不同,所以我们有时也需要自己封装组件。而如果在开发中换了项目,那么就只能复制代码过去,略显麻烦,这个时候呢,可以将封装好的组件上传到npm仓库,需要使用时就可以直接通过npm指令下载,非常方便。
全栈程序员站长
2022/11/09
1.6K0
vue项目封装组件_前端组件封装
vue引入js文件并使用_css引入js
import allinfo from “../../../../static/js/allinfo .js”;
全栈程序员站长
2022/11/08
11.7K0
推荐阅读
相关推荐
vue的mixins的使用[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档