稀疏光流python_OpenCV4中DIS光流算法与应用

原标题:OpenCV4中DIS光流算法与应用

OpenCV4中新光流算法 - DIS光流

OpenCV中KLT稀疏光流算法与FB稠密光流算法都是十年前的算法,没有反应出光流算法的最新进展,这个跟OpenCV其它模块相比,光流算法模块的更新明显滞后、OpenCV4发布终于把DIS光流算法包含到正式的发布版中。相对于FB光流基于多项式实现光流移动估算,DIS光流采用反向搜索与梯度下降寻求最优化来解决移动估算,不但降低了计算量、而且提升了精准度与实时性能。是一种可以实时运行的视频运动分析算法。

DIS光流算法

01

DIS(稠密逆搜索)光流算法主要有三个核心部分组成

对应关系的快速逆搜索

多尺度推理的快速光流

快速的变分求精

以前的FB光流基于多项式方式,是基于像素级别的光流估算、非常耗时、这里作者提出基于块级别的相关性反向搜索,实现一次计算梯度,多次反向搜索使用,不用每次重新初始化计算梯度,节省了大量计算,从而提高了性能。基于网格化实现反向搜索、稠化光流与优化。完整的流程如下:

db098448dbd54b059b4c936fbb729afb.png

运行效果

3dd77998e88e417ea79e8b97fce9261d.jpeg

OpenCV中的代码演示

02

创建DIS光流实例与调用计算光流

C++版本

Ptr algorithm = DISOpticalFlow::create(DISOpticalFlow::PRESET_FAST);

algorithm->calc(preGray, gray, flow);

Python版本

dis= cv.DISOpticalFlow_create(1)

flow= dis.calc(prvs,next, None,)

这里创建DIS支持三种计算方式如下:

PRESET_ULTRAFAST= 0,

PRESET_FAST= 1,

PRESET_MEDIUM= 2

主要的区别选择不同的算法迭代优化测次数不一样、计算耗时也不一样。运行效果如下:

3b56410b325046b9a005567fc162e885.jpeg

facd570306ca49c38350913677d76d65.png

完整的python版本演示代码

import cv2 as cv

import numpy as np

cap = cv.VideoCapture( "D:/images/video/vtest.avi")

# https://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/

ret, frame1 = cap.read

prvs = cv.cvtColor(frame1,cv.COLOR_BGR2GRAY)

hsv = np.zeros_like(frame1)

hsv[ ..., 1] = 255

dis = cv.DISOpticalFlow_create

while( 1):

ret, frame2 = cap.read

next= cv.cvtColor(frame2,cv.COLOR_BGR2GRAY)

flow = dis.calc(prvs, next, None,)

# flow = cv.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0)

mag, ang = cv.cartToPolar(flow[ ..., 0], flow[ ..., 1])

hsv[ ..., 0] = ang* 180/np.pi/ 2

hsv[ ..., 2] = cv.normalize(mag,None, 0, 255,cv.NORM_MINMAX)

bgr = cv.cvtColor(hsv,cv.COLOR_HSV2BGR)

cv.imshow( 'result',bgr)

cv.imshow( 'input', frame2)

k = cv.waitKey( 30) & 0xff

ifk == 27:

break

elif k == ord( 's'):

cv.imwrite( 'opticalfb.png',frame2)

cv.imwrite( 'opticalhsv.png',bgr)

prvs = next

cap.release

cv.destroyAllWindows

说实话,明显比FB与KLT光流法都要速度快,效果也是很好,DIS光流必须有!返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解关于稀疏光流Python OpenCV 应用和使用方法是吗?那么我可以简单地为您介绍一下。 稀疏光流是一种计算图像像素运动的方法,它可以通过检测两个连续帧之间的像素强度变化来计算像素的运动向量。Python OpenCV提供了实现稀疏光流的函数 cv2.calcOpticalFlowPyrLK()。 以下是一个简单的示例代码,演示了如何使用稀疏光流来计算两个连续帧之间的像素运动: ``` import cv2 # 读取两个连续帧 frame1 = cv2.imread('frame1.jpg') frame2 = cv2.imread('frame2.jpg') # 转换为灰度图像 gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) # 设置参数 lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # 获取关键点 p0 = cv2.goodFeaturesToTrack(gray1, mask=None, maxCorners=100, qualityLevel=0.3, minDistance=7) # 计算光流 p1, st, err = cv2.calcOpticalFlowPyrLK(gray1, gray2, p0, None, **lk_params) # 选择好的点 good_new = p1[st == 1] good_old = p0[st == 1] # 绘制运动向量 for i, (new, old) in enumerate(zip(good_new, good_old)): a, b = new.ravel() c, d = old.ravel() frame1 = cv2.circle(frame1, (a, b), 5, (0, 255, 0), -1) frame1 = cv2.line(frame1, (a, b), (c, d), (255, 0, 0), 2) # 显示结果 cv2.imshow('frame', frame1) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述示例代码,我们首先读取了两个连续帧,然后将它们转换为灰度图像。接下来,我们使用 cv2.goodFeaturesToTrack() 函数获取了第一帧的关键点,并将这些关键点作为稀疏光流的输入。然后,我们使用 cv2.calcOpticalFlowPyrLK() 函数计算了两个连续帧之间的稀疏光流。最后,我们选择好的点,并使用 cv2.circle() 和 cv2.line() 函数绘制了运动向量。 希望这个简单的示例代码可以帮助您更好地理解稀疏光流Python OpenCV 应用和使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值