光流

传统光流

理论:
参考:https://blog.csdn.net/sgfmby1994/article/details/68489944

opencv中的实现和效果:https://www.bilibili.com/read/cv1761120/
在这里插入图片描述

光流法的使用场景和前提:
在这里插入图片描述
opencv的官方教程:https://docs.opencv.org/4.1.0/d2/d84/group__optflow.html
稀疏点光流:

#离散光流
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1=cv2.imread('08_1_2.jpg')
img1=img1[0:800,0:800,:]
img2=cv2.imread('09_1_2.jpg')
img2=img2[0:800,0:800,:]
feature_params=dict(maxCorners=100,qualityLevel=0.3,minDistance=7,blockSize=7)
lk_params=dict(winSize=(15,15),maxLevel=5,criteria=(cv2.TERM_CRITERIA_EPS|cv2.TERM_CRITERIA_COUNT,10,0.03))

color=np.random.randint(0,255,(100,3))
gray1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
mask=np.zeros_like(gray1)
mask[:,:]=1
p0=cv2.goodFeaturesToTrack(gray1,mask=mask,**feature_params)
gray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
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()
    cv2.line(img2,(a,b),(c,d),color[i].tolist(),10)
    cv2.circle(img2,(a,b),10,color[i].tolist(),-1)
    cv2.circle(img2,(c,d),20,color[i].tolist(),-1)
    

cv2.imwrite('1.jpg',img2)

效果:
大的点是使用cv2.goodFeaturesToTrack检测到的好的特征点,通过cv2.calcOpticalFlowPyrLK计算从img1->img2的光流(offset),计算到的位置用小的点表示

函数的参数含义:
lk_params=dict(winSize=(15,15),maxLevel=5,criteria=(cv2.TERM_CRITERIA_EPS|cv2.TERM_CRITERIA_COUNT,10,0.03))
在这里插入图片描述

特征金字塔层数:不能过大或过小。如果过小,即使在最顶层也不符合光流的假设(小运动),则预计的结果较差;如果太大,下采样倍数过多,则让图像过于模糊,特征点信息不对应。

稠密光流:

#稠密光流
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1=cv2.imread('08_1_2.jpg')
img1=img1[0:1000,0:1000,:]
img2=cv2.imread('09_1_2.jpg')
img2=img2[0:1000,0:1000,:]

hsv=np.zeros_like(img1)
hsv[...,1]=255
gray1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
flow=cv2.calcOpticalFlowFarneback(gray1,gray2,None,0.5,6,15,3,5,1.2,0)
mag,ang=cv2.cartToPolar(flow[...,0],flow[...,1],angleInDegrees=True)#把cart坐标系的x,y转为幅度和相位

hsv[...,0]=ang
hsv[...,2]=cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
rgb=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
plt.subplot(131),plt.imshow(img1)
plt.subplot(132),plt.imshow(img2)
plt.subplot(133),plt.imshow(rgb)
plt.savefig('res.png',dpi=300)

使用cv2.calcOpticalFlowFarneback计算两个点的稠密光流。
为了将计算的光流可视化,用颜色代表方向,亮度代表光流大小
在这里插入图片描述

参数含义:cv2.calcOpticalFlowFarneback
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值